simt-dev 0.7.0 → 0.8.0

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 (235) hide show
  1. package/CHANGELOG.md +191 -870
  2. package/README.md +188 -213
  3. package/bin/simt.mjs +19 -55
  4. package/docs/decisions/ADR-014-workspace-is-configuration.md +2 -2
  5. package/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +1 -1
  6. package/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +1 -1
  7. package/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +1 -1
  8. package/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +1 -1
  9. package/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +1 -1
  10. package/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +1 -1
  11. package/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +1 -1
  12. package/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +1 -1
  13. package/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +1 -1
  14. package/docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md +81 -0
  15. package/docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md +91 -0
  16. package/docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md +90 -0
  17. package/docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md +96 -0
  18. package/docs/decisions/ADR-122-the-shims-move-into-the-state-directory-and-the-legacy-directory-removes-itself.md +94 -0
  19. package/docs/decisions/ADR-123-a-surplus-positional-is-not-refused-because-arity-is-not-in-the-source.md +57 -0
  20. package/docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md +64 -0
  21. package/docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md +65 -0
  22. package/docs/decisions/ADR-126-the-mcp-surface-stays-a-reader-so-there-is-no-write-path-to-build.md +68 -0
  23. package/docs/decisions/ADR-127-the-mcp-tool-list-is-written-by-hand-and-roots-is-not-asked-for.md +65 -0
  24. package/docs/decisions/ADR-128-a-research-plan-is-a-plan-and-the-tracker-reads-it.md +42 -0
  25. package/ecosystems/bun.json +6 -0
  26. package/ecosystems/cargo.json +25 -0
  27. package/ecosystems/composer.json +6 -0
  28. package/ecosystems/dart.json +24 -0
  29. package/ecosystems/deno.json +21 -0
  30. package/ecosystems/devcontainers.json +6 -0
  31. package/ecosystems/docker-compose.json +6 -0
  32. package/ecosystems/docker.json +6 -0
  33. package/ecosystems/dotnet.json +25 -0
  34. package/ecosystems/elixir.json +23 -0
  35. package/ecosystems/gitsubmodule.json +6 -0
  36. package/ecosystems/go.json +25 -0
  37. package/ecosystems/gradle.json +13 -0
  38. package/ecosystems/maven.json +23 -0
  39. package/ecosystems/node.json +25 -0
  40. package/ecosystems/python.json +20 -0
  41. package/ecosystems/ruby.json +23 -0
  42. package/ecosystems/swift.json +25 -0
  43. package/ecosystems/terraform.json +6 -0
  44. package/ecosystems/uv.json +6 -0
  45. package/harnesses/antigravity.json +162 -0
  46. package/harnesses/claude.json +206 -0
  47. package/harnesses/codex.json +136 -0
  48. package/harnesses/copilot.json +88 -0
  49. package/harnesses/cursor.json +140 -0
  50. package/harnesses/deepseek.json +99 -0
  51. package/harnesses/gemini.json +122 -0
  52. package/harnesses/opencode.json +173 -0
  53. package/package.json +12 -2
  54. package/rules/core.md +7 -0
  55. package/rules/mdc/intake-questions.mdc +8 -0
  56. package/rules/mdc/slice-commit.mdc +57 -4
  57. package/src/advice/advice.mjs +3 -2
  58. package/src/agenthooks/prompt.mjs +5 -2
  59. package/src/agenthooks/render.mjs +86 -180
  60. package/src/agenthooks/shim.mjs +1 -1
  61. package/src/agents/render.mjs +15 -18
  62. package/src/api.mjs +31 -0
  63. package/src/argv.mjs +48 -3
  64. package/src/bench/ablate.mjs +3 -4
  65. package/src/bench/adapters.json +163 -105
  66. package/src/bench/adapters.mjs +466 -0
  67. package/src/bench/arms.mjs +333 -0
  68. package/src/bench/grade.mjs +33 -73
  69. package/src/bench/graders.mjs +42 -0
  70. package/src/bench/mine.mjs +121 -475
  71. package/src/bench/probe-ledger.mjs +149 -0
  72. package/src/bench/probes.catalog.mjs +918 -0
  73. package/src/bench/probes.mjs +79 -1064
  74. package/src/bench/render.mjs +111 -0
  75. package/src/bench/report.mjs +120 -962
  76. package/src/bench/run.mjs +185 -802
  77. package/src/bench/variants.mjs +4 -5
  78. package/src/bench/workspace.mjs +160 -0
  79. package/src/brief/assemble.mjs +48 -15
  80. package/src/ci/dependabot.mjs +25 -55
  81. package/src/ci/workflow.mjs +30 -7
  82. package/src/cli.mjs +45 -0
  83. package/src/commands/agent.mjs +4 -13
  84. package/src/commands/agenthook.mjs +70 -40
  85. package/src/commands/bench.mjs +191 -18
  86. package/src/commands/brief.mjs +5 -4
  87. package/src/commands/ci.mjs +13 -14
  88. package/src/commands/compare.mjs +42 -42
  89. package/src/commands/completions.mjs +2 -6
  90. package/src/commands/decide.mjs +4 -4
  91. package/src/commands/distill.mjs +4 -3
  92. package/src/commands/docs.mjs +88 -0
  93. package/src/commands/doctor.mjs +11 -7
  94. package/src/commands/evidence.mjs +6 -9
  95. package/src/commands/explain.mjs +0 -1
  96. package/src/commands/gate.mjs +26 -25
  97. package/src/commands/graph.mjs +2 -3
  98. package/src/commands/harness.mjs +6 -5
  99. package/src/commands/help.mjs +168 -19
  100. package/src/commands/hooks.mjs +119 -49
  101. package/src/commands/ignore.mjs +13 -8
  102. package/src/commands/impact.mjs +8 -15
  103. package/src/commands/index.mjs +318 -193
  104. package/src/commands/init-scan.mjs +90 -0
  105. package/src/commands/init.mjs +124 -105
  106. package/src/commands/lease.mjs +73 -25
  107. package/src/commands/lessons.mjs +10 -9
  108. package/src/commands/local.mjs +3 -3
  109. package/src/commands/map.mjs +24 -14
  110. package/src/commands/mcp.mjs +2 -18
  111. package/src/commands/pack.mjs +9 -6
  112. package/src/commands/plan.mjs +6 -5
  113. package/src/commands/plugin.mjs +2 -2
  114. package/src/commands/prbody.mjs +3 -3
  115. package/src/commands/repoindex.mjs +12 -11
  116. package/src/commands/review.mjs +2 -2
  117. package/src/commands/rules.mjs +37 -16
  118. package/src/commands/shared.mjs +14 -19
  119. package/src/commands/skills.mjs +33 -32
  120. package/src/commands/skillscompile.mjs +7 -8
  121. package/src/commands/skillsinstall.mjs +7 -6
  122. package/src/commands/slice.mjs +220 -74
  123. package/src/commands/spec.mjs +167 -0
  124. package/src/commands/status.mjs +27 -18
  125. package/src/commands/sync.mjs +27 -25
  126. package/src/commands/tests.mjs +18 -21
  127. package/src/commands/tokens.mjs +21 -26
  128. package/src/commands/undo.mjs +5 -15
  129. package/src/commands/upgrade.mjs +15 -7
  130. package/src/commands/why.mjs +15 -21
  131. package/src/compare/hooksstate.mjs +2 -6
  132. package/src/compare/learn.mjs +3 -1
  133. package/src/compare/row.mjs +0 -2
  134. package/src/context.mjs +64 -0
  135. package/src/decisions/index-doc.mjs +46 -0
  136. package/src/decisions/index.mjs +3 -2
  137. package/src/diff.mjs +1 -1
  138. package/src/distill/distill.mjs +14 -1
  139. package/src/distill/engine.mjs +5 -1
  140. package/src/docs/commands.mjs +65 -0
  141. package/src/ecosystem/records.mjs +219 -0
  142. package/src/explain.mjs +31 -0
  143. package/src/gates/index.mjs +385 -0
  144. package/src/graph/compile.mjs +8 -4
  145. package/src/graph/load.mjs +6 -2
  146. package/src/graph/spec.mjs +10 -8
  147. package/src/harness/records.mjs +143 -0
  148. package/src/hooks/capability.mjs +7 -5
  149. package/src/hooks/dispatcher.mjs +209 -60
  150. package/src/hooks/gates.mjs +10 -43
  151. package/src/hooks/resolve.mjs +4 -14
  152. package/src/hooks/shim.mjs +5 -2
  153. package/src/hooks/where.mjs +2 -7
  154. package/src/identity.mjs +31 -12
  155. package/src/index/coverage.mjs +58 -0
  156. package/src/index/extract.mjs +6 -16
  157. package/src/index/gate.mjs +1 -1
  158. package/src/index/govern.mjs +26 -9
  159. package/src/index/impact.mjs +4 -8
  160. package/src/index/map.mjs +14 -15
  161. package/src/index/open.mjs +173 -0
  162. package/src/index/persist.mjs +224 -57
  163. package/src/index/store.mjs +82 -39
  164. package/src/index/tests.mjs +2 -6
  165. package/src/journal.mjs +94 -20
  166. package/src/kernel/card.mjs +37 -63
  167. package/src/kernel/checks.mjs +4 -10
  168. package/src/lease.mjs +102 -7
  169. package/src/ledger/index.mjs +150 -14
  170. package/src/local/client.mjs +4 -6
  171. package/src/locate.mjs +33 -9
  172. package/src/manifest/schema.mjs +213 -0
  173. package/src/mcp/paginate.mjs +33 -0
  174. package/src/mcp/resources.mjs +7 -10
  175. package/src/mcp/schemas.mjs +512 -0
  176. package/src/mcp/server.mjs +119 -25
  177. package/src/mcp/tools-facts.mjs +326 -0
  178. package/src/mcp/tools-read.mjs +221 -0
  179. package/src/mcp/tools.mjs +4 -967
  180. package/src/measure/corpus.mjs +150 -0
  181. package/src/measure/metrics.mjs +236 -0
  182. package/src/measure/records.mjs +211 -0
  183. package/src/measure/session.mjs +3 -2
  184. package/src/measure/stats.mjs +538 -0
  185. package/src/measure/task-schema.mjs +125 -0
  186. package/src/measure/tasks.mjs +69 -0
  187. package/src/memory/decide.mjs +6 -15
  188. package/src/memory/lesson-text.mjs +61 -0
  189. package/src/memory/lessons.mjs +29 -82
  190. package/src/name.mjs +7 -0
  191. package/src/node-version.mjs +37 -0
  192. package/src/output/index.mjs +209 -10
  193. package/src/packs/manage.mjs +32 -12
  194. package/src/packs.mjs +20 -2
  195. package/src/plan/index.mjs +1 -1
  196. package/src/plugins.mjs +22 -16
  197. package/src/prbody.mjs +7 -11
  198. package/src/projection/loaders.mjs +7 -692
  199. package/src/projection/lock.mjs +11 -1
  200. package/src/projection/manifest.mjs +29 -468
  201. package/src/projection/mdc.mjs +7 -8
  202. package/src/projection/project.mjs +126 -221
  203. package/src/projection/region.mjs +561 -0
  204. package/src/projection/rules.mjs +20 -550
  205. package/src/projection/surfaces.mjs +43 -210
  206. package/src/projection/targets.mjs +5 -5
  207. package/src/repo-root.mjs +31 -0
  208. package/src/resolve/eval.mjs +2 -1
  209. package/src/resolve/fingerprint.mjs +19 -22
  210. package/src/resolve/resolve.mjs +1 -41
  211. package/src/review/critic.mjs +10 -13
  212. package/src/run.mjs +98 -0
  213. package/src/secrets.mjs +14 -22
  214. package/src/state/events.mjs +129 -0
  215. package/src/status-snapshot.mjs +233 -0
  216. package/src/status.mjs +2 -6
  217. package/src/sys/git.mjs +82 -0
  218. package/src/sys/proc.mjs +151 -0
  219. package/src/testing/parsers.mjs +265 -0
  220. package/src/testing/patches.mjs +23 -0
  221. package/src/testing/paths.mjs +49 -0
  222. package/src/testing/runners.mjs +186 -0
  223. package/src/testing/vault.mjs +68 -0
  224. package/src/text/frontmatter.mjs +49 -0
  225. package/src/text/tokens.mjs +52 -0
  226. package/src/toolwords.mjs +3 -0
  227. package/src/util/fs.mjs +20 -0
  228. package/src/util/sort.mjs +12 -0
  229. package/src/workspace.mjs +58 -11
  230. package/src/write/plan.mjs +82 -0
  231. package/templates/plan/tracker.json +1 -0
  232. package/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -82
  233. package/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -49
  234. package/docs/decisions/README.md +0 -600
  235. package/src/bench/tasks.mjs +0 -36
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # simt-dev
2
2
 
3
- ![simt-dev, the intelligence amplifier for coding agents, and its four claims. One: say less, always — a kernel under 2 KB whose bytes stay stable so the prompt cache survives. Two: answers over exploration — a local code graph and a short task brief. Three: enforce, don't instruct — dual gates, before a tool call and at git time. Four: close the loop — benches and memory. Beneath them, the harnesses it works across and its three channels.](https://raw.githubusercontent.com/QuazarMedia/simt-dev/main/res/59e21e6d-6bf2-4d7d-b6ea-c7349a697d11.jpg)
3
+ ![simt-dev, the intelligence amplifier for coding agents, and its four claims. One: say less, always — a kernel under 2 KB whose bytes stay stable so the prompt cache survives. Two: answers over exploration — a local code graph and a short task brief. Three: enforce, don't instruct — dual gates, before a tool call and at git time. Four: close the loop — benches and memory. Beneath them, the harnesses it works across and its three channels.](https://raw.githubusercontent.com/QuazarMedia/simt-dev/main/res/hero.jpg)
4
+
5
+ [![simt-dev own gate](https://github.com/QuazarMedia/simt-dev/actions/workflows/simt-dev-check.yml/badge.svg)](https://github.com/QuazarMedia/simt-dev/actions/workflows/simt-dev-check.yml)
4
6
 
5
7
  `simt` adopts a repository for the agents that work in it, and builds an intelligence
6
8
  amplifier around them: a brief that answers before the agent explores, gates that
@@ -72,97 +74,193 @@ beside its `.sha256`. Pin the release you download,
72
74
  and run this from the repository's top level:
73
75
 
74
76
  ```sh
75
- mkdir -p .simt/bin && os=$(uname -s | tr A-Z a-z) && arch=$(uname -m | sed "s/x86_64/x64/") && curl -fsSL "https://github.com/QuazarMedia/simt-dev/releases/download/v<version>/simt-dev-<version>-$os-$arch" -o .simt/bin/simt && chmod +x .simt/bin/simt
77
+ version=<version>; os=$(uname -s | tr A-Z a-z); arch=$(uname -m | sed "s/x86_64/x64/")
78
+ base="https://github.com/QuazarMedia/simt-dev/releases/download/v$version"
79
+ asset="simt-dev-$version-$os-$arch"; tmp=$(mktemp -d)
80
+ curl -fsSL "$base/$asset" -o "$tmp/$asset"
81
+ curl -fsSL "$base/$asset.sha256" -o "$tmp/$asset.sha256"
82
+ (cd "$tmp" && shasum -a 256 -c "$asset.sha256")
83
+ mkdir -p .simt/bin && mv "$tmp/$asset" .simt/bin/simt && chmod +x .simt/bin/simt
76
84
  ```
77
85
 
78
86
  The locator checks `.simt/bin/simt` before `PATH`, so the repository's own copy is the
79
87
  one its hooks and its CI run — this is the same command the hook shim prints as its
80
- remedy. The generated CI workflow downloads the same asset and verifies it against the
81
- published `.sha256` before running anything.
88
+ remedy. Both the snippet above and the generated CI workflow verify the asset against the
89
+ published `.sha256` before it runs: a digest that does not match stops the copy, so a
90
+ truncated or substituted download never becomes the command.
82
91
 
83
92
  ## What `simt` does
84
93
 
94
+ <!-- simt:commands:begin -->
95
+ <!-- Rendered from the spec by `simt docs readme --yes`; do not edit by hand. -->
96
+
85
97
  ```sh
86
- # Adopt, inspect, and maintain a repository
87
- simt init # adopt or scaffold; prints a plan; --yes writes
88
- simt doctor [--fix] # stack, facts, evidence, and config health (--fix applies safe remedies, journaled)
89
- simt check [--frozen] # projection drift, manifest, lock, and declared checkers
90
- simt sync [--explain] --yes # regenerate the projection
91
- simt upgrade --yes # move every consumer in the workspace to this SHA
92
-
93
- # Orient on a task and query the local code and governance graph
94
- simt brief "<task>" # one <= 2 KB packet: kind, commands, files, tests, ADRs, skills, lessons
95
- simt index [--embed] # files, symbols, edges, FTS5 tokens (+ optional local embeddings)
96
- simt map --task "<task>" # hybrid BM25 + PageRank + resolver file ranking (outline|names|signatures)
97
- simt impact <file|symbol> # importers, covering tests, governance, and cross-repo consumers
98
- simt tests <path> [--cochange] # tests covering a file via imports, naming, coverage, or co-change
99
- simt gate --changed # run only the tests the current diff reaches, with compacted output
100
- simt why [path] # ADRs, rules, skills, gates, and lessons governing a path
101
-
102
- # Rules, skills, decisions, and lessons
103
- simt rules list [--root <path>] # rule catalogue and what applies to a repository
104
- simt rules show <id> # read one rule body (including rules deferred in kernel mode)
105
- simt rules why <id|ADR-NNN> [--all] # the decision that settled a rule, and whether it still stands
106
- simt explain <CODE> [--json] # what a check finding means, why it is reported, and how to fix it
107
- simt decide "<title>" --yes # scaffold the next ADR with structured simt-affects / simt-supersedes
108
- simt lessons list # fail-to-fix, revert, review-block, and hook-denial candidates
109
- simt lessons review <id> --yes # promote a candidate to docs/lessons/NNNN-<slug>.md
110
- simt skills index # tier-0 catalogue: every skill, one line each
111
- simt skills brief --task "<task>" # tier-1 ranked skill selection within budget
112
- simt skills show <name> # tier-2 skill body on demand (respects --max-bytes)
113
- simt skills why <name> # the signal chain that selected or rejected a skill
114
- simt skills find <query> # search skills by capability and keyword
115
- simt skills install <name> --yes # pin a skill into the repository
116
- simt skills compile [<name>] # compile to Agent Skills layout, split > 5,000-token bodies, report triggers
117
- simt skills eval [corpus] # measure resolver precision and recall against a gold corpus
118
- simt graph lint [--spec agentskills]# verify the skill registry against skills on disk
119
-
120
- # Dual gates (git time and agent tool-call time) and execution evidence
121
- simt hooks install --yes # install the shared POSIX git hook dispatcher
122
- simt hooks status # what each git event routes to, and whether it is wired
123
- simt hooks run <event> # run pre-commit or pre-push gates now, as git would
124
- simt agent-hooks install --yes # write pre/post-tool and prompt-submit hooks for active harnesses
125
- simt agent-hooks status # what each harness will run, and whether Codex trusts it
126
- simt agent-hook <event> --harness # evaluate pre-tool-use, post-tool-use, or prompt-submit
127
- simt evidence # gate and test runs recorded against the current git tree
128
- simt evidence check <msg-file> # verify a commit message does not claim unrecorded passing runs
129
- simt pr-body [--base <ref>] # a PR body: the evidence block for this tree, changed
130
- # decisions, gate state, and residual risk in ADR-008 vocabulary
131
-
132
- # Plans, context metering, workspace learning, benchmarks, local models, and MCP
133
- simt plan status # count queued, in-progress, complete, and accepted tracker rows
134
- simt plan next [<id>] # print the next ready slice section (~1 KB)
135
- simt plan done <id> [<sha>] --yes # mark a tracker row complete with its commit SHA and test command
136
- simt status --line # one-line gate state from the last check, for prompts (< 50 ms)
137
- simt undo --yes # restore the last journaled set of writes, if untouched since
138
- simt slice start <id> --yes # a worktree on branch slice/<id> with the brief preloaded; row In progress
139
- simt slice finish <id> --yes # run the pre-commit gates, commit a Conventional subject from the
140
- # row's title, and record the SHA and --test command on the row
141
- simt lease [<paths>] --session # claim files for this session (--ttl, default 1h) or list claims;
142
- # the pre-edit hook refuses another session's edit until the TTL
143
- simt tokens [--repos] [--session] # measure bytes loaded at session start or split a transcript
144
- simt harness detect [--user] # detect configured harnesses at repo and user level
145
- simt harness loaders [--table] # what each harness loads, in what order, and where its cap truncates
146
- simt shared plan # rules repeated across a workspace and the bytes saved by sharing
147
- simt shared install --yes # write shared rules once at user level and record the repo delta
148
- simt compare # workspace matrix, violated rules, noisy/slow gates, and ADR drafts
149
- simt local doctor [--allow-remote] # probe configured OpenAI-compatible local chat and embed endpoints
150
- simt bench mine --yes # mine verified fail-to-pass tasks from git history into the vault
151
- simt bench run --yes # evaluate arms (bare, current, kernel, brief) in isolated exports
152
- simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstrap CIs, McNemar/Wilcoxon
153
- simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
154
- simt bench probes --yes # 12 deterministic rule-compliance probes
155
- simt bench variants --yes # evaluate simt-variants slots and lock winners in simt.lock.json
156
- simt review [--local] # an advisory ADR-008 verdict skeleton over the staged diff
157
- simt distill <skill|doc> # a budgeted proposal summary with line citations, for a person to merge
158
- simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
159
- simt pack lint [dir] [--require-measured] # validate a pack and state its measured ΔR
160
- simt pack publish [dir] --yes # publish an npm-sourced pack (git packs name the tag-and-push)
161
- simt mcp [--list] # serve the 15 read-only tools over stdio JSON-RPC
162
- simt completions <bash|zsh|fish> # a completion script generated from the command registry
163
- simt ignore [--yes] [--diff] # render the one .simtignore list into .cursorignore,
164
- # .aiderignore, .geminiignore and Claude's permissions.deny
98
+ # agent-hook
99
+ simt agent-hook <event> --harness # the harness entry point: decide one tool call, or deliver the prompt packet
100
+
101
+ # agent-hooks
102
+ simt agent-hooks install --yes # write this repository's policies into each harness hooks file
103
+ simt agent-hooks status # what each harness will run, and what is not trusted yet
104
+
105
+ # agents
106
+ simt agents install --yes # write the Simt-Agent into each harness agents file
107
+ simt agents status # what each harness carries, and what is not installed yet
108
+
109
+ # bench
110
+ simt bench ablate --yes # measure one arm of the brief against its ablation
111
+ simt bench critic # score the review critic against the labelled bench set
112
+ simt bench export --yes # write the sealed bench corpus as one signed document
113
+ simt bench import # verify a sealed corpus and load it into the vault
114
+ simt bench mine --yes # mine tasks out of a repository history
115
+ simt bench probes --yes # run the deterministic probes against a workspace
116
+ simt bench report [--compare a b] # summarise the runs recorded in the vault
117
+ simt bench run --yes # run agents against the mined tasks
118
+ simt bench variants --yes # run one task across its variant prompts
119
+
120
+ # brief
121
+ simt brief "<task>" # the packet for a task: rules, skills and the files it names, within a budget
122
+
123
+ # check
124
+ simt check # report stale or missing generated regions and every check finding
125
+
126
+ # ci
127
+ simt ci # refresh simt-dev's own .github workflow and Dependabot files
128
+
129
+ # compare
130
+ simt compare # the adoption and drift matrix across every sibling repository
131
+
132
+ # completions
133
+ simt completions <bash|zsh|fish> # print a bash, zsh or fish completion script generated from this spec
134
+
135
+ # decide
136
+ simt decide "<title>" --yes # scaffold a numbered decision record with its frontmatter
137
+
138
+ # distill
139
+ simt distill <skill|doc> # turn a repository into a skill or rule proposal
140
+
141
+ # docs
142
+ simt docs readme # render the README command list from the spec
143
+
144
+ # doctor
145
+ simt doctor [--fix] # report what is wrong with this installation
146
+
147
+ # evidence
148
+ simt evidence # the runs recorded against the tree on disk
149
+ simt evidence check <msg-file> # a commit message claiming a run this tree does not have
150
+
151
+ # explain
152
+ simt explain <CODE> # what one check finding code means, and how to fix it
153
+
154
+ # gate
155
+ simt gate --changed # the tests a change reaches, and only those
156
+
157
+ # graph
158
+ simt graph lint [--spec agentskills] # check the skill registry against the skills on disk
159
+
160
+ # harness
161
+ simt harness detect [--user] # which harness is installed, and what it carries
162
+ simt harness loaders [--table] # the instruction files each harness loads, and what they cost
163
+
164
+ # hooks
165
+ simt hooks install --yes # install the shared dispatcher and report what it would run
166
+ simt hooks run <event> # run one git event's gates now, as git would
167
+ simt hooks status # what each git event routes to, and whether it is wired
168
+
169
+ # ignore
170
+ simt ignore [--yes] [--diff] # render the one ignore list into every harness ignore file
171
+
172
+ # impact
173
+ simt impact <file|symbol> # who a change reaches: importers, their tests and the contract
174
+
175
+ # index
176
+ simt index [--embed] # rebuild the local file index from git blob hashes
177
+
178
+ # init
179
+ simt init [path] # adopt this repository: manifest, region, hooks, agents and agent-hooks
180
+
181
+ # lease
182
+ simt lease [<paths>] --session # claim files for one session, or list the claims
183
+
184
+ # lessons
185
+ simt lessons capture # scan the ledger and history for new lesson candidates
186
+ simt lessons list # deterministic lesson candidates and the promoted lessons
187
+ simt lessons review <id> --yes # promote one lesson candidate into docs/lessons
188
+
189
+ # local
190
+ simt local doctor [--allow-remote] # the local model endpoints, and whether they answer
191
+
192
+ # map
193
+ simt map --task "<task>" # the files a task is most likely to touch, within a byte budget
194
+
195
+ # mcp
196
+ simt mcp [--list] # serve the read-only MCP surface over stdio
197
+
198
+ # pack
199
+ simt pack lint [dir] [--require-measured] # lint a rule pack in the working directory
200
+ simt pack new <name> --source <spec> # scaffold a rule pack
201
+ simt pack publish [dir] --yes # publish a rule pack
202
+
203
+ # plan
204
+ simt plan done <id> [<sha>] --yes # mark one tracker row complete, with its SHA and its evidence
205
+ simt plan next [<id>] # one ready slice's section, or the one named
206
+ simt plan status # count the tracker rows
207
+
208
+ # plugin
209
+ simt plugin <claude|gemini|cursor|opencode> # generate a harness package from the same tables the hooks use
210
+
211
+ # pr-body
212
+ simt pr-body [--base <ref>] # the pull request body: evidence, decisions, gate state and residual risk
213
+
214
+ # review
215
+ simt review [--local] # review the staged diff against the estate rules
216
+
217
+ # rules
218
+ simt rules decisions # every known decision, and which layer each came from
219
+ simt rules list [--root <path>] # the rule catalogue, marked with what applies to this repository
220
+ simt rules show <id> # one rule body
221
+ simt rules why <id|ADR-NNN> [--all] # the decision that settled a rule, and whether it is still in force
222
+
223
+ # shared
224
+ simt shared install --yes # install the shared rules into a reader home directory
225
+ simt shared plan # what the shared install would write, and where
226
+
227
+ # skills
228
+ simt skills brief --task "<task>" # the packet for a task, read from the skill registry
229
+ simt skills compile [<name>] # compile a skill to the Agent Skills standard
230
+ simt skills eval [corpus] # score the skill registry against transcripts
231
+ simt skills find <query> # skills that match a query
232
+ simt skills index # rebuild the skill index
233
+ simt skills install <name> --yes # install skills into the workspace
234
+ simt skills show <name> # one skill packet
235
+ simt skills why <name> # which skill covers a task
236
+
237
+ # slice
238
+ simt slice abandon <id> # remove a slice worktree, delete its branch, and return the row
239
+ simt slice finish <id> --yes # run the gates, commit the slice and record its evidence
240
+ simt slice start <id> --yes | -- "<text>" # give a slice its worktree, branch and brief; -- starts one from a prompt, no row
241
+
242
+ # status
243
+ simt status [--line] # the repository snapshot, or one line of the last check
244
+
245
+ # sync
246
+ simt sync [--explain] --yes # re-render the generated regions from the rule content
247
+
248
+ # tests
249
+ simt tests <path> [--cochange] # the tests that exercise a file
250
+
251
+ # tokens
252
+ simt tokens [--repos] [--session] # count tokens per instruction file and per skill
253
+
254
+ # undo
255
+ simt undo --yes # restore the last journaled set of writes, if untouched
256
+
257
+ # upgrade
258
+ simt upgrade --yes # replace this installation with the pinned release
259
+
260
+ # why
261
+ simt why [path] # what governs a file: decisions, rules, skills, gates and lessons
165
262
  ```
263
+ <!-- simt:commands:end -->
166
264
 
167
265
  `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`,
168
266
  `skills install`, `plan done`, `lessons review`, `decide`, `ignore`, `pack new`,
@@ -185,134 +283,11 @@ line warns past 400 lines and fails past 1000. `simt evidence check` warns when
185
283
  message claims a passing run this tree does not have, and the commit fails when
186
284
  `gates.evidence` is `block`. Every finding `check` can emit is explained by `simt explain <CODE>` (DRIFT, UNMANAGED, PACK-DIGEST-MISMATCH, ...).
187
285
 
188
- ## Agent playbook: how and when to use each module
189
-
190
- An agent working in an adopted repository should use `simt` as its primary orientation,
191
- retrieval, validation and memory layer rather than scanning the tree by hand. Every
192
- read-only command supports `--json` (and `--max-bytes <n>`) or can be called over stdio
193
- through `simt mcp`.
194
-
195
- ### Decision tree: which command to run when
196
-
197
- | Situation | First command | If you need more |
198
- | --- | --- | --- |
199
- | New task, no context yet | `simt brief "<task>"` | `simt map --task "<task>"` for broader file ranking |
200
- | About to edit a file | `simt why <file>` | `simt impact <file>` for blast radius |
201
- | Need to know what tests to run | `simt tests <file>` | `simt gate --changed` to run them |
202
- | Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
203
- | Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
204
- | Before committing | `simt check` | `simt evidence` to verify test claims |
205
- | Opening a pull request | `simt pr-body` | `--base <ref>` to diff against another fork point |
206
- | Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
207
- | Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
208
- | Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
209
-
210
- ### 1. Start of task — orient in one call instead of broad exploration
211
-
212
- 1. **Assemble the task packet first.** Run `simt brief "<task>"` (or call MCP `brief`, or
213
- read the packet injected automatically when `agent-hooks install --yes` wired
214
- `prompt-submit`). Within `--budget 2048` bytes (pass `--budget 0` for unlimited or
215
- `--explain` to see why items were kept or cut), the packet gives:
216
- - `TASK`: the classified task kind (`bugfix`, `feature`, `refactor`, `test`, `docs`,
217
- `config`) and the evidence behind it.
218
- - `COMMANDS`: the exact `build`, `test`, `lint`, `format`, `typecheck`, and focused
219
- test templates for this repository.
220
- - `LIKELY FILES`: top files ranked by reciprocal-rank fusion (`RRF_K = 40`) across
221
- SQLite FTS5 `bm25()`, PageRank graph proximity, and resolver signals.
222
- - `TESTS`: the test files mapped to those likely files.
223
- - `DECISIONS`, `SKILLS`, `LESSONS`, `CAUTIONS`, and `FEDERATION`: governing ADRs,
224
- matched skills, promoted lessons for those paths, active worktree/hook cautions, and
225
- any structural answer from a declared external code-graph server.
226
- 2. **Pull the next tracker slice when working from a plan.** Instead of reading a multi-thousand-line
227
- plan in `docs/plans/` or `docs/reviews/`, run `simt plan next` (or MCP `plan_next`) to
228
- load only the next queued slice (~1 KB) whose dependencies are already `Complete` or
229
- `Accepted`.
230
-
231
- **When to use `--json` format.** When piping output to other tools or when the agent needs
232
- structured data, add `--json` to any read-only command. For example, `simt brief "<task>" --json`
233
- returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `skills`,
234
- `lessons`, `cautions`, and `federation` fields that can be programmatically consumed.
235
-
236
- ### 2. Before editing — query the graph, blast radius, and governance
237
-
238
- 1. **Rank files or symbols at the right granularity.** When `brief`'s file list is too
239
- narrow or the task evolves, run `simt map --task "<task>" --level outline` for paths,
240
- `--level names` for exported symbols, or `--level signatures` for declaration lines.
241
- Pass `--embed` when `local.embed` is configured in `simt.json` and clears the +10-point
242
- recall@10 bar.
243
- 2. **Check blast radius before changing a shared file or export.** Run
244
- `simt impact <file|symbol>` to see every direct and transitive importer, the tests
245
- covering them, the governing rules and ADRs, and any sibling repository in the
246
- workspace that imports that symbol.
247
- 3. **Read the governance on a path before changing its behaviour.** Run `simt why <path>`
248
- to list every ADR whose `simt-affects` matches the file, every scoped rule, skill,
249
- gate, and promoted lesson. Run `simt why` with no path to audit the repository for
250
- `UNRESOLVED-AFFECTS` tokens.
251
- 4. **Resolve deferred rules and citations on demand.** When `simt.json` sets
252
- `"mode": "kernel"`, only `hard` and `command` rules are loaded at session start;
253
- `convention` and `style` rules are listed by ID at the foot of the projection. Fetch a
254
- deferred rule with `simt rules show <id>`, and read any cited `ADR-NNN` with
255
- `simt rules why ADR-NNN` (or MCP `rules_why`) to see its rulings and whether any ruling
256
- was superseded or narrowed.
257
- 5. **Load skills progressively (Tier 0 → Tier 1 → Tier 2).** Never read every skill file
258
- upfront:
259
- - Tier 0: `simt skills index` (or MCP `skills_index`) lists one line per skill.
260
- - Tier 1: `simt skills brief --task "<task>"` (or MCP `skills_brief`) ranks compatible
261
- skills within budget (`--plan` emits a fetch plan without bodies).
262
- - Tier 2: `simt skills show <name> --max-bytes 8192` (or MCP `skills_show`) loads only
263
- the chosen skill's body.
264
-
265
- **Optimal retrieval strategy.** For best performance, use this sequence:
266
- 1. `simt brief "<task>"` — gets the most relevant files and tests in one call
267
- 2. If more files are needed, `simt map --task "<task>" --level outline` — broader ranking
268
- 3. If you need to understand a specific file's impact, `simt impact <file>` — blast radius
269
- 4. If you need to understand governance, `simt why <file>` — ADRs and rules
270
-
271
- ### 3. During implementation — validate incrementally under dual gates
272
-
273
- 1. **Keep the local index current.** After adding, renaming, or changing exports/imports,
274
- run `simt index`. It hashes tracked blobs via `git ls-files --stage` and re-extracts
275
- only changed files in under 300 ms.
276
- 2. **Run only the tests your change reaches.** Use `simt tests <path>` to inspect which
277
- tests cover a file (via import edges, naming conventions, or coverage records; add
278
- `--cochange` to include historical co-change pairs). Run `simt gate --changed` (or
279
- `simt gate <path...>`) to execute only the tests reachable from the diff, with gate
280
- output compacted so every failure line survives while passing noise is trimmed.
281
- 3. **Respect agent-time hooks and learn from failures.** With `simt agent-hooks install --yes`,
282
- `pre-tool-use` blocks unapproved `git push`, history rewrites (`--no-verify`,
283
- `--amend`, `reset --hard`, `rebase`), and direct edits to generated regions before the
284
- tool executes. When a test or gate fails, `post-tool-use` hashes the normalised first
285
- error line against `docs/lessons/*.md` and injects the matching lesson into context.
286
-
287
- **Incremental validation workflow.** After each meaningful code change:
288
- 1. Run `simt tests <changed-file>` to see which tests cover your changes
289
- 2. Run `simt gate --changed` to execute only the affected tests
290
- 3. If a test fails, check `simt lessons list` for known issues and their remedies
291
- 4. If the failure is new, fix it and consider promoting the lesson with `simt lessons review <id> --yes`
292
-
293
- ### 4. Before committing and closing a slice — verify drift, evidence, and memory
294
-
295
- 1. **Run the repository gate.** Run `simt check` (or MCP `check`). Fix any reported
296
- `DRIFT` with `simt sync --yes`, and resolve any rule checker or manifest findings.
297
- 2. **Verify execution evidence matches the current tree.** Run `simt evidence` to confirm
298
- that the tests and gates you plan to cite were recorded against the current
299
- `git write-tree` digest in `.simt/ledger.jsonl`. Any file edit invalidates earlier
300
- evidence.
301
- 3. **Record decisions, lessons, and tracker state:**
302
- - If the change alters what the repository or tool believes, scaffold an ADR with
303
- `simt decide "<title>" [--supersedes ADR-NNN[:<ruling>]] --yes`.
304
- - If a failing gate or test was fixed during the session, inspect captured candidates
305
- with `simt lessons list` and promote reusable ones with
306
- `simt lessons review <id> --yes`.
307
- - After committing locally (never push without explicit approval per `ADR-001`), close
308
- the tracker slice with `simt plan done <id> <sha> --test "<cmd>" --yes`.
309
-
310
- **Pre-commit checklist.** Before committing, run this sequence:
311
- 1. `simt check` — verify no drift and all rules pass
312
- 2. `simt evidence` — confirm test runs are recorded against current tree
313
- 3. `simt lessons list` — check for any unreviewed lesson candidates
314
- 4. `git commit` — commit locally (never push without explicit approval)
315
- 5. `simt plan done <id> <sha> --yes` — close the tracker slice if working from a plan
286
+ ## Agent playbook
287
+
288
+ The full agent playbook — the decision tree for which command to run when, and the
289
+ workflow for orienting, editing, implementing and closing a slice — lives in
290
+ [PLAYBOOK.md](PLAYBOOK.md).
316
291
 
317
292
  ## Optimal setup for every project, repository, and workspace shape
318
293
 
@@ -353,7 +328,7 @@ on top of `0.6.0`:
353
328
  for parallel agents, and `simt pr-body` assembled from the evidence ledger.
354
329
 
355
330
  The last two rows of review `0002` (`S38` workspace token cost, `S39` estate policy
356
- as a pack) are closed by ruling in ADR-102: the instrument, the declaration and the
331
+ as a pack) are closed by ruling: the instrument, the declaration and the
357
332
  non-blocking finding shipped, the blocking gate and the registry-carrying pack were
358
333
  refused by ruling, and the estate-side move is recorded as whose commit it waits on.
359
334
  Everything in plans `0001`–`0003` and reviews `0001`–`0002` is Complete or Accepted.
@@ -372,7 +347,7 @@ history. All remain off until named and propose rather than write projected text
372
347
  | `simt.lock.json` | the digest of the inputs, the digest of the projection, and locked `variants` winners from `simt bench variants`. The old `simt-dev.lock.json` is still read, and a lock migrates on its next write |
373
348
  | `.cursor/rules/*.mdc`, `.claude/rules/*.md`, `.agents/rules/*.md`, `.github/instructions/*.instructions.md` | one file per rule, and only for a harness that reads that directory |
374
349
  | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
375
- | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
350
+ | `.simt/hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
376
351
  | `docs/decisions/ADR-NNN-<slug>.md` | numbered decision records scaffolded by `simt decide --yes` with `simt-affects` and `simt-supersedes` frontmatter |
377
352
  | `docs/lessons/NNNN-<slug>.md` | reviewed lessons promoted by `simt lessons review <id> --yes` with `simt-trigger`, `simt-evidence`, and `simt-expires` frontmatter |
378
353
 
package/bin/simt.mjs CHANGED
@@ -1,60 +1,24 @@
1
1
  #!/usr/bin/env node
2
- // simt-dev - developer and agent tooling for the SIMT ecosystem.
2
+ // The entry point, and the one place the runtime floor is enforced.
3
3
  //
4
- // POSIX only (ADR-012). package.json declares os: [darwin, linux], so npm refuses
5
- // the install elsewhere rather than letting a hook fail obscurely.
6
-
7
- import { parse, rawJsonFlag } from '../src/argv.mjs';
8
- import { EXIT, fail, jsonFailMode, jsonIndentDefault } from '../src/output/index.mjs';
9
-
10
- try {
11
- const argv = process.argv.slice(2);
12
- const parsed = parse(argv);
13
- if (!parsed.ok) {
14
- // The flags do not exist yet, so the JSON mode is read off the raw words:
15
- // a parse failure under `--json` is a JSON document on stdout, not text on
16
- // stderr with an empty stdout (Q11, ADR-070 ruling 4).
17
- jsonFailMode(rawJsonFlag(argv));
18
- process.exit(fail(parsed.error.message, parsed.error.code));
19
- }
20
- const { flags, positional } = parsed.value;
21
-
22
- // Set before anything can fail: `no command given` under `--json` is a JSON
23
- // document too, and a failure that prints as text with an empty stdout breaks
24
- // the same ruling the parse failure above honours (Q11, ADR-070 ruling 4).
25
- jsonIndentDefault(flags.pretty === true);
26
- jsonFailMode(flags.json === true);
27
-
28
- // No arguments at all is a usage error, not a silent help dump: an agent that
29
- // ran the wrong thing should be told so rather than handed 40 lines of prose.
30
- if (positional.length === 0 && !flags.help && !flags.version) {
31
- process.exit(fail('no command given', EXIT.USAGE));
32
- }
4
+ // `package.json` declares `engines.node >= 22.20.0`, and npm only warns: an older
5
+ // runtime used to reach the CLI and fail somewhere inside the module graph — a syntax
6
+ // error or a missing API — instead of the one sentence that says what to install
7
+ // (review 0003 Q54). Nothing but this tiny module is imported before the check, so the
8
+ // message is what a reader gets; the CLI is imported only once the floor holds.
9
+ //
10
+ // 5 is EXIT.UNSUPPORTED. `output/index.mjs` is the CLI graph this file exists to avoid
11
+ // loading before the check, so the literal is repeated here and asserted by
12
+ // `test/node-version.test.mjs`.
33
13
 
34
- // The one command that runs on somebody else's hot path, and therefore the one that
35
- // does not load the registry. `agent-hook` is called before every tool call an agent
36
- // makes, so its latency is a product requirement rather than a nicety (plan 0003
37
- // R15), and the registry's imports - detection, projection, the bench corpus - cost
38
- // tens of milliseconds before the command itself starts. Measured on the machine
39
- // this was written on: 127.7 ms through the registry against 91.5 ms with only this
40
- // module's imports, where the bare runtime is 86.9 ms of it.
41
- //
42
- // Only the exact spelling the renderers write takes this path. Anything else -
43
- // including `agent-hook --help` - loads the registry, so help stays the one list of
44
- // every command and this shortcut cannot become a second, thinner command surface.
45
- if (positional[0] === 'agent-hook' && !flags.help && !flags.version) {
46
- const { agentHookCommand } = await import('../src/commands/agenthook.mjs');
47
- process.exit((await agentHookCommand(positional.slice(1), flags)) ?? EXIT.OK);
48
- }
14
+ import { MIN_NODE, satisfiesMinimum } from '../src/node-version.mjs';
49
15
 
50
- const { dispatch } = await import('../src/commands/index.mjs');
51
- const code = (await dispatch(argv)) ?? EXIT.OK;
52
- // Assigned, not forced: a large document on stdout (a `--json --diff` over a
53
- // skill-sized body exceeds the 64 KiB pipe buffer) is still draining when the
54
- // command resolves, and `process.exit()` cuts it — exit 0 with half a JSON
55
- // document on stdout. Letting the loop empty first makes the exit honest
56
- // (plan 0003 R50; the S10 contract asserts the document parses).
57
- process.exitCode = code;
58
- } catch (error) {
59
- process.exit(fail(error?.message ?? String(error), EXIT.FAIL));
16
+ if (!satisfiesMinimum(process.versions.node)) {
17
+ process.stderr.write(
18
+ `ERROR 5 simt-dev needs Node >= ${MIN_NODE}; this is ${process.versions.node}\n` +
19
+ `REMEDY install Node ${MIN_NODE} or newer, then rerun: simt --version\n`,
20
+ );
21
+ process.exit(5);
60
22
  }
23
+
24
+ await import('../src/cli.mjs');
@@ -1,6 +1,6 @@
1
1
  # ADR-014 — The workspace is configuration, and a single repo is a first-class case
2
2
 
3
- Status: **accepted** · 2026-10-05
3
+ Status: **accepted** · 2026-10-05 · ruling 1 superseded by [ADR-119](ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md)
4
4
  Affects: `simt-dev` CLI (workspace resolution, `compare`, `skills`, registry validation, packaging)
5
5
 
6
6
  ## Context
@@ -133,7 +133,7 @@ a feature; `rules why` is the provenance mechanism the whole one-canonical-home
133
133
  on, and it cannot depend on a git checkout being present.
134
134
 
135
135
  `docs/plans` ships with it, because every non-zero exit prints a remedy pointing at
136
- `docs/plans/0002-simt-dev-cli.md section 11`.
136
+ `docs/research/0002-simt-dev-cli.md section 11`.
137
137
 
138
138
  ### 6. "Absent", "wrong" and "moved" are three different facts
139
139
 
@@ -4,7 +4,7 @@ Status: accepted · 2026-10-06 · rulings 1 and 2 narrowed by ADR-026 · ruling
4
4
  **Affects:** `src/projection/baselines.mjs`, `src/projection/markers.mjs`,
5
5
  `src/projection/project.mjs`, `src/commands/init.mjs`, `test/baselines.test.mjs`,
6
6
  `test/leaks.mjs`, `test/surfaces.test.mjs`. Settles §3.1 row 5 and row 7 of
7
- `docs/plans/0001-centralise-agent-rules.md` for the files it names, and leaves the rest ruled
7
+ `docs/research/0001-centralise-agent-rules.md` for the files it names, and leaves the rest ruled
8
8
  out by name rather than outstanding.
9
9
 
10
10
  Rulings 1 and 2 did not survive whole: ADR-026 rules that a config whose grammar cannot
@@ -5,7 +5,7 @@ Status: accepted · 2026-10-06
5
5
  `src/commands/help.mjs`, `src/projection/project.mjs`, `test/ci.test.mjs`.
6
6
  **Narrows:** ADR-025 rulings 1 and 2. **Extends:** ADR-023 (bytes copied, written once),
7
7
  ADR-024 (simt-dev's own copies are refreshed by `simt-dev ci`). Settles the Dependabot
8
- item §3.1 row 8 of `docs/plans/0001-centralise-agent-rules.md` named as still missing.
8
+ item §3.1 row 8 of `docs/research/0001-centralise-agent-rules.md` named as still missing.
9
9
 
10
10
  ## Context
11
11
 
@@ -5,7 +5,7 @@ Status: accepted · 2026-10-06
5
5
  `test/baselines.test.mjs`, `test/surfaces.test.mjs`.
6
6
  **Supersedes:** ADR-025 ruling 9, which ruled `.gitattributes` out for now and required this
7
7
  record. Settles the `.gitattributes` item in §3.1 row 5 of
8
- `docs/plans/0001-centralise-agent-rules.md`.
8
+ `docs/research/0001-centralise-agent-rules.md`.
9
9
 
10
10
  ## Context
11
11
 
@@ -5,7 +5,7 @@ Status: accepted · 2026-10-07
5
5
  `test/tsconfig.test.mjs`. **Narrows:** ADR-026 ruling 2 (ownership does not depend on
6
6
  content being mergeable) by applying it to a file whose mechanism is `extends` rather than
7
7
  a copied byte range. Settles the `tsconfig.base.json` item of §3.1 row 5 and row 7 of
8
- `docs/plans/0001-centralise-agent-rules.md`.
8
+ `docs/research/0001-centralise-agent-rules.md`.
9
9
 
10
10
  ## Context
11
11
 
@@ -3,7 +3,7 @@
3
3
  Status: accepted · 2026-10-07
4
4
  **Affects:** `src/toolchain.mjs`, `src/projection/project.mjs`, `test/toolchain.test.mjs`.
5
5
  **Settles:** the `packageManager`/`engines`/`.nvmrc` items of §3.1 row 5 of
6
- `docs/plans/0001-centralise-agent-rules.md`. **Extends:** ADR-026 ruling 9 (absence and
6
+ `docs/research/0001-centralise-agent-rules.md`. **Extends:** ADR-026 ruling 9 (absence and
7
7
  disagreement are reportable; content is not) to a file this tool authors no part of.
8
8
 
9
9
  ## Context
@@ -1,7 +1,7 @@
1
1
  # ADR-030 — what a plan does not ship is a decision with a record, not a silence
2
2
 
3
3
  Status: accepted · 2026-10-07
4
- **Affects:** `docs/plans/0001-centralise-agent-rules.md` §3.1 row 5 and row 7. Ships no
4
+ **Affects:** `docs/research/0001-centralise-agent-rules.md` §3.1 row 5 and row 7. Ships no
5
5
  code. **Refuses:** the commitlint baseline and the shared ESLint block named in row 5 and
6
6
  row 7, and records why in the plan itself rather than leaving the rows to imply that two
7
7
  mechanisms are merely unwritten.