Seed an AI-legible project memory map that stays small
One file (AGENTS.md) that bootstraps the rest: rules, the file map to create, what belongs in each file, the first-session interview order, and the list of anti-patterns that killed the previous map (1,308-line guide, 63 task files, narrative history inline, sessions skimming 56k tokens of context). Separates four kinds of content by read frequency: rules/invariants -> AGENTS.md (every session) subsystem truth -> docs/ai/<topic>.md (only the matching one) lookups -> environment.md (grepped, never read) retired decisions -> decisions.md (only when re-opening one) Caps are enforced, not promised: scripts/verify.sh checks doc budgets before the build, so a commit that pads a capped file fails. Proven both ways — it passes clean and exits 1 on an over-cap file. scripts/scope-check.sh blocks edits outside the declared file list. templates/ holds fill-in skeletons for the seven files a project must create. CC0: copy it, rename it, sell it, no attribution needed.
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# AGENTS — bootstrap
|
||||
|
||||
You are starting this project's memory from nothing. This file is self-contained: it gives you
|
||||
the rules, the file map you must create, what belongs in each file, and the order to do it in.
|
||||
|
||||
Two standing orders:
|
||||
|
||||
1. **This file is the only mandatory read at session start.** Everything else is read on demand.
|
||||
2. **Finish work; do not manage it.** A session that produces task lists, re-prioritisation or
|
||||
documentation of work instead of working has failed, even if the docs are good.
|
||||
|
||||
---
|
||||
|
||||
## 1. Rules — non-negotiable
|
||||
|
||||
**Delivery**
|
||||
- One unit = one behaviour = **one test** = one commit. If a request needs several tests, pick the
|
||||
one the user cares about and finish it before the next.
|
||||
- No feature branches pre-1.0. Work lands on `main`, committed per unit.
|
||||
- Commit every unit without asking. **Push only at checkpoints the user names.**
|
||||
- Declare the exact file list before editing. No "while I'm here" edits, no drive-by refactors.
|
||||
Anything spotted outside the list becomes a one-line follow-up in `HANDOFF.md`.
|
||||
- One pre-commit gate for code: clean build at **0 warnings**, full tests, scope check, doc budgets
|
||||
(`scripts/verify.sh "<files>"`). Docs-only units run the scope check alone.
|
||||
|
||||
**Reading**
|
||||
- Session start, in this order, and stop: `HANDOFF.md` → `ai.md` → **the one** `docs/ai/<topic>.md`
|
||||
that matches the task → `<dir>/index.md` for the code you will touch.
|
||||
- `TASKS.md` is read when the question is "what's next" — never as a prerequisite to code.
|
||||
- Never read the whole map "for context". If the map is a required read, the map is wrong.
|
||||
|
||||
**Memory**
|
||||
- The map is corrected by the change that **falsifies** it — in the same commit. It is not a unit
|
||||
of its own; no "docs backfill" commits unless asked.
|
||||
- Three kinds of truth, three homes: rules/invariants → this file; subsystem detail →
|
||||
`docs/ai/<topic>.md`; lookups (paths, ports, hosts, credential locations) → one cheat sheet.
|
||||
History and abandoned decisions → a decisions log, never inline in the docs.
|
||||
- `HANDOFF.md` is current state only, **overwritten not appended**, hard-capped.
|
||||
- A fact recorded once ends the re-derivation loop: paths, traps and recipes go in the map the
|
||||
first time they cost a hunt. **Grep the recipes file before re-deriving anything.**
|
||||
|
||||
**Behaviour**
|
||||
- Do the work, then report what changed and what's next. No plans, pros/cons tables or "pitfalls"
|
||||
sections unless asked.
|
||||
- Nothing here is novel: scan externally before building anything new, cite the reference in the
|
||||
commit. A **second** failed fix for the same symptom is a research trigger, not a persistence
|
||||
trigger — stop and find the established answer.
|
||||
- Follow the codebase's existing conventions; don't add comments the code doesn't need; don't
|
||||
invent work items.
|
||||
|
||||
---
|
||||
|
||||
## 2. Files you must create
|
||||
|
||||
| File | Role | Cap | Written by |
|
||||
|---|---|---|---|
|
||||
| `AGENTS.md` | This file: rules + the project's invariants | 210 lines | you, rarely |
|
||||
| `ai.md` | **Router**: what the product is, build commands, architecture table, where truth lives | 100 lines | you, rarely |
|
||||
| `HANDOFF.md` | Current state: branch, in flight, next action, landmines | 40 lines | every session, overwritten |
|
||||
| `TASKS.md` | The active queue, one line per live item | 120 lines | on status change |
|
||||
| `TASKS/archive.md` | Everything done, as a dated snapshot | unbounded | at trim time |
|
||||
| `docs/ai/<topic>.md` | Subsystem truth — one file per subsystem | unbounded | as that subsystem changes |
|
||||
| `docs/ai/index.md` | Routing table: file ↔ what it covers ↔ when to read it | — | as files are added |
|
||||
| `docs/ai/decisions.md` | Retired paths + cause of death, and the permanent out-of-scope list | — | when a decision dies |
|
||||
| `docs/ai/environment.md` | Lookups: hosts, ports, paths, build/run/test commands, suite map | — | when a fact costs a hunt |
|
||||
| `MyMistakes.md` | Failure log + **recipes registry** (grep-first) | — | when something is learned the hard way |
|
||||
| `schema.md` | The conventions above, restated for this repo | — | once |
|
||||
| `<dir>/index.md` | One per code directory: file list + one-line purpose + links out | — | when layout changes |
|
||||
|
||||
If a file is over cap: **move detail out, never pad** — the gate fails padding.
|
||||
|
||||
---
|
||||
|
||||
## 3. What goes in each file
|
||||
|
||||
**`HANDOFF.md`** (≤40)
|
||||
```
|
||||
# HANDOFF — <date> (<one-line state>)
|
||||
## State branch, worktree, unpushed commits
|
||||
## Next action the single next unit, and why it is next
|
||||
## Landmines live traps only — paths, flaky tests, do-not-touch rules
|
||||
## Pending what is blocked on the user (checks, decisions, takes)
|
||||
```
|
||||
|
||||
**`ai.md`** (≤100) — `# <Product> — AI guide & router`, then:
|
||||
- `## What it is` — five lines max.
|
||||
- `## Build, run, test` — the actual commands, plus the pointer to `environment.md`.
|
||||
- `## Architecture` — one table row per top-level directory: path → role.
|
||||
- `## Where the truth lives` — table: subsystem → doc → "read when".
|
||||
- `## Current state` → a one-line pointer to `HANDOFF.md`. Nothing else.
|
||||
|
||||
**`docs/ai/<topic>.md`** — open with one line of "read when". Then observed reality only:
|
||||
how it works, the traps that cost time, the measurements that settled an argument, and the
|
||||
guard test that protects each rule. Date contested facts. Never re-tell the product pitch.
|
||||
|
||||
**`TASKS.md`** — `## Next up` (the one unit, 5 lines) · `## Queue` (one table row per item:
|
||||
id, status ☐🔶⏳⏸❌, one-line scope, detail link) · `## Pending the user` · `## Release gates`.
|
||||
|
||||
**`decisions.md`** — one dated line per decision that no longer governs, with the reason it died,
|
||||
plus the permanent out-of-scope list. Read only when about to re-open one.
|
||||
|
||||
**`MyMistakes.md`** — `## Recipes` first (how-to, verbatim commands, traps). Then dated failure
|
||||
entries: symptom → wrong guess → actual cause → the rule that prevents it.
|
||||
|
||||
---
|
||||
|
||||
## 4. Create the gate
|
||||
|
||||
`scripts/scope-check.sh` — fails if any changed file is outside the declared list.
|
||||
`scripts/verify.sh "<files>"` — in this order:
|
||||
|
||||
1. **Doc budgets**: `wc -l` every capped file, fail with "move the detail out, do not pad".
|
||||
2. **Clean build**: clean first, then build; any warning fails. (Incremental "0 warnings" lies.)
|
||||
3. **Tests**: full suite; a whitelist of known-flaky names, everything else is a regression.
|
||||
4. **Scope check** with the passed file list.
|
||||
|
||||
A budget that is not a failing gate gets eaten by the next append. This is the load-bearing part.
|
||||
|
||||
---
|
||||
|
||||
## 5. First session — do this, in order
|
||||
|
||||
1. Ask the user for: what the product is in one paragraph, the architecture's top-level
|
||||
directories, the build/run/test commands, the deployment target, and anything that must never
|
||||
be violated (legal, data-loss, output-corrupting). **One question at a time.**
|
||||
2. Write `AGENTS.md` §1 rules as-is, then add **the invariants**: 10–20 lines, each stating a rule
|
||||
and pointing at the doc that explains it. An invariant earns its line only if violating it
|
||||
breaks output, destroys user data, or creates a legal/trust breach.
|
||||
3. Write `ai.md` router, `HANDOFF.md`, `TASKS.md` (empty queue), `docs/ai/index.md`,
|
||||
`docs/ai/environment.md`, `decisions.md` skeleton, `MyMistakes.md` with an empty Recipes
|
||||
section, `schema.md`, and `<dir>/index.md` for each directory.
|
||||
4. Write the two scripts and prove the gate fires (create an over-cap file, watch it fail).
|
||||
5. Commit once: "docs: project memory map + gate". Then **stop mapping and start working**.
|
||||
|
||||
---
|
||||
|
||||
## 6. Anti-patterns that killed the last map
|
||||
|
||||
- Appending instead of replacing — the file only grows, and stale facts outlive the code.
|
||||
- One task file per task, with paragraph-length status prose — a second, worse source of truth.
|
||||
- Cross-references like "TASK 3 item 17" — numbers rot; cite a path or a feature name.
|
||||
- Narrative history kept inline "for context" — it is 30% of the file and read by nobody.
|
||||
- Splitting into more files without a router — discovery cost just moved.
|
||||
- Docs commits as units of work — the cheapest thing to produce, so it replaces real progress.
|
||||
- Reading the whole map every session — a tax that trains sessions to skim.
|
||||
@@ -0,0 +1,20 @@
|
||||
CC0 1.0 Universal (CC0 1.0) — Public Domain Dedication
|
||||
https://creativecommons.org/publicdomain/zero/1.0/legalcode
|
||||
|
||||
The person who associated a work with this deed has dedicated the work to the
|
||||
public domain by waiving all of his or her rights to the work worldwide under
|
||||
copyright law, including all related and neighboring rights, to the extent
|
||||
allowed by law.
|
||||
|
||||
You can copy, modify, distribute and perform the work, even for commercial
|
||||
purposes, all without asking permission.
|
||||
|
||||
In no way are the patent or trademark rights of any person affected by CC0, nor
|
||||
are the rights that other persons may have in the work or in how the work is
|
||||
used, such as publicity or privacy rights.
|
||||
|
||||
Unless expressly stated otherwise, the person who associated a work with this
|
||||
deed makes no warranties about the work, and disclaims liability for all uses of
|
||||
the work, to the fullest extent permitted by applicable law.
|
||||
|
||||
The full legal text of CC0 1.0 Universal is at the URL above.
|
||||
@@ -0,0 +1,63 @@
|
||||
# agent-memory-seed
|
||||
|
||||
Seed for an AI-legible project memory map: **fork it, don't sync it.**
|
||||
|
||||
Copy the files into a new repo, let the AI run the first-session interview, then delete the seed
|
||||
scaffolding. Every project owns its own copy from then on; improvements that prove out somewhere
|
||||
get brought back here deliberately, one at a time. Never try to keep the two in lockstep.
|
||||
|
||||
## Why it exists
|
||||
|
||||
Most "AI context" files die the same death: they grow. A rules file becomes a history file, a task
|
||||
list becomes a second source of truth, and every session pays to skim it — which is how stale facts
|
||||
survive. This seed is small because it separates four kinds of content that have four different
|
||||
read frequencies:
|
||||
|
||||
| Kind | Home | Read |
|
||||
|---|---|---|
|
||||
| Rules + invariants | `AGENTS.md` | every session |
|
||||
| Subsystem truth | `docs/ai/<topic>.md` | only the one matching the task |
|
||||
| Lookups (hosts, paths, commands) | `docs/ai/environment.md` | grepped, never read |
|
||||
| Retired decisions | `docs/ai/decisions.md` | only when re-opening one |
|
||||
|
||||
Caps are enforced by `scripts/verify.sh`, not promised: a commit that pads a capped file fails.
|
||||
|
||||
## What's here
|
||||
|
||||
```
|
||||
AGENTS.md the seed: rules, file map, per-file contents, first-session order
|
||||
scripts/verify.sh the one gate — doc budgets, clean build, tests, scope check
|
||||
scripts/scope-check.sh fails if a commit touches files outside the declared list
|
||||
templates/ fill-in skeletons the AI copies into the target project
|
||||
```
|
||||
|
||||
## Use
|
||||
|
||||
```bash
|
||||
git clone https://<host>/<owner>/agent-memory-seed.git <new-project>
|
||||
cd <new-project>
|
||||
rm -rf .git && git init -b main
|
||||
```
|
||||
|
||||
Then, as the first prompt to the AI:
|
||||
|
||||
> Read AGENTS.md and follow it. Ask me the first-session questions one at a time, then build the
|
||||
> memory map, then delete the seed scaffolding — `templates/` and the seed sections of README.
|
||||
|
||||
`templates/` is input, not output: copy each skeleton to its real path (`templates/handoff.md` →
|
||||
`HANDOFF.md`) and fill it in. When the map is built, remove `templates/` and rewrite this README
|
||||
for the actual project.
|
||||
|
||||
## The parts that matter most
|
||||
|
||||
1. **The caps + the gate.** Everything else degrades politely; a file without a failing check
|
||||
bloats silently.
|
||||
2. **`HANDOFF.md` is overwritten, never appended.** History belongs to `git log`.
|
||||
3. **A budget cut means moving detail out, never deleting a fact** — out to a subsystem doc, a
|
||||
lookup sheet, the decisions log, or git.
|
||||
|
||||
Anti-patterns and the full ruleset live in [`AGENTS.md`](AGENTS.md) §1 and §6.
|
||||
|
||||
## License
|
||||
|
||||
[CC0 1.0 Universal](LICENSE) — public domain. Copy it, rename it, sell it, no attribution needed.
|
||||
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
# scope-check.sh — Validate that git diff only touches declared files.
|
||||
# Usage: ./scripts/scope-check.sh "file1.cs" "file2.cs" ...
|
||||
# Exit 0 if all changed files are in scope, 1 if any are outside.
|
||||
#
|
||||
# Checks staged, unstaged, and untracked changes against the allowed list.
|
||||
# Supports glob patterns in the allowed list (e.g. "ytLive.Tests/*").
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 \"file1.cs\" \"file2.cs\" ..."
|
||||
echo " Pass the declared file list as arguments."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Collect allowed patterns into an array
|
||||
allowed=("$@")
|
||||
|
||||
# Gather all changed files: working tree vs HEAD (tracked) + staged + untracked
|
||||
changed=$({
|
||||
git diff --name-only HEAD 2>/dev/null || true
|
||||
git diff --name-only --cached 2>/dev/null || true
|
||||
git ls-files --others --exclude-standard 2>/dev/null || true
|
||||
} | sort -u)
|
||||
|
||||
if [ -z "$changed" ]; then
|
||||
echo "✓ No changes detected."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
violations=()
|
||||
while IFS= read -r file; do
|
||||
matched=false
|
||||
for pattern in "${allowed[@]}"; do
|
||||
if [[ "$file" == $pattern ]]; then
|
||||
matched=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$matched" = false ]; then
|
||||
violations+=("$file")
|
||||
fi
|
||||
done <<< "$changed"
|
||||
|
||||
if [ ${#violations[@]} -eq 0 ]; then
|
||||
echo "✓ Scope check passed — all changed files are in scope."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "✗ SCOPE VIOLATION — the following files are outside the declared scope:"
|
||||
for f in "${violations[@]}"; do
|
||||
echo " - $f"
|
||||
done
|
||||
echo ""
|
||||
echo "Either justify the edit or revert the change."
|
||||
exit 1
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
# verify.sh — the one gate before committing: doc budgets + clean build + tests + scope check.
|
||||
# Usage: ./scripts/verify.sh "path/changed1" "path/changed2" ...
|
||||
#
|
||||
# Why a CLEAN build? An incremental build skips recompiling, so a "0 warnings" report can be a lie
|
||||
# — a nullable warning slipped past exactly that way once. Clean first, then build.
|
||||
#
|
||||
# CONFIGURE the three commands below for the project. Empty means "skip with a warning", so a
|
||||
# docs-only repo works out of the box.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CLEAN_CMD="" # e.g. 'dotnet clean App.csproj'
|
||||
BUILD_CMD="" # e.g. 'dotnet build App.csproj'
|
||||
TEST_CMD="" # e.g. 'dotnet test Tests/Tests.csproj'
|
||||
WARN_PATTERN=": warning" # what a compiler warning looks like in BUILD_CMD output
|
||||
KNOWN_FLAKY="" # regex of pre-existing flaky test names; anything else fails the gate
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
echo "══ 1/4 DOC BUDGETS ══"
|
||||
# The map stays cheap to read. A commit that PADS a capped file instead of moving detail out
|
||||
# fails here (see AGENTS.md -> Reading budget).
|
||||
check_budget() {
|
||||
local rel="$1" cap="$2" lines
|
||||
[ -f "$ROOT/$rel" ] || { echo " ⚠ $rel not built yet — skipped"; return 0; }
|
||||
lines=$(wc -l < "$ROOT/$rel")
|
||||
if [ "$lines" -gt "$cap" ]; then
|
||||
echo "✗ $rel is $lines lines (cap $cap)."
|
||||
echo " Move the detail to docs/ai/<topic>.md, MyMistakes.md, decisions.md or git log."
|
||||
return 1
|
||||
fi
|
||||
printf " ✓ %-12s %3s/%s lines\n" "$rel" "$lines" "$cap"
|
||||
}
|
||||
budget_failed=0
|
||||
check_budget "AGENTS.md" 210 || budget_failed=1
|
||||
check_budget "ai.md" 100 || budget_failed=1
|
||||
check_budget "HANDOFF.md" 40 || budget_failed=1
|
||||
check_budget "TASKS.md" 120 || budget_failed=1
|
||||
[ "$budget_failed" -eq 0 ] || exit 1
|
||||
|
||||
echo "══ 2/4 CLEAN BUILD (expect 0 warnings) ══"
|
||||
if [ -z "$BUILD_CMD" ]; then
|
||||
echo "⚠ BUILD_CMD not configured — build step skipped."
|
||||
else
|
||||
[ -z "$CLEAN_CMD" ] || eval "$CLEAN_CMD" > /dev/null
|
||||
OUT="$(eval "$BUILD_CMD" 2>&1)"
|
||||
if echo "$OUT" | grep -qI "$WARN_PATTERN"; then
|
||||
echo "✗ WARNINGS FOUND:"
|
||||
echo "$OUT" | grep -i "$WARN_PATTERN" | sort -u
|
||||
exit 1
|
||||
fi
|
||||
echo "$OUT" | tail -3
|
||||
echo "✓ Build clean."
|
||||
fi
|
||||
|
||||
echo "══ 3/4 TEST SUITE ══"
|
||||
if [ -z "$TEST_CMD" ]; then
|
||||
echo "⚠ TEST_CMD not configured — test step skipped."
|
||||
else
|
||||
set +e
|
||||
RUN="$(eval "$TEST_CMD" 2>&1)"
|
||||
EXIT=$?
|
||||
set -e
|
||||
echo "$RUN" | tail -5
|
||||
if [ "$EXIT" -ne 0 ]; then
|
||||
if [ -n "$KNOWN_FLAKY" ] && ! echo "$RUN" | grep -iE "fail" | grep -qvE "$KNOWN_FLAKY"; then
|
||||
echo "⚠ Failures, but all match the known-flaky whitelist (OK)."
|
||||
else
|
||||
echo "✗ TEST FAILURES — investigate."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "══ 4/4 SCOPE CHECK ══"
|
||||
"$ROOT/scripts/scope-check.sh" "$@"
|
||||
|
||||
echo ""
|
||||
echo "✓ All gates passed — safe to commit."
|
||||
@@ -0,0 +1,30 @@
|
||||
# <Product> (repo `<name>`) — AI guide & router
|
||||
|
||||
> Read [`AGENTS.md`](AGENTS.md) first: the rules and the invariants. This file is the **map** —
|
||||
> what the product is, how it is built, and where the truth lives. No narrative, no status.
|
||||
|
||||
## What it is
|
||||
|
||||
<Five lines max: what it does, for whom, the platform, the one thing that makes it different.>
|
||||
|
||||
## Build, run, test
|
||||
|
||||
<The commands actually used. Link to docs/ai/environment.md for the full runbook.>
|
||||
|
||||
## Architecture
|
||||
|
||||
| Path | Role |
|
||||
|---|---|
|
||||
| `<dir>/` | <one line> |
|
||||
|
||||
## Where the truth lives
|
||||
|
||||
| Subsystem | File | Read when |
|
||||
|---|---|---|
|
||||
| <subsystem> | [`docs/ai/<topic>.md`](docs/ai/<topic>.md) | <the trigger> |
|
||||
|
||||
Lookup, not reading: [`MyMistakes.md`](MyMistakes.md) · [`TASKS.md`](TASKS.md) · `<dir>/index.md`.
|
||||
|
||||
## Current state
|
||||
|
||||
[`HANDOFF.md`](HANDOFF.md) — do not restate it here.
|
||||
@@ -0,0 +1,12 @@
|
||||
# Decisions log — retired paths, kept so they are not re-litigated
|
||||
|
||||
One dated line per decision that **no longer governs**, with the reason it died. Read only when
|
||||
about to re-open one.
|
||||
|
||||
## <Domain>
|
||||
|
||||
- **<YYYY-MM-DD>** <decision> — superseded by <what>, because <why>.
|
||||
|
||||
## Out of scope — permanently
|
||||
|
||||
- <thing> — <the reason it will not be built, not "later">.
|
||||
@@ -0,0 +1,10 @@
|
||||
# docs/ai — index
|
||||
|
||||
Subsystem truth, split out so a session pays only for what its task touches. `ai.md` routes here;
|
||||
`AGENTS.md` carries the invariants that hold across every subsystem.
|
||||
|
||||
| File | Covers | Read when |
|
||||
|---|---|---|
|
||||
| [`environment.md`](environment.md) | Hosts, ports, paths, build/run/test commands, test map | building, running, adding a test |
|
||||
| [`decisions.md`](decisions.md) | Retired paths with cause of death; the permanent out-of-scope list | about to re-open a settled decision |
|
||||
| <topic>.md | <subsystem> | <trigger> |
|
||||
@@ -0,0 +1,34 @@
|
||||
# Environment — lookups
|
||||
|
||||
Facts you grep for, never read start to finish. Add a line the first time one costs a hunt.
|
||||
|
||||
## Hosts & access
|
||||
|
||||
| Host | Address | Role |
|
||||
|---|---|---|
|
||||
| <host> | <ip> | <role> |
|
||||
|
||||
SSH / credentials: <where they live, never in this repo>.
|
||||
|
||||
## Build, run, test
|
||||
|
||||
```bash
|
||||
<clean command>
|
||||
<build command>
|
||||
<run command>
|
||||
<test command>
|
||||
```
|
||||
|
||||
<The traps: which toolchain, which host, why not the other one. Notes on warnings, restores, caches.>
|
||||
|
||||
## Paths
|
||||
|
||||
- App data / config: `<path>`
|
||||
- Logs: `<path>` (rotation: <rule>)
|
||||
- Build output / artifacts: `<path>`
|
||||
|
||||
## Test map
|
||||
|
||||
| Area | Test file | Notes |
|
||||
|---|---|---|
|
||||
| <area> | `<file>` | <known flaky? slow? needs env?> |
|
||||
@@ -0,0 +1,18 @@
|
||||
# HANDOFF — <YYYY-MM-DD> (<one-line state>)
|
||||
|
||||
## State
|
||||
|
||||
- Branch `<branch>`, worktree <clean / N files dirty>, **<pushed|unpushed>** (`<last sha>`).
|
||||
- In flight: <the unit that is partially done, if any — file names and what is left>.
|
||||
|
||||
## Next action
|
||||
|
||||
<The single next unit, one sentence on why it is next. Nothing else.>
|
||||
|
||||
## Landmines (live, not historical)
|
||||
|
||||
- <path / port / flaky test / do-not-touch rule — one line each, only what would bite today.>
|
||||
|
||||
## Pending the user
|
||||
|
||||
- <decision, hands-on check, or measurement that is blocked on them>
|
||||
@@ -0,0 +1,9 @@
|
||||
# <dir> — index
|
||||
|
||||
One line on what this directory owns, then every file with its purpose. Details live in the files.
|
||||
|
||||
| File | Purpose |
|
||||
|---|---|
|
||||
| `<File>` | <what it does, one line> |
|
||||
|
||||
Related: [`../other/index.md`](../other/index.md)
|
||||
@@ -0,0 +1,23 @@
|
||||
# MyMistakes — failure log + recipes
|
||||
|
||||
## Recipes (grep here FIRST)
|
||||
|
||||
<How-tos and workarounds, with verbatim commands. A solution recorded once ends the loop;
|
||||
an un-recorded one guarantees the same wall twice.>
|
||||
|
||||
### <Recipe name>
|
||||
|
||||
```bash
|
||||
<exact commands>
|
||||
```
|
||||
|
||||
Traps: <the two or three things that actually go wrong>.
|
||||
|
||||
## Failure log (newest first)
|
||||
|
||||
### <YYYY-MM-DD> — <symptom in six words>
|
||||
|
||||
- **Symptom:** <what was observed>
|
||||
- **Wrong guess:** <what was tried, and why it looked right>
|
||||
- **Actual cause:** <the mechanism>
|
||||
- **Rule now:** <what prevents the repeat — and where it is written down>
|
||||
@@ -0,0 +1,35 @@
|
||||
# Memory map — conventions
|
||||
|
||||
## Why files, not a database
|
||||
|
||||
Grep-able, diffable, human-editable, portable; git gives versioning and history for free. Files
|
||||
form a graph: each file is a node, each relative link an edge.
|
||||
|
||||
## Inventory
|
||||
|
||||
| File | Role | Entry point? |
|
||||
|---|---|---|
|
||||
| `AGENTS.md` | Rules + invariants | **always read** |
|
||||
| `ai.md` | Router: product, build, architecture, where truth lives | yes |
|
||||
| `HANDOFF.md` | Current state (≤40 lines, overwritten) | yes |
|
||||
| `TASKS.md` | Active queue | when asking "what's next" |
|
||||
| `docs/ai/*.md` | Subsystem truth, one file each | when the task touches it |
|
||||
| `MyMistakes.md` | Failure log + recipes | grep first |
|
||||
|
||||
## Rules
|
||||
|
||||
1. **Semantic filenames.** No codes, no abbreviations.
|
||||
2. **One `index.md` per code directory**, listing every file with a one-line purpose.
|
||||
3. **Links over hierarchy.** Anything unreachable from `ai.md` may as well not exist.
|
||||
4. **Stale facts get fixed, not appended.**
|
||||
5. **Progressive disclosure.** Detail lives one level down, never crammed into the router.
|
||||
|
||||
## Reading order
|
||||
|
||||
1. `AGENTS.md` → 2. `HANDOFF.md` → 3. `ai.md` → 4. the one `docs/ai/<topic>.md` → 5. `<dir>/index.md`
|
||||
→ 6. the source (always the authority over any memory file).
|
||||
|
||||
## Integration rule
|
||||
|
||||
Every change ships with the facts it **falsifies** corrected, in the same commit. Broader
|
||||
restatement may be batched at a milestone.
|
||||
@@ -0,0 +1,22 @@
|
||||
# TASKS — the active queue
|
||||
|
||||
> One line per live item; detail lives elsewhere. Done work goes to [`TASKS/archive.md`](TASKS/archive.md).
|
||||
> Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
|
||||
|
||||
## Next up
|
||||
|
||||
**<Task>** — <five lines: what exists today, what is missing, the one unit, its test.>
|
||||
|
||||
## Queue
|
||||
|
||||
| Task | Status | Scope | Detail |
|
||||
|---|---|---|---|
|
||||
| <id> | ☐ | <one line> | <link> |
|
||||
|
||||
## Pending the user (not programming)
|
||||
|
||||
- <hands-on check / decision / take>
|
||||
|
||||
## Release gates (before the first shipped build)
|
||||
|
||||
- <gate — one line each>
|
||||
Reference in New Issue
Block a user