Per-feature memory. One folder per feature — features/<slug>/ holds everything about that feature in one place: the memo, its browser-walk verification docs + screenshots, and any feature-specific run notes. Loaded by agents before touching a feature so they understand intent, existing surface, and how it was last proven to work.
features/
├── index.md this file
├── _TEMPLATE.md feature-memo template (copy to <slug>/<slug>.md)
├── _VERIFICATION_TEMPLATE.md verification-doc template (copy to <slug>/verifications/<date>.md)
├── feature_list.json machine-readable status registry (stays at root)
└── <slug>/
├── <slug>.md the feature memo (purpose, runtime flow, key files, tagged errors, changelog)
├── verifications/<date>.md feature-verifier verdicts (browser walk)
├── screenshots/ evidence captured by the feature-verifier
└── runs/<date>-<slug>.md feature-specific run notes (hybrid — see below)
Hybrid runs. Feature-specific run notes live in
<slug>/runs/. The global rolling cursor../runs/progress.mdand cross-cutting task notes (harness changes, multi-feature refactors) stay in.brain/runs/.
- About to modify a feature → read
<slug>/<slug>.mdfirst, then its latestverifications/doc for known-good behavior - Deciding scope of a new feature → check for adjacent features that overlap
- Investigating a bug → confirm expected behavior matches the memo + last verification
- New feature ships → create
<slug>/<slug>.md(from_TEMPLATE.md) in the same PR - Bugfix that changes runtime behavior → append to the feature's changelog table
- User-visible flow verified →
feature-verifierwrites<slug>/verifications/<date>.md+ screenshots - Feature ripped out → delete the whole
<slug>/folder (never leave stale memory)
- Folder + memo filename:
kebab-case(e.g.file-upload/file-upload.md) _Last updated: YYYY-MM-DD_at top of the memo — refresh on every editKey Filestable in the memo = source of truth for what code belongs to the featureChangelogtable appends newest entry on top- Register the feature in the table below and in
feature_list.json
Generated — do not hand-edit between the markers. Run
brain features index --write.feature_list.jsonis the source of truth andbrain checkfails on any disagreement. Without these markers the regenerator silently no-ops (no-markers), so this table could drift from the tracker indefinitely — which it did: it claimedotel-tracingwas in-progress after it shipped, and omittedsample-saas-landingentirely.
| Feature | Memo | Status | Latest verification |
|---|---|---|---|
| Authentication | authentication/authentication.md |
shipped | 2026-07-13 PASS |
| Admin Dashboard | admin-dashboard/admin-dashboard.md |
shipped | — |
| File Upload | file-upload/file-upload.md |
shipped | — |
| Analytics | analytics/analytics.md |
shipped | — |
| Preview Deployments | preview-deployments/preview-deployments.md |
shipped | — |
| Feature Verification | feature-verification/feature-verification.md |
shipped | — |
| OpenTelemetry Span Tracing | otel-tracing/otel-tracing.md |
shipped | 2026-07-29 PASS |
| Sample SaaS Landing (Loadline) | sample-saas-landing/sample-saas-landing.md |
cut | 2026-07-30 PASS |
Add a row when a feature folder is created; update the "Latest verification" cell when feature-verifier produces a new verdict; remove the row when the feature folder is deleted.
brain check now FAILS on any disagreement between this table and
feature_list.json (the "features/index.md agrees with the tracker" row), in
both directions — a wrong status and a missing row both fail. This table had
claimed otel-tracing was in-progress since it shipped, and omitted
sample-saas-landing entirely; nothing noticed, because nothing compared them.
feature_list.json is the source of truth — update both together.