Skip to content

Learnings

Durable, searchable memory of problems already solved — so the next task starts from what the last one taught instead of rediscovering it. This is Tempo's "compounding" layer: each non-trivial fix leaves a trace that planning reads before it plans.

Written by the find-learnings skill; read by find-untracked-work and build-sprint during their PLAN phase, and by anyone debugging a familiar smell.

Why markdown in the repo (not a vector DB)

Git-native, diffable, and already indexed by codegraph + grep — no second runtime, no embedding store to rebuild, survives the ephemeral web container because it's committed. A heavyweight semantic memory (e.g. mempalace) buys little for a single-user repo and costs an ops tail. Revisit only if this directory grows past the point grep can serve.

Entry format

One file per learning: YYYY-MM-DD-short-slug.md.

markdown
---
date: 2026-06-02
tags: [todoist, priority, off-by-one]
status: active          # active | graduated | archived
graduated_to:           # path in .claude/rules/ or CLAUDE.md, once promoted
---

# <one-line title — the trap, not the feature>

**Symptom** — what was observed (the failing test, the wrong output, the 500).

**Root cause** — the actual why, one or two sentences. No narration of the hunt.

**Fix** — what changed, with `file:line` or a commit SHA.

**Guard** — the test / rule / convention that now stops a regression. If this
hardened into a convention, say which rule file it belongs in.

Lifecycle

  • active — a live gotcha worth recalling.
  • graduated — recurred or hardened into a standing convention; promoted into .claude/rules/* or CLAUDE.md, and the entry's graduated_to points there. Keep the entry (it's the provenance); stop treating it as loose.
  • archived — the code it described is gone; kept only for history.

Run find-learnings with --refresh to sweep for entries to graduate or archive.

Index

<!-- Newest first. The find-learnings skill prepends here. -->