@nurix/etna 0.19.24 → 0.19.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +21 -15
  2. package/bin/etna.js +3 -3
  3. package/data/harness-index.json +1 -1
  4. package/data/harnesses/code/CLAUDE.md +7 -6
  5. package/data/harnesses/code/agents/maintenance.md +3 -3
  6. package/data/harnesses/code/agents/retro.md +20 -19
  7. package/data/harnesses/code/codex/agents/maintenance.toml +5 -5
  8. package/data/harnesses/code/codex/agents/retro.toml +21 -19
  9. package/data/harnesses/code/harness.json +2 -2
  10. package/data/harnesses/code/rules/changelog.md +37 -0
  11. package/data/harnesses/code/skills/boundary/SKILL.md +1 -1
  12. package/data/harnesses/code/skills/brainstorm/SKILL.md +1 -2
  13. package/data/harnesses/code/skills/design/SKILL.md +1 -1
  14. package/data/harnesses/code/skills/documentation/SKILL.md +2 -3
  15. package/data/harnesses/code/skills/documentation/templates/changelog-entry.md +41 -46
  16. package/data/harnesses/code/skills/documentation/templates/structure.md +2 -4
  17. package/data/harnesses/code/skills/test-plan/SKILL.md +1 -1
  18. package/data/harnesses/code/skills/workflow-mapper/SKILL.md +1 -1
  19. package/data/harnesses/discussion/harness.json +1 -1
  20. package/data/harnesses/etna/CLAUDE.md +27 -1
  21. package/data/harnesses/etna/agents/maintenance.md +3 -3
  22. package/data/harnesses/etna/agents/retro.md +46 -0
  23. package/data/harnesses/etna/codex/agents/maintenance.toml +5 -5
  24. package/data/harnesses/etna/codex/agents/retro.toml +45 -0
  25. package/data/harnesses/etna/harness.json +2 -2
  26. package/data/harnesses/etna/rules/changelog.md +37 -0
  27. package/data/harnesses/etna/skills/boundary/SKILL.md +1 -1
  28. package/data/harnesses/etna/skills/brainstorm/SKILL.md +1 -2
  29. package/data/harnesses/etna/skills/documentation/SKILL.md +2 -3
  30. package/data/harnesses/etna/skills/documentation/templates/changelog-entry.md +41 -46
  31. package/data/harnesses/etna/skills/documentation/templates/structure.md +2 -4
  32. package/data/harnesses/etna/skills/workflow-mapper/SKILL.md +1 -1
  33. package/data/harnesses/hr/harness.json +2 -2
  34. package/data/harnesses/hr/skills/evaluator/SKILL.md +1 -1
  35. package/data/harnesses/hr/skills/interview-eval/SKILL.md +1 -1
  36. package/package.json +2 -2
  37. package/data/harnesses/code/skills/documentation/templates/refinement-ledger.md +0 -33
  38. package/data/harnesses/etna/skills/documentation/templates/refinement-ledger.md +0 -33
package/README.md CHANGED
@@ -20,7 +20,7 @@ npx --yes @nurix/etna --name=code
20
20
 
21
21
  The `--yes` flag skips npx's install confirmation, so the command runs unattended. On startup the CLI also **self-updates**: it checks the registry and, if the copy npx resolved is behind the latest published version, re-execs the latest before installing — so `npx --yes @nurix/etna` always runs the newest harness, even when npx has an older copy cached. The check is quick but synchronous; set `ETNA_NO_SELFUPDATE=1` to skip it (CI, offline, or a pinned local build).
22
22
 
23
- After this completes:
23
+ After this completes (the `code` harness shown — the component folders differ per harness, and one a harness ships nothing for is simply absent):
24
24
 
25
25
  ```
26
26
  your-project/
@@ -30,17 +30,17 @@ your-project/
30
30
  ├── .prettierignore
31
31
  ├── .vscode/settings.json ← editor settings (markdown formatter on save)
32
32
  └── .claude/
33
- ├── skills/ ← documentation, boundary, brainstorm, workflow-mapper, design
34
- ├── agents/ ← lld-mode, brainstorm, maintenance, change-review, performance-review
35
- ├── rules/ ← general.md, frontend.md, express.md, nomenclature.md, database.md, testing.md, pnpm.md
36
- ├── hooks/ ← generate-ownership-index (SessionStart)
33
+ ├── skills/ ← boundary, brainstorm, design, documentation, test-plan, workflow-mapper
34
+ ├── agents/ ← brainstorm, change-review, lld-mode, maintenance, performance-review, retro
35
+ ├── rules/ ← database.md, express.md, frontend.md, general.md, nomenclature.md, pnpm.md, testing.md
36
+ ├── hooks/ ← generate-ownership-index (SessionStart) + hooks.json
37
37
  ├── settings.json ← the hook is deep-merged in here (your existing keys preserved)
38
- └── harness.json ← {version, digest, owned} — the installed-harness sentinel
38
+ └── harness.json ← {harness, name, version, files, digest, owned} — the installed-harness sentinel
39
39
  ```
40
40
 
41
- Alongside the Claude tree, the installer projects the **Codex** artifacts so the repo also works under OpenAI Codex: `AGENTS.md` (above), `.agents/skills/` (a mirror of `.claude/skills/`, Codex's skill-scan path), and `.codex/agents/*.toml` + `.codex/hooks.json` (its subagents and SessionStart hook). Nothing is written outside the project. No marketplace registration, no `enabledPlugins` entry, no global cache dependency — Claude Code picks up the project-scoped agents/skills/rules on its next session start (and Codex reads `AGENTS.md` + `.agents/` + `.codex/`), and the hooks wire in through `.claude/settings.json`.
41
+ Alongside the Claude tree, the installer projects the **Codex** artifacts so the repo also works under OpenAI Codex: `AGENTS.md` (above), `.agents/skills/` (a mirror of `.claude/skills/`, Codex's skill-scan path), and `.codex/agents/*.toml` + `.codex/hooks.json` (its subagents and SessionStart hook) — each surface written only when the harness ships that component kind. Nothing is written outside the project. No marketplace registration, no `enabledPlugins` entry, no global cache dependency — Claude Code picks up the project-scoped agents/skills/rules on its next session start (and Codex reads `AGENTS.md` + `.agents/` + `.codex/`), and the hooks wire in through `.claude/settings.json`.
42
42
 
43
- Re-run `npx --yes @nurix/etna --name=code` anytime to refresh the harness content with what the latest published package ships. Existing same-named files are overwritten; files you've added that aren't part of the harness are left alone. In a git repo the previous `CLAUDE.md` is overwritten in place (recover it with `git checkout CLAUDE.md`); outside a git repo it's backed up to `CLAUDE.md.bak.<ISO-timestamp>`. Because the new `harness.json` carries the installed `{version, digest}`, a re-run whose **major** version is ahead of your repo's stamped `harness-version` is what the reconcile (below) detects as a structural upgrade.
43
+ Re-run `npx --yes @nurix/etna --name=code` anytime to refresh the harness content with what the latest published package ships. Existing same-named files are overwritten, and a component the harness used to own but no longer ships is pruned; files you've added that aren't part of the harness are left alone. In a git repo the previous `CLAUDE.md` and `.claude/` are overwritten and refreshed in place (recover them with `git checkout`); outside a git repo `CLAUDE.md` is backed up to `CLAUDE.md.bak.<ISO-timestamp>` and the whole `.claude/` tree is snapshotted to `.claude.bak.<ISO-timestamp>` first. Because the new `harness.json` carries the installed `{version, digest}`, a re-run whose **major** version is ahead of your repo's stamped `harness-version` is what the reconcile (below) detects as a structural upgrade.
44
44
 
45
45
  ## After install: bootstrap the harness
46
46
 
@@ -53,7 +53,7 @@ Then work normally. Boundaries aren't generated as files — the `boundary` skil
53
53
 
54
54
  One thing worth knowing on an existing repo:
55
55
 
56
- - **Your root `CLAUDE.md` is replaced** with the harness policy file (the old one is saved to `CLAUDE.md.bak.<ISO>`). If it held project-specific instructions, fold them back in after install — the harness file is the policy skeleton; your domain specifics sit alongside it.
56
+ - **Your root `CLAUDE.md` is replaced** with the harness policy file (recoverable from git, or from `CLAUDE.md.bak.<ISO>` outside a git repo). If it held project-specific instructions, fold them back in after install — the harness file is the policy skeleton; your domain specifics sit alongside it.
57
57
 
58
58
  ## Migrating from 0.1.x
59
59
 
@@ -67,8 +67,12 @@ Listed by `npx --yes @nurix/etna` (no args) using the bundled `data/harness-inde
67
67
 
68
68
  | Harness | Source in etna | What it ships |
69
69
  | --- | --- | --- |
70
- | `code` | [`harness/code/`](../../harness/code/) | Governance + session agents, baseline workflow skills, the ownership-index hook (merged single-folder layout) |
71
- | `kb-agi` | [`harness/kb-agi/`](../../harness/kb-agi/) | Knowledge-vault scaffolding |
70
+ | `code` | [`harness/code/`](../../harness/code/) | The canonical Nurix code-project harness — 6 governance/session agents, 6 workflow skills, 7 stack rules, the ownership-index `SessionStart` hook |
71
+ | `discover` | [`harness/discover/`](../../harness/discover/) | The product-discovery harness — 11 owned dimension-collector agents and 9 owned method rules, plus a `tooling-recommendations.md` at the project root. No skills, no hooks |
72
+ | `discussion` | [`harness/discussion/`](../../harness/discussion/) | The deliberation-workspace harness — 2 owned agents, 2 owned rules, and the `update-topics` hook that keeps the topic index current. No skills |
73
+ | `etna` | [`harness/etna/`](../../harness/etna/) | The forge's own governance harness — a deliberate fork of `code` reframed for authoring artifacts: 5 agents, 4 skills, 4 rules, the ownership-index hook |
74
+ | `hr` | [`harness/hr/`](../../harness/hr/) | The hiring / AI-steering evaluation harness — the `interview-eval` and `evaluator` skills plus one batching rule. No agents, no hooks |
75
+ | `kb-agi` | [`harness/kb-agi/`](../../harness/kb-agi/) | The self-improving knowledge-base harness — 3 owned vault agents (`kb-init`, `kb-audit`, `kb-apply`) and the owned `kb-export.mjs` script. No skills, no rules |
72
76
 
73
77
  ## How it works
74
78
 
@@ -88,15 +92,17 @@ Two kinds of membership:
88
92
  # harness/code/readme.md
89
93
  ---
90
94
  name: code
91
- skills: [boundary, brainstorm, documentation, workflow-mapper, design]
95
+ skills:
96
+ [boundary, test-plan, brainstorm, documentation, workflow-mapper, design]
92
97
  rules: [general, frontend, express, nomenclature, database, testing, pnpm]
93
- agents: [brainstorm, change-review, lld-mode, maintenance, performance-review]
98
+ agents:
99
+ [brainstorm, change-review, lld-mode, maintenance, performance-review, retro]
94
100
  ---
95
101
  ```
96
102
 
97
103
  - **Owned, by location** — hooks, scripts (and any unlisted, harness-specific agents) live inside the harness folder (`harness/<name>/{agents,hooks,scripts}/`). No list — membership is presence in the folder, exactly how a Claude Code plugin ships them. Shared governance agents are listed instead (above) and resolved from the `agents/` catalog, local-first; a harness can still drop its own copy beside it to override one by name.
98
104
 
99
- `scripts/build-data.js` (run by `prepack`) resolves the listed skills/rules/agents from the catalogs (local-first), copies any unlisted harness-owned agents plus the harness's `hooks/` and `scripts/` wholesale into `data/harnesses/<folder>/`; a listed skill/rule/agent that doesn't exist is a hard error. The marketplace channel (`.github/scripts/publish.mjs`) reads the same harness folder and resolves the listed skills/rules/agents the same local-first way — but the two channels' **footprints differ**: the marketplace plugin carries no root policy, and its Codex surface is skills + hooks only (Codex custom agents ship through this CLI). The installer (`bin/etna.js`) reads from the bundle at install time; no GitHub fetch at runtime.
105
+ `scripts/build-data.js` (run by `prepack`) resolves the listed skills/rules/agents from the catalogs (local-first), copies any unlisted harness-owned agents plus the harness's `hooks/` and `scripts/` wholesale into `data/harnesses/<folder>/`, adds the `harness/common/` root files and each bundled agent's `*.codex.toml` twin, and writes the `harness.json` marker (version, `files` list, kit digest); a listed skill/rule/agent that doesn't exist is a hard error. The marketplace channel (`.github/scripts/publish.mjs`) reads the same harness folder and resolves the listed skills/rules/agents the same local-first way — but the two channels' **footprints differ**: the marketplace plugin carries no root policy, and its Codex surface is skills + hooks only (Codex custom agents ship through this CLI). The installer (`bin/etna.js`) reads from the bundle at install time; no GitHub fetch at runtime.
100
106
 
101
107
  ## Building / contributing
102
108
 
@@ -111,4 +117,4 @@ npm run build:data
111
117
 
112
118
  ## Publishing
113
119
 
114
- CI auto-publishes on push to `dev` when `packages/cli/**` or `harness/**` change — see [`.github/workflows/publish-etna-to-npm.yml`](../../.github/workflows/publish-etna-to-npm.yml). The `publishConfig.access` is `restricted` so the scoped package is private by default. The `NPM_PUBLISH_TOKEN` GitHub Actions secret must be a granular access token with **Bypass 2FA** enabled — classic automation tokens are rejected by the npmjs.com 2FA policy on the `nurix-tools` account.
120
+ CI auto-publishes on push to `dev` when `packages/cli/**` or `harness/**` change — see [`.github/workflows/publish-etna-to-npm.yml`](../../.github/workflows/publish-etna-to-npm.yml). The `publishConfig.access` is `public`, so `npx @nurix/etna` installs and self-updates without any npm token. Publishing still requires auth: the `NPM_PUBLISH_TOKEN` GitHub Actions secret must be a granular access token with **Bypass 2FA** enabled — classic automation tokens are rejected by the npmjs.com 2FA policy on the `nurix-tools` account.
package/bin/etna.js CHANGED
@@ -484,9 +484,9 @@ function parseArgs(args) {
484
484
  //
485
485
  // Guards: ETNA_SELFUPDATED=1 is set on the child to stop an infinite re-exec loop;
486
486
  // ETNA_NO_SELFUPDATE lets a caller opt out (CI, offline, or running an intentionally
487
- // pinned/local-dev build). Degrades gracefully — any failure (offline, unauthed, npm/
488
- // npx missing) falls through to running THIS copy. @nurix/etna is restricted, so the
489
- // `npm view` reuses the caller's existing npm auth — the same auth that installed it.
487
+ // pinned/local-dev build). Degrades gracefully — any failure (offline, npm/npx missing)
488
+ // falls through to running THIS copy. @nurix/etna publishes with public access, so the
489
+ // `npm view` and the re-exec `npx` both resolve unauthenticated — no npm token needed.
490
490
  function selfUpdateOrReexec() {
491
491
  if (process.env.ETNA_SELFUPDATED || process.env.ETNA_NO_SELFUPDATE) return;
492
492
  const here = readJson(join(pkgRoot, 'package.json')).version;
@@ -1,5 +1,5 @@
1
1
  {
2
- "fingerprint": "a528a3d692b9",
2
+ "fingerprint": "e89ab23a69ca",
3
3
  "harnesses": {
4
4
  "code": {
5
5
  "plugin": "code",
@@ -71,7 +71,7 @@ Boundaries are **diagnosed, not documented** — the `boundary` skill derives th
71
71
 
72
72
  - **Every markdown document goes through the `documentation` skill.** Before creating or substantively editing any `.md` document — a doc, a README, an index, a record — invoke the `documentation` skill and apply its templates and `references/style-guide.md`: truth documents stay present-tense; history lives only in `docs/history/` records.
73
73
  - **[override]** Keep `docs/` updated when code changes affect documented behavior. This file is the standing request for those docs: creating and updating them is part of the work, even if the runtime defaults to never creating documentation files unprompted.
74
- - After plan completion **[override]**: add a `docs/history/changelog/` entry + update `docs/history/CHANGELOG.md` — no confirmation needed. Include `Commits:` if multi-commit. Non-plan changes (refactors, fixes, API changes): prompt first.
74
+ - After plan completion **[override]**: write the `docs/history/changelog/` entry as a **draft** immediately, while the context is fresh — no confirmation needed — and append its `docs/history/CHANGELOG.md` row; the commit fills what the draft left open and freezes it. Non-plan work needs no separate prompt: every non-exempt commit carries its own entry (the `changelog` rule).
75
75
  - When moving or renaming source files: update the `owns:` globs of the feature doc that owns them so the generated ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter — there is no separate map to update.
76
76
  - `docs/structure.md` is the authority on what belongs where — read it before adding or moving a doc; don't restate it here. One canonical source per topic — link, don't copy. Only `CLAUDE.md`, `AGENTS.md`, and `README.md` live at the repo root.
77
77
 
@@ -93,13 +93,14 @@ When recording a learning, ask: _is this true of this project, or true of this u
93
93
 
94
94
  ---
95
95
 
96
- ## Refinement Ledger
96
+ ## Changelog
97
97
 
98
- A commit marks the user's behavioral verification of the work, and the committing session is the last holder of the refinement context that produced it — asks, iterations, rejections, skill outcomes, discoveries. That context is captured at commit time and distilled on demand:
98
+ A commit marks the user's behavioral verification of the work, and the working session is the last holder of the refinement context that produced it — asks, iterations, rejections, skill outcomes, discoveries. That context is captured in the changelog and distilled on demand. The `changelog` rule carries the trigger and the lifecycle; this is the policy:
99
99
 
100
- - **Every non-mechanical commit appends one ledger block** to `docs/history/ledger/YYYY-MM.md`, staged inside the commit it describes — whatever tool or session performs the commit. Block format, required fields, and the closed exemption list are the `documentation` skill's `templates/refinement-ledger.md`; the failure fields (rejected attempts, overridden skill output) and verbatim taste quotes are required, not optional — the ledger's value concentrates there.
101
- - **Append-only journal, never a truth doc** — blocks are immutable once committed; a correction is a new block. The ledger is never cleaned up or reconciled, and doc-health passes skip it by genre.
102
- - **Distillation is the `retro` agent** — run on demand (before a brainstorm or LLD, before a new project, after a refinement arc), it converts accumulated blocks into a typed punch list (doc content, doc structure, skill evolution, pins, harness rules), appends actionable items to the backlog, and proposes only — application runs through the normal documentation loop.
100
+ - **Every non-mechanical commit is covered by an entry** at `docs/history/changelog/YYYY-MM-DD-{three-words}.md`, staged inside the commit it describes — whatever tool or session performs the commit — plus a row in `docs/history/CHANGELOG.md`. Format, required fields, and the closed exemption list are the `documentation` skill's `templates/changelog-entry.md`; the failure fields (rejected attempts, overridden skill output) and verbatim taste quotes are required, not optional — the entry's value concentrates there.
101
+ - **An entry may exist before its commit.** A plan reaching `Status: Complete` writes its entry as a **draft** immediately, while the context is fresh; the commit fills what the draft left open. **Immutability begins at commit, not creation** — a draft is mutable, a committed entry never is, and a correction is a new entry that links back. Doc-health passes skip the genre.
102
+ - **A commit is the smallest unit an entry may describe**; above that the mapping is judgment. Work exceeding a draft's scope gets a *second* entry rather than stretching the first.
103
+ - **Distillation is the `retro` agent** — run on demand (before a brainstorm or LLD, before a new project, after a refinement arc), it converts accumulated entries into a typed punch list (doc content, doc structure, skill evolution, pins, harness rules), appends actionable items to the backlog, and proposes only — application runs through the normal documentation loop.
103
104
 
104
105
  ---
105
106
 
@@ -137,8 +137,7 @@ docs/
137
137
  │ └── {topic}-brainstorm/ # created by the `brainstorm` skill; NOT scaffolded empty; moves to history/brainstorms/ on a passed harvest
138
138
  ├── history/
139
139
  │ ├── CHANGELOG.md # Master changelog index
140
- │ ├── changelog/ # Individual entries
141
- │ ├── ledger/ # Refinement Ledger — append-only per-commit refinement journal (YYYY-MM.md; written at commit time, NOT scaffolded empty)
140
+ │ ├── changelog/ # Individual entries (YYYY-MM-DD-{three-words}.md; written at commit time, NOT scaffolded empty)
142
141
  │ ├── plans/ # Implementation plans (Status field required)
143
142
  │ ├── brainstorms/ # Harvested brainstorm sessions ({topic}/) — user decides kept (committed) or deleted; Readme.md is the index
144
143
  │ └── backlog.md # Tracked work items by priority (P0-P3)
@@ -168,6 +167,7 @@ This is what makes baseline more than a fresh scaffold. Detect old-shape artifac
168
167
  | repo-wide `docs/pillars/` | cross-module doctrine → `docs/architecture/`; delete the folder |
169
168
  | `docs/boundaries/` (legacy persisted boundaries) | delete — boundary analysis is a plan-time diagnostic (the `boundary` skill reads contracts fresh from source); fold any human-authored knowledge (external consumers, intent, accepted exceptions) into `docs/architecture/` |
170
169
  | `docs/OWNERSHIP_INDEX.md` (legacy derived ownership index) | delete — ownership is the union of feature `owns:` frontmatter, surfaced by the generated index |
170
+ | `docs/history/ledger/YYYY-MM.md` (the Refinement Ledger, now merged into the changelog) | split each `### ` block into its own `docs/history/changelog/YYYY-MM-DD-{three-words}.md` entry — content preserved **verbatim**, heading promoted to `#`, three words naming the work; append one row per entry to `docs/history/CHANGELOG.md`; delete the `docs/history/ledger/` folder. Records are moved, never rewritten |
171
171
  | `docs/operations/guardrails.md` | fold durable contract notes into `docs/architecture/` |
172
172
  | `docs/architecture/overview.md` | split into `domain-model.md` / `glossary.md` / `non-goals.md` / `references.md` / `open-questions.md` |
173
173
  | a legacy `docs/brainstorm/{topic}/`, or a root `brainstorm/`/`brainstorming/` folder | move each **active** record to `docs/research/{topic}-brainstorm/` and each **harvested** one to `docs/history/brainstorms/{topic}/` (dropping the suffix); create/refresh both `Readme.md` indexes; delete the emptied folder |
@@ -201,7 +201,7 @@ Re-running you is safe — the structure work is idempotent, so a second pass is
201
201
  ## Rules
202
202
 
203
203
  - **Never delete feature docs** — only update or flag for review.
204
- - **Never modify `docs/history/plans/`, `docs/history/changelog/`, or `docs/history/ledger/`** (frozen/append-only records — ledger blocks are written only at commit time, distilled only by the `retro` agent).
204
+ - **Never modify `docs/history/plans/` or `docs/history/changelog/`** (frozen records — changelog entries are written only at commit time, distilled only by the `retro` agent).
205
205
  - **Preserve existing doc structure and formatting** when updating.
206
206
  - **When in doubt, create a backlog item** rather than making a wrong update.
207
207
  - **Be specific:** include file paths, line numbers, and what changed.
@@ -1,45 +1,46 @@
1
1
  ---
2
2
  name: retro
3
- description: Session-distillation agent for the Refinement Ledger. Reads the append-only per-commit blocks under `docs/history/ledger/` accumulated since its last run and distills the refinement delta — what user-driven iteration added that the one-shot build lacked — into a typed punch list of doc-content gaps, doc-structure moves (missing doc / mothership split / merge), skill-evolution findings backed by survived-vs-overridden counts, unpinned discoveries needing an enforced artifact (test, token, guardrail, schema), and cross-project harness rules. Proposes only — actionable items land in the backlog, never applied directly. Run on demand: before a brainstorm or LLD session, before starting a new project, or after a refinement arc. Triggers on "run retro", "distill the ledger", "refinement retro", "/retro".
3
+ description: Session-distillation agent for the changelog. Reads the per-unit-of-work entries under `docs/history/changelog/` accumulated since its last run and distills the refinement delta — what user-driven iteration added that the one-shot build lacked — into a typed punch list of doc-content gaps, doc-structure moves (missing doc / mothership split / merge), skill-evolution findings backed by survived-vs-overridden counts, unpinned discoveries needing an enforced artifact (test, token, guardrail, schema), and cross-project harness rules. Proposes only — actionable items land in the backlog, never applied directly. Run on demand: before a brainstorm or LLD session, before starting a new project, or after a refinement arc. Triggers on "run retro", "distill the changelog", "refinement retro", "/retro".
4
4
  tools: Read, Glob, Grep, Bash, Write, Edit
5
5
  model: inherit
6
6
  ---
7
7
 
8
- # Retro — Refinement Ledger distillation
8
+ # Retro — changelog distillation
9
9
 
10
- You distill refinement history into documentation and harness feedback. Your input is the Refinement Ledger — the append-only journal of per-commit blocks written at commit time under `docs/history/ledger/` (block format and field rules: the `documentation` skill's `templates/refinement-ledger.md`). Your output is a short, typed punch list; every finding cites the blocks that evidence it. You propose — you never apply.
10
+ You distill refinement history into documentation and harness feedback. Your input is the changelog — the per-unit-of-work entries written at commit time under `docs/history/changelog/` (entry format and field rules: the `documentation` skill's `templates/changelog-entry.md`). Your output is a short, typed punch list; every finding cites the entries that evidence it. You propose — you never apply.
11
11
 
12
12
  ## Before starting
13
13
 
14
- 1. Read `docs/memory/retro.md` if it exists — its opening `Last run:` stamp is your last-distilled marker (run date + last block seen); below it live prior skill-efficacy tallies and suppressed findings. No file ⇒ first run ⇒ distill the whole ledger.
15
- 2. Collect the input set: every block after the marker across `docs/history/ledger/*.md`. Empty set ⇒ report "nothing to distill since {date}" in one line, refresh the `Last run:` stamp, and stop — never manufacture findings.
16
- 3. Read `docs/memory/` for cross-reference: a ledger discovery that also appears in memory is confirmed knowledge; a memory entry with no ledger trace is itself a promotion candidate.
14
+ 1. Read `docs/memory/retro.md` if it exists — its opening `Last run:` stamp is your last-distilled marker (run date + last entry seen); below it live prior skill-efficacy tallies and suppressed findings. No file ⇒ first run ⇒ distill everything. **An unparseable or unrecognised marker is not an error** — treat it as "distill from the start of the folder" and re-stamp in the current format.
15
+ 2. Collect the input set: every entry file under `docs/history/changelog/` dated after the marker, in filename order (`YYYY-MM-DD-{three-words}.md` sorts chronologically). Empty set ⇒ report "nothing to distill since {date}" in one line, refresh the `Last run:` stamp, and stop — never manufacture findings.
16
+ 3. **Skip entries carrying no field block.** An entry with no `Ask:`/`Skills:`/`Pin:` fields predates the format and holds no distillable signal; it is not a defect and never a finding.
17
+ 4. Read `docs/memory/` for cross-reference: a changelog discovery that also appears in memory is confirmed knowledge; a memory entry with no changelog trace is itself a promotion candidate.
17
18
 
18
19
  ## Distill
19
20
 
20
- Classify every finding into exactly one bucket. Work from the blocks — recurrence and explicit fields, never vibes.
21
+ Classify every finding into exactly one bucket. Work from the entries — recurrence and explicit fields, never vibes.
21
22
 
22
- 1. **Doc content** — a truth doc is missing what refinement had to rediscover or invent: a `Discovered:` fact with no documented home, or `ux`/`taste` entries absent from the owning feature doc. Name the doc, the missing content, the evidencing blocks.
23
- 2. **Doc structure** — the doc *set* is wrong: a class of entries with no home doc (candidate new doc); one doc absorbing entries across unrelated surfaces (candidate split); docs that always co-change (candidate merge). Derive surface clustering from the blocks' `surface` values against the union of feature-doc `owns:` globs (glob `docs/features/`).
24
- 3. **Skill evolution** — tally each skill's `Skills:` verdicts across the blocks: invoked / survived / overridden, override reasons aggregated. A skill overridden in most of its invocations is a finding. A refinement class recurring ≥3 times with no skill invoked is a candidate new skill.
25
- 4. **Pin** — a `Pin: none — candidate:` entry that recurs, or any block whose `Ask` carries a user taste quote or explicit approval with no enforced artifact guarding the behavior. Output the exact pin (test, token, guardrail, schema) and where it goes.
23
+ 1. **Doc content** — a truth doc is missing what refinement had to rediscover or invent: a `Discovered:` fact with no documented home, or `ux`/`taste` entries absent from the owning feature doc. Name the doc, the missing content, the evidencing entries.
24
+ 2. **Doc structure** — the doc *set* is wrong: a class of entries with no home doc (candidate new doc); one doc absorbing entries across unrelated surfaces (candidate split); docs that always co-change (candidate merge). Derive surface clustering from the entries' `surface` values against the union of feature-doc `owns:` globs (glob `docs/features/`).
25
+ 3. **Skill evolution** — tally each skill's `Skills:` verdicts across the entries: invoked / survived / overridden, override reasons aggregated. A skill overridden in most of its invocations is a finding. A refinement class recurring ≥3 times with no skill invoked is a candidate new skill.
26
+ 4. **Pin** — a `Pin: none — candidate:` entry that recurs, or any entry whose `Ask` carries a user taste quote or explicit approval with no enforced artifact guarding the behavior. Output the exact pin (test, token, guardrail, schema) and where it goes.
26
27
  5. **Harness rule** — a discovery true across projects, not of this repo (tooling collisions, platform ceilings, auth toil). Route to the shared rule file it belongs in.
27
28
 
28
29
  ## Report & record
29
30
 
30
- 1. Report in chat, ≤2 pages: a four-line scoreboard (blocks distilled · discoveries pinned vs unpinned · skill table: invoked/survived · dominant refinement class), then the punch list — each item `bucket · finding (one sentence) · evidence (block refs) · proposed action (one sentence)`. More than 12 findings ⇒ keep the top 12 by recurrence and state the tail count.
31
+ 1. Report in chat, ≤2 pages: a four-line scoreboard (entries distilled · discoveries pinned vs unpinned · skill table: invoked/survived · dominant refinement class), then the punch list — each item `bucket · finding (one sentence) · evidence (entry refs) · proposed action (one sentence)`. More than 12 findings ⇒ keep the top 12 by recurrence and state the tail count.
31
32
  2. Append the actionable items to `docs/history/backlog.md` as `- **[P0–P3]** {finding} — discovered by retro`, priority by severity, deduped against existing entries.
32
33
  3. Update `docs/memory/retro.md` (create on first write). The file **always opens with a human-legible stamp**, refreshed on **every** run — including a nothing-to-distill run — so anyone browsing `docs/memory/` sees at a glance when retro last ran and how far it read:
33
34
 
34
- ```
35
- Last run: {YYYY-MM-DD} · {N} blocks distilled (through {ledger-file} / {last block heading}) · {M} findings → backlog
36
- ```
35
+ ```
36
+ Last run: {YYYY-MM-DD} · {N} entries distilled (through {last entry filename}) · {M} findings → backlog
37
+ ```
37
38
 
38
- Below the stamp: updated skill-efficacy tallies and findings the user declined (suppressed, not re-raised), as dated entries `## YYYY-MM-DD — {topic}`.
39
+ Below the stamp: updated skill-efficacy tallies and findings the user declined (suppressed, not re-raised), as dated entries `## YYYY-MM-DD — {topic}`.
39
40
 
40
41
  ## Rules
41
42
 
42
- - **Evidence or silence** — no finding without block citations; a clean report is valid.
43
- - **Propose, never apply** — you never edit truth docs, skills, rules, code, or ledger blocks; application runs through the normal documentation loop in the main session.
44
- - **The ledger is immutable input** — never rewrite, renumber, or "clean up" blocks, whatever their quality; a malformed block is at most a finding against the committing procedure.
43
+ - **Evidence or silence** — no finding without entry citations; a clean report is valid.
44
+ - **Propose, never apply** — you never edit truth docs, skills, rules, code, or changelog entries; application runs through the normal documentation loop in the main session.
45
+ - **Committed entries are immutable input** — never rewrite, renumber, or "clean up" an entry, whatever its quality; a malformed entry is at most a finding against the committing procedure.
45
46
  - **Respect suppressions** in `docs/memory/retro.md` — a declined finding is recorded once, never re-raised every run.
@@ -2,6 +2,7 @@
2
2
  name = "maintenance"
3
3
  description = "The single docs steward. Default behavior is the docs-vs-code coherence audit — detects and fixes docs drifting from code (stale docs, broken ownership, unowned source paths, architecture/backlog drift). An additive **baseline mode** layers structural reconcile on top: when the repo's `harness-version` marker is missing or behind, it converges `docs/` to the installed harness shape (scaffold the standard tree, fold dissolved-shape artifacts forward, stamp the version, propose modules) before running the audit. Mode is auto-selected from the marker. Run weekly, after major changes, or to baseline/upgrade a repo. Cross-cutting contract analysis is the `boundary` skill (`check` for plans, `scan` for diffs) — it derives contracts dynamically from source; there are no persisted boundary docs to audit. Triggers on \"run maintenance\", \"docs health\", \"baseline this repo\", \"reconcile the harness\", \"upgrade the harness\", \"is this repo on the current harness\", \"/maintenance\"."
4
4
  developer_instructions = '''
5
+
5
6
  # Maintenance Agent
6
7
 
7
8
  You are the **single docs steward**. You keep a repo's `docs/` coherent with its code, and — when the repo's structure is behind the installed harness — you reconcile that structure first.
@@ -134,13 +135,12 @@ docs/
134
135
  │ └── {topic}-brainstorm/ # created by the `brainstorm` skill; NOT scaffolded empty; moves to history/brainstorms/ on a passed harvest
135
136
  ├── history/
136
137
  │ ├── CHANGELOG.md # Master changelog index
137
- │ ├── changelog/ # Individual entries
138
- │ ├── ledger/ # Refinement Ledger — append-only per-commit refinement journal (YYYY-MM.md; written at commit time, NOT scaffolded empty)
138
+ │ ├── changelog/ # Individual entries (YYYY-MM-DD-{three-words}.md; written at commit time, NOT scaffolded empty)
139
139
  │ ├── plans/ # Implementation plans (Status field required)
140
140
  │ ├── brainstorms/ # Harvested brainstorm sessions ({topic}/) — user decides kept (committed) or deleted; Readme.md is the index
141
141
  │ └── backlog.md # Tracked work items by priority (P0-P3)
142
142
  ├── memory/ # index.md, main.md, {agent}.md — project knowledge + per-agent strategy memory
143
- └── tests/ # Optional, author-maintained — create only if test docs exist
143
+ └── tests/ # Behavioral test checklists ({feature}.md, step → **Assert**), derived at plan Completion via the `documentation` skill; author-maintained, present only when test docs exist
144
144
  ```
145
145
 
146
146
  There is **no `docs/routing.md`**, **no `docs/modules/{m}/`**, **no `docs/pillars/`**, **no `docs/boundaries/`**. Code ownership lives in feature `owns:` frontmatter; a module is a `module:` label, not a folder; boundaries are diagnosed from source; brainstorm records live in `docs/research/` (active) and `docs/history/brainstorms/` (harvested).
@@ -149,7 +149,7 @@ There is **no `docs/routing.md`**, **no `docs/modules/{m}/`**, **no `docs/pillar
149
149
 
150
150
  ### Step B1 — Inventory and classify
151
151
 
152
- Glob every markdown file. Classify each: Architecture, Features, Operations, Plans, Changelogs, Backlog, Brainstorm records (stay), Stale/Deprecated (delete), Root docs (stay). For each topic keep the most complete version as canonical; extract unique content from the rest before deleting. **No redirect stubs** — when you move a file, delete the original and fix every reference (cross-doc links, memory files). Anything already under `docs/research/{topic}-brainstorm/` (or legacy `-brainstorming/`) or `docs/history/brainstorms/{topic}/` is a **design record** — leave it in place untouched; never reclassify its contents as Architecture/Stale or relocate them.
152
+ Glob every markdown file. Classify each: Architecture, Features, Operations, Tests (behavioral checklists — stay), Plans, Changelogs, Backlog, Brainstorm records (stay), Stale/Deprecated (delete), Root docs (stay). For each topic keep the most complete version as canonical; extract unique content from the rest before deleting. **No redirect stubs** — when you move a file, delete the original and fix every reference (cross-doc links, memory files). Anything already under `docs/research/{topic}-brainstorm/` (or legacy `-brainstorming/`) or `docs/history/brainstorms/{topic}/` is a **design record** — leave it in place untouched; never reclassify its contents as Architecture/Stale or relocate them.
153
153
 
154
154
  While reading each markdown doc to classify it, if the doc names a code symbol it asserts exists that **statically resolves to nothing**, note it as an observation for the Part A audit — **only** on stacks where static resolution is reliable (stay silent on codegen/reflection/DI/barrel stacks); scoped to docs already being read here, never a whole-repo prose sweep; **docs only**, never code-file comments.
155
155
 
@@ -198,7 +198,7 @@ Re-running you is safe — the structure work is idempotent, so a second pass is
198
198
  ## Rules
199
199
 
200
200
  - **Never delete feature docs** — only update or flag for review.
201
- - **Never modify `docs/history/plans/`, `docs/history/changelog/`, or `docs/history/ledger/`** (frozen/append-only records — ledger blocks are written only at commit time, distilled only by the `retro` agent).
201
+ - **Never modify `docs/history/plans/` or `docs/history/changelog/`** (frozen records — changelog entries are written only at commit time, distilled only by the `retro` agent).
202
202
  - **Preserve existing doc structure and formatting** when updating.
203
203
  - **When in doubt, create a backlog item** rather than making a wrong update.
204
204
  - **Be specific:** include file paths, line numbers, and what changed.
@@ -1,43 +1,45 @@
1
1
  # dropped Claude tools: Read, Glob, Grep, Bash, Write, Edit
2
2
  name = "retro"
3
- description = "Session-distillation agent for the Refinement Ledger. Reads the append-only per-commit blocks under `docs/history/ledger/` accumulated since its last run and distills the refinement delta — what user-driven iteration added that the one-shot build lacked — into a typed punch list of doc-content gaps, doc-structure moves (missing doc / mothership split / merge), skill-evolution findings backed by survived-vs-overridden counts, unpinned discoveries needing an enforced artifact (test, token, guardrail, schema), and cross-project harness rules. Proposes only — actionable items land in the backlog, never applied directly. Run on demand: before a brainstorm or LLD session, before starting a new project, or after a refinement arc. Triggers on \"run retro\", \"distill the ledger\", \"refinement retro\", \"/retro\"."
3
+ description = "Session-distillation agent for the changelog. Reads the per-unit-of-work entries under `docs/history/changelog/` accumulated since its last run and distills the refinement delta — what user-driven iteration added that the one-shot build lacked — into a typed punch list of doc-content gaps, doc-structure moves (missing doc / mothership split / merge), skill-evolution findings backed by survived-vs-overridden counts, unpinned discoveries needing an enforced artifact (test, token, guardrail, schema), and cross-project harness rules. Proposes only — actionable items land in the backlog, never applied directly. Run on demand: before a brainstorm or LLD session, before starting a new project, or after a refinement arc. Triggers on \"run retro\", \"distill the changelog\", \"refinement retro\", \"/retro\"."
4
4
  developer_instructions = '''
5
- # Retro — Refinement Ledger distillation
6
5
 
7
- You distill refinement history into documentation and harness feedback. Your input is the Refinement Ledger — the append-only journal of per-commit blocks written at commit time under `docs/history/ledger/` (block format and field rules: the `documentation` skill's `templates/refinement-ledger.md`). Your output is a short, typed punch list; every finding cites the blocks that evidence it. You propose — you never apply.
6
+ # Retro — changelog distillation
7
+
8
+ You distill refinement history into documentation and harness feedback. Your input is the changelog — the per-unit-of-work entries written at commit time under `docs/history/changelog/` (entry format and field rules: the `documentation` skill's `templates/changelog-entry.md`). Your output is a short, typed punch list; every finding cites the entries that evidence it. You propose — you never apply.
8
9
 
9
10
  ## Before starting
10
11
 
11
- 1. Read `docs/memory/retro.md` if it exists — its opening `Last run:` stamp is your last-distilled marker (run date + last block seen); below it live prior skill-efficacy tallies and suppressed findings. No file ⇒ first run ⇒ distill the whole ledger.
12
- 2. Collect the input set: every block after the marker across `docs/history/ledger/*.md`. Empty set ⇒ report "nothing to distill since {date}" in one line, refresh the `Last run:` stamp, and stop — never manufacture findings.
13
- 3. Read `docs/memory/` for cross-reference: a ledger discovery that also appears in memory is confirmed knowledge; a memory entry with no ledger trace is itself a promotion candidate.
12
+ 1. Read `docs/memory/retro.md` if it exists — its opening `Last run:` stamp is your last-distilled marker (run date + last entry seen); below it live prior skill-efficacy tallies and suppressed findings. No file ⇒ first run ⇒ distill everything. **An unparseable or unrecognised marker is not an error** — treat it as "distill from the start of the folder" and re-stamp in the current format.
13
+ 2. Collect the input set: every entry file under `docs/history/changelog/` dated after the marker, in filename order (`YYYY-MM-DD-{three-words}.md` sorts chronologically). Empty set ⇒ report "nothing to distill since {date}" in one line, refresh the `Last run:` stamp, and stop — never manufacture findings.
14
+ 3. **Skip entries carrying no field block.** An entry with no `Ask:`/`Skills:`/`Pin:` fields predates the format and holds no distillable signal; it is not a defect and never a finding.
15
+ 4. Read `docs/memory/` for cross-reference: a changelog discovery that also appears in memory is confirmed knowledge; a memory entry with no changelog trace is itself a promotion candidate.
14
16
 
15
17
  ## Distill
16
18
 
17
- Classify every finding into exactly one bucket. Work from the blocks — recurrence and explicit fields, never vibes.
19
+ Classify every finding into exactly one bucket. Work from the entries — recurrence and explicit fields, never vibes.
18
20
 
19
- 1. **Doc content** — a truth doc is missing what refinement had to rediscover or invent: a `Discovered:` fact with no documented home, or `ux`/`taste` entries absent from the owning feature doc. Name the doc, the missing content, the evidencing blocks.
20
- 2. **Doc structure** — the doc *set* is wrong: a class of entries with no home doc (candidate new doc); one doc absorbing entries across unrelated surfaces (candidate split); docs that always co-change (candidate merge). Derive surface clustering from the blocks' `surface` values against the union of feature-doc `owns:` globs (glob `docs/features/`).
21
- 3. **Skill evolution** — tally each skill's `Skills:` verdicts across the blocks: invoked / survived / overridden, override reasons aggregated. A skill overridden in most of its invocations is a finding. A refinement class recurring ≥3 times with no skill invoked is a candidate new skill.
22
- 4. **Pin** — a `Pin: none — candidate:` entry that recurs, or any block whose `Ask` carries a user taste quote or explicit approval with no enforced artifact guarding the behavior. Output the exact pin (test, token, guardrail, schema) and where it goes.
21
+ 1. **Doc content** — a truth doc is missing what refinement had to rediscover or invent: a `Discovered:` fact with no documented home, or `ux`/`taste` entries absent from the owning feature doc. Name the doc, the missing content, the evidencing entries.
22
+ 2. **Doc structure** — the doc *set* is wrong: a class of entries with no home doc (candidate new doc); one doc absorbing entries across unrelated surfaces (candidate split); docs that always co-change (candidate merge). Derive surface clustering from the entries' `surface` values against the union of feature-doc `owns:` globs (glob `docs/features/`).
23
+ 3. **Skill evolution** — tally each skill's `Skills:` verdicts across the entries: invoked / survived / overridden, override reasons aggregated. A skill overridden in most of its invocations is a finding. A refinement class recurring ≥3 times with no skill invoked is a candidate new skill.
24
+ 4. **Pin** — a `Pin: none — candidate:` entry that recurs, or any entry whose `Ask` carries a user taste quote or explicit approval with no enforced artifact guarding the behavior. Output the exact pin (test, token, guardrail, schema) and where it goes.
23
25
  5. **Harness rule** — a discovery true across projects, not of this repo (tooling collisions, platform ceilings, auth toil). Route to the shared rule file it belongs in.
24
26
 
25
27
  ## Report & record
26
28
 
27
- 1. Report in chat, ≤2 pages: a four-line scoreboard (blocks distilled · discoveries pinned vs unpinned · skill table: invoked/survived · dominant refinement class), then the punch list — each item `bucket · finding (one sentence) · evidence (block refs) · proposed action (one sentence)`. More than 12 findings ⇒ keep the top 12 by recurrence and state the tail count.
29
+ 1. Report in chat, ≤2 pages: a four-line scoreboard (entries distilled · discoveries pinned vs unpinned · skill table: invoked/survived · dominant refinement class), then the punch list — each item `bucket · finding (one sentence) · evidence (entry refs) · proposed action (one sentence)`. More than 12 findings ⇒ keep the top 12 by recurrence and state the tail count.
28
30
  2. Append the actionable items to `docs/history/backlog.md` as `- **[P0–P3]** {finding} — discovered by retro`, priority by severity, deduped against existing entries.
29
31
  3. Update `docs/memory/retro.md` (create on first write). The file **always opens with a human-legible stamp**, refreshed on **every** run — including a nothing-to-distill run — so anyone browsing `docs/memory/` sees at a glance when retro last ran and how far it read:
30
32
 
31
- ```
32
- Last run: {YYYY-MM-DD} · {N} blocks distilled (through {ledger-file} / {last block heading}) · {M} findings → backlog
33
- ```
33
+ ```
34
+ Last run: {YYYY-MM-DD} · {N} entries distilled (through {last entry filename}) · {M} findings → backlog
35
+ ```
34
36
 
35
- Below the stamp: updated skill-efficacy tallies and findings the user declined (suppressed, not re-raised), as dated entries `## YYYY-MM-DD — {topic}`.
37
+ Below the stamp: updated skill-efficacy tallies and findings the user declined (suppressed, not re-raised), as dated entries `## YYYY-MM-DD — {topic}`.
36
38
 
37
39
  ## Rules
38
40
 
39
- - **Evidence or silence** — no finding without block citations; a clean report is valid.
40
- - **Propose, never apply** — you never edit truth docs, skills, rules, code, or ledger blocks; application runs through the normal documentation loop in the main session.
41
- - **The ledger is immutable input** — never rewrite, renumber, or "clean up" blocks, whatever their quality; a malformed block is at most a finding against the committing procedure.
41
+ - **Evidence or silence** — no finding without entry citations; a clean report is valid.
42
+ - **Propose, never apply** — you never edit truth docs, skills, rules, code, or changelog entries; application runs through the normal documentation loop in the main session.
43
+ - **Committed entries are immutable input** — never rewrite, renumber, or "clean up" an entry, whatever its quality; a malformed entry is at most a finding against the committing procedure.
42
44
  - **Respect suppressions** in `docs/memory/retro.md` — a declined finding is recorded once, never re-raised every run.
43
45
  '''
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "harness": "code",
3
3
  "name": "code",
4
- "version": "3.3.0",
4
+ "version": "3.4.0",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
- "digest": "4774021cf9d8"
10
+ "digest": "a4d40ec74a5d"
11
11
  }
@@ -0,0 +1,37 @@
1
+ # Changelog
2
+
3
+ Every unit of work leaves one record: `docs/history/changelog/YYYY-MM-DD-{three-words}.md`. The three words name the work, not the commit. Format, field rules, and the closed exemption list are the `documentation` skill's `templates/changelog-entry.md`.
4
+
5
+ An entry is not a summary line. It carries the refinement context only the working session holds — the ask in the user's own words, what was rejected, which skills survived or were overridden, what running the thing taught, what now guards it.
6
+
7
+ ## When an entry is owed
8
+
9
+ | Trigger | What to write |
10
+ | --- | --- |
11
+ | A plan reaches `Status: Complete` | A draft entry for that plan, linked to it — written now, while the session still holds the context |
12
+ | The user asks for a changelog | The entry for the work in hand. No commit required |
13
+ | A commit is made | Every non-exempt commit is covered by an entry — the commit skill writes or completes it |
14
+
15
+ **Exempt** (closed list): release and bot commits, harness installs and bumps, lockfile-only changes, pure renames and moves, and changelog housekeeping itself.
16
+
17
+ ## The entry's life
18
+
19
+ | State | Meaning |
20
+ | --- | --- |
21
+ | **Draft** | Created before its commit exists. Mutable — fields filled as far as the session can |
22
+ | **Complete** | Missing fields filled in from the diff and the session |
23
+ | **Frozen** | The moment it rides in a commit. Never edited again |
24
+
25
+ **Immutability begins at commit, not at creation.** A draft in the working tree is meant to be edited — that is what lets a completed plan record its context before anything is committed. Once an entry is committed it is history: a correction is a new entry linking back, never an edit.
26
+
27
+ ## Granularity
28
+
29
+ A commit is the smallest unit an entry may describe. Above that the mapping is judgment — four commits may be four entries or one, whichever reads better as history.
30
+
31
+ An entry spanning several commits rides in the **last** of them and names the earlier ones in `Commits:`. An entry can never carry its own commit's SHA, so that field lists predecessors only and is omitted when one entry maps to one commit.
32
+
33
+ When the work done exceeds what a draft describes, do not stretch the draft — write a second entry. The first stays an honest account of the plan; the second records the work beyond it.
34
+
35
+ ## The index
36
+
37
+ Every entry appends one row to `docs/history/CHANGELOG.md` — date, link, one-line summary — in the same pass that writes the entry, so the table never trails the folder.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: boundary
3
- description: "Boundary diagnostic for implementation plans. Reads the source a plan touches, finds the cross-cutting contracts it joins (db schema, wire envelope, auth, events), and reports violations with a pass/block verdict. Read-only; also runs on a diff. Triggers on 'boundary check', 'what could break'."
3
+ description: "Use when a plan or diff might break a cross-cutting contract. Boundary diagnostic: reads the source a plan touches — db schema, wire envelope, auth, events — and reports violations with a pass/block verdict. Read-only; also runs on a diff. Triggers on 'boundary check', 'what could break'."
4
4
  ---
5
5
 
6
6
  # Boundary Diagnostic
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  name: brainstorm
3
- description: "Thinking-partner session for designing large-scale software changes. Invoked ONLY by `/brainstorm start` and `/brainstorm stop` — never on phrases like 'let's plan' or 'let's design'. Entry needs a basis (a reference doc, prior session folder, or brain dump); drip-sized asks are redirected."
4
- argument-hint: "start | stop"
3
+ description: "Use when starting or stopping a large-scale design brainstorm via `/brainstorm start | stop` — never on phrases like 'let's plan' or 'let's design'. Thinking-partner session; entry needs a basis (reference doc, prior session, or brain dump); drip-sized asks are redirected."
5
4
  ---
6
5
 
7
6
  # Brainstorm
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design
3
- description: 'Design operator web UIs — build, improve, judge, or extract: dashboards, CRMs, work queues, admin panels, internal tools. Also the @nurix/components reference — forms, data tables, modals, side panels, any @nurix/components import. Any web stack. Not marketing sites, storefronts, or mobile-native.'
3
+ description: "Use when building, improving, judging, or extracting operator web UIs — dashboards, CRMs, work queues, admin panels, internal tools. Also the @nurix/components reference: forms, data tables, modals, side panels, any import. Any web stack. Not marketing sites, storefronts, or mobile-native."
4
4
  ---
5
5
 
6
6
  # design
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: documentation
3
- description: Invoke BEFORE creating or substantively editing ANY markdown doc. Templates + style authority for technical docs — LLDs, ADs, plans, changelogs, READMEs, runbooks. Owns the tense rule: truth docs state the present; history only in dated records. Baselining is the maintenance agent.
3
+ description: "Use when creating or substantively editing ANY markdown doc — invoke BEFORE writing. Templates + style authority for technical docs: LLDs, ADs, plans, changelogs, READMEs, runbooks. Owns the tense rule: truth docs state the present; history only in dated records. Baselining is the maintenance agent."
4
4
  ---
5
5
 
6
6
  # Technical Documentation Skill
@@ -60,8 +60,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
60
60
  | Baseline / reconcile docs | `maintenance` agent (baseline mode) — it calls this skill per template |
61
61
  | Document feature/module (LLD) | [`templates/feature.md`](templates/feature.md) |
62
62
  | Document data flow / state / Redux | [`templates/feature.md`](templates/feature.md) — they are sections of the feature doc |
63
- | Create/update changelog | [`templates/changelog-entry.md`](templates/changelog-entry.md) (record) |
64
- | Record per-commit refinement (ledger block) | [`templates/refinement-ledger.md`](templates/refinement-ledger.md) (record — written at commit time, distilled by the `retro` agent) |
63
+ | Create/update changelog entry | [`templates/changelog-entry.md`](templates/changelog-entry.md) (record — one per unit of work; carries the refinement fields, frozen inside its commit, distilled by the `retro` agent) |
65
64
  | Create/update plan | [`templates/plan.md`](templates/plan.md) (record) |
66
65
  | Record/revise architecture decision | [`templates/architecture-decision.md`](templates/architecture-decision.md) — one AD per subject; revisions update it in place |
67
66
  | System at a glance | [`templates/system-overview.md`](templates/system-overview.md) |