techygarg/lattice-learning-harvest
Manage the operational learnings lifecycle — load prior learnings to inform current work, harvest new patterns worth preserving, and keep the document tight over time. Provides a protocol for accumulating actionable patterns from practice that complement standards and defaults. Use when a workflow session completes and produced insights worth persisting, when starting a session that should benefit from prior patterns, or when the user says 'harvest learnings', 'what have we learned', 'capture this pattern', 'tighten learnings', 'compress learnings', or 'operational learnings'.
This is a copy. The original lives at techygarg/learning-harvest.
npx skills add https://github.com/techygarg/lattice --skill learning-harvest
Operational learnings are NOT rules. They are what you learn while applying rules.
| Standards (refiner output, atom defaults) | Operational Learnings (this document) |
|---|---|
| "Domain layer must not import from infrastructure" | "When adding a new aggregate, we keep forgetting to define the repository interface first — design interface before implementation" |
| "Functions should have single responsibility" | "Service classes that start small grow past 500 lines within 3 features — split by command type proactively at ~200 lines" |
| "Value objects must validate in constructor" | "Date range VOs without explicit inclusive/exclusive documentation cause boundary bugs every time — document semantics alongside validation" |
The standard is the rule. The operational learning is what we discovered while applying the rule on this project.
If an entry reads like a rule that should always be followed, it belongs in a standards document (run the relevant refiner). If it reads like "here's what we keep learning the hard way" or "here's an approach that keeps working for us" — it belongs here.
Patterns that recur frequently may graduate to standards via a refiner. That promotion path is part of the Tighten behavior.
.lattice/config.yaml for paths.operational_learnings.lattice/learnings/operational-learnings.mdBackward compatibility: If default path not found, check these legacy paths in order:
.lattice/learnings.md — flat file at root.lattice/learnings/review-insights.md — prior naming conventionIf found, offer migration to canonical path and format. If user declines, read as flat input. STOP: do not write to it.
# Operational Learnings
Experiential patterns from practice. Complements standards (what should be) with experience (what we keep learning).
## Design Patterns
<!-- Decomposition, architecture choices, scope decisions that proved good or bad -->
## Implementation Craft
<!-- Coding approaches, library gotchas, design-to-reality gaps -->
## Quality Signals
<!-- Recurring quality issues that keep appearing despite rules -->
## Reliability
<!-- Bug root causes, failure modes, fragile areas, boundary condition gaps -->
## Structural Health
<!-- Architectural drift, debt accumulation, coupling issues, migration lessons -->
Entry format: - YYYY-MM-DD [context] Pattern — actionable takeaway
context: type of session (e.g., "design", "implementation", "review", "bug fix", "refactoring"). Not a feature name — learnings are cross-cutting.Invoked at session start. Composing workflow passes a focus hint (relevant categories).
Active monitoring: Once loaded, maintain a silent harvest queue throughout the session. When a decision or trade-off passes the cross-cutting test below, add it to the queue. STOP: do not prompt immediately.
Cross-cutting test — a candidate must pass BOTH before queuing:
STOP: if either fails, skip entirely — do not queue.
Before queuing, check against entries loaded at session start. If the same pattern already exists — skip.
When to surface: Surface the queue as a single batch when EITHER condition is true — not at every level or layer:
STOP: do not surface at every individual level approval or component completion — that is over-prompting. Once surfaced, clear the queue. Anything remaining at session end goes to Harvest.
> "I noted [N] potential harvest candidates — worth a quick review?"
Mid-session interrupt (rare exception): surface a single pattern immediately, outside the queue, only when it would be impossible to reconstruct by session end — a live debate that resolved unexpectedly, a library gotcha caught mid-implementation. If in doubt, queue instead.
Session-end Harvest is the primary mechanism.
Invoked at session end. Composing workflow passes a session context (what kind of work happened).
Governing principle: STOP: the atom never writes autonomously. Session-end Harvest is the primary capture event — mid-session prompting is the exception.
Steps:
> Harvest candidates from this session:
> 1. [Category] — [pattern in one line]
> 2. [Category] — [pattern in one line]
>
> Accept, edit, add your own, or skip entirely.
Empty queue and nothing new found? Say so in one line. STOP: do not force output.
| Filter | Fail if... |
|--------|------------|
| Evidence | No concrete session event — just prior knowledge |
| Cross-cutting | Specific to this feature's domain, won't recur |
| Actionable | Requires this conversation's context to understand |
| Recurrence | No structural reason it will happen again |
Filter fails on a confirmed entry? Tell the user which filter — offer to reword. STOP: do not silently drop.
Invoked standalone only — Harvest may flag that tightening is due, but never launches it.
Before writing any entry, verify ALL. STOP: if any fails, do not write.
When invoked directly — not composed by a molecule — match the user's phrase to exactly one behavior. STOP: if ambiguous, ask — never guess.
| User says | Run |
|---|---|
| "tighten learnings", "compress learnings", "clean up learnings", "/learning-harvest tighten learnings" | Tighten Behavior |
| "harvest learnings", "capture this pattern", "log this learning" | Harvest Behavior |
| "what have we learned", "load learnings", bare "operational learnings" with no verb | Load Behavior |
STOP: if the phrase doesn't clearly map to one row, ask — "Load recent entries, harvest something new, or tighten the document?" — before running anything.
Take techygarg/lattice-learning-harvest from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.