PLAN.md— WHAT we build: idea, scope, phases, locked decisions, open questions. Rarely changes. New decisions append here once.PROGRESS.md— WHERE we are: status snapshot (date), Done / In progress / Pending, Next up (the handoff), session log table, reminders. Updated EVERY session, before anything closes.- Optional per-topic trackers (create when topic first matters, not upfront): tests checklist, UI/design state, backend/data, problem ledger. Each owns its topic; PROGRESS points to them, never duplicates them.
- Doc index (optional, grows late): one-line map of every doc + reusable artifacts. Exists to make future distillation trivial.
- Project config (optional, only for foreign layouts):
SKILL-CONFIG.mdin project root overrides snapshot path, history path, and gate command (template:templates/CONFIG.md). Missing file = defaults (PROGRESS.md + discovered gate).
Rules:
- One status home: PROGRESS snapshot. Trackers hold detail; PROGRESS holds pointer + verdict.
- Status words fixed: done / in-progress / pending / blocked. Same words everywhere.
- Dates on every snapshot and log row (
YYYY-MM-DD). "Recent" without a date is forbidden. - Update minimum: PROGRESS + session-log row every session; every other doc only when its subject changed (files added/moved, milestone moved, user-visible facts changed).
- Code repo (e.g.
MyApp/): app source only. Its.gitignoreexcludestesting/,metro.log, build dirs. Raw evidence never committed. - State repo (workspace root): PLAN + PROGRESS + trackers + problem ledger only. Its
.gitignoreexcludes every app folder (each app is its own repo) + reference/study folders. - Why separate: code history stays clean for builds; state history keeps full process record (decisions, test proof maps, lessons for future skills). Either can die without killing the other.
- Unpushable dirs need zip-if-changed: baseline lives in the state repo as
<dir>-BASELINE.md(the last fingerprint); fingerprint =git status --porcelain -- <dir>+git log -1 --format=%H -- <dir>; identical → NO ZIP; changed → zip to<dir>-backup-<YYYY-MM-DD>.zipexcluding.git node_modules runtime/logs secrets, then refresh the baseline. - Both private, both pushed every session. Commit alone stays on one disk — only the push is backup.
- Conditional updates. Updating every doc every session rots docs with noise. Cost: stale words nobody trusts. Rule: PROGRESS + log always; others only when their subject changed.
- Zip-if-changed. Gitignored dirs die with the disk; zipping every session wastes uploads. Cost: lost floors or GBs of pointless zips. Rule: the procedure above — fixed baseline location, fingerprint command, and zip destination; NO ZIP when identical.