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'.
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.
Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks
Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.
Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files) for: (1) Creating new presentations, (2) Modifying or editing content, (3) Working with layouts, (4) Adding comments or speaker notes, or any other presentation tasks
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.
Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill.
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.
Take techygarg/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.