simt-dev 0.4.0 → 0.6.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 (89) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +300 -82
  3. package/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +13 -0
  4. package/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +1 -1
  5. package/docs/decisions/ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md +71 -0
  6. package/docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md +149 -0
  7. package/package.json +8 -4
  8. package/src/advice/advice.mjs +229 -0
  9. package/src/agenthooks/render.mjs +87 -21
  10. package/src/argv.mjs +25 -0
  11. package/src/bench/ablate.mjs +1 -3
  12. package/src/bench/grade.mjs +1 -1
  13. package/src/bench/mine.mjs +3 -3
  14. package/src/bench/probes.mjs +1 -3
  15. package/src/bench/report.mjs +1 -3
  16. package/src/bench/run.mjs +4 -18
  17. package/src/bench/tasks.mjs +36 -0
  18. package/src/bench/variants.mjs +1 -3
  19. package/src/brief/assemble.mjs +24 -4
  20. package/src/brief/packet.mjs +4 -1
  21. package/src/ci/dependabot.mjs +1 -1
  22. package/src/ci/workflow.mjs +40 -12
  23. package/src/commands/agenthook.mjs +6 -2
  24. package/src/commands/bench.mjs +35 -3
  25. package/src/commands/ci.mjs +1 -1
  26. package/src/commands/compare.mjs +1 -1
  27. package/src/commands/distill.mjs +36 -0
  28. package/src/commands/gate.mjs +2 -2
  29. package/src/commands/graph.mjs +2 -2
  30. package/src/commands/harness.mjs +87 -14
  31. package/src/commands/help.mjs +54 -4
  32. package/src/commands/hooks.mjs +1 -1
  33. package/src/commands/index.mjs +29 -3
  34. package/src/commands/init.mjs +2 -2
  35. package/src/commands/local.mjs +11 -0
  36. package/src/commands/mcp.mjs +1 -1
  37. package/src/commands/pack.mjs +246 -0
  38. package/src/commands/plugin.mjs +61 -0
  39. package/src/commands/review.mjs +65 -0
  40. package/src/commands/rules.mjs +1 -1
  41. package/src/commands/skills.mjs +3 -34
  42. package/src/commands/skillscompile.mjs +1 -3
  43. package/src/commands/skillsinstall.mjs +1 -1
  44. package/src/commands/sync.mjs +8 -8
  45. package/src/commands/tokens.mjs +1 -1
  46. package/src/commands/upgrade.mjs +1 -1
  47. package/src/commands/why.mjs +6 -3
  48. package/src/compare/discover.mjs +1 -1
  49. package/src/compare/hooksstate.mjs +19 -7
  50. package/src/compare/learn.mjs +2 -2
  51. package/src/compare/row.mjs +3 -3
  52. package/src/decisions/index.mjs +1 -1
  53. package/src/distill/distill.mjs +246 -0
  54. package/src/distill/engine.mjs +187 -0
  55. package/src/distribute/release.mjs +142 -0
  56. package/src/graph/load.mjs +9 -8
  57. package/src/hooks/dispatcher.mjs +3 -2
  58. package/src/hooks/shim.mjs +11 -6
  59. package/src/index/govern.mjs +1 -1
  60. package/src/index/map.mjs +1 -1
  61. package/src/index/persist.mjs +2 -2
  62. package/src/index/store.mjs +50 -20
  63. package/src/ledger/index.mjs +2 -2
  64. package/src/local/client.mjs +22 -8
  65. package/src/local/config.mjs +52 -0
  66. package/src/locate.mjs +22 -1
  67. package/src/mcp/prompts.mjs +118 -0
  68. package/src/mcp/resources.mjs +96 -22
  69. package/src/mcp/server.mjs +33 -6
  70. package/src/mcp/tools.mjs +12 -12
  71. package/src/measure/session.mjs +1 -1
  72. package/src/memory/decide.mjs +1 -1
  73. package/src/memory/lessons.mjs +14 -14
  74. package/src/name.mjs +11 -1
  75. package/src/package-version.mjs +12 -10
  76. package/src/packs/manage.mjs +563 -0
  77. package/src/packs.mjs +15 -5
  78. package/src/plugins.mjs +164 -0
  79. package/src/projection/loaders.mjs +84 -10
  80. package/src/projection/manifest.mjs +4 -4
  81. package/src/projection/project.mjs +3 -3
  82. package/src/projection/rules.mjs +24 -4
  83. package/src/projection/surfaces.mjs +20 -2
  84. package/src/resolve/body.mjs +46 -0
  85. package/src/review/critic.mjs +509 -0
  86. package/src/toolwords.mjs +8 -5
  87. package/src/tsconfig.mjs +3 -3
  88. package/src/upgrade/plan.mjs +1 -1
  89. /package/bin/{simt-dev.mjs → simt.mjs} +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,175 @@ All notable changes to this package are recorded here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.6.0] — 2026-10-27
10
+
11
+ ### Added
12
+
13
+ `simt plugin <claude|gemini|cursor> --out <dir>` generates one of the three
14
+ harness packages from the same tables `agent-hooks install` writes — the hooks
15
+ file, the MCP registration and, for cursor, the kernel rules — each carrying a
16
+ self-contained copy of the runtime so it installs into a clean profile. Dry-run
17
+ unless `--yes`. The Gemini reader row gains its hooks file (`.gemini/settings.json`),
18
+ which extends `agent-hooks install` and `status` to a fifth adapter.
19
+
20
+ The MCP server answers `prompts/list` and `prompts/get` with two templates:
21
+ `simt-brief` starts a task from the pre-assembled brief packet, and `simt-slice`
22
+ implements one slice of the working plan (the next one whose dependencies are
23
+ complete, or a named one) — reading the repo's rules through `simt://kernel`
24
+ first, testing per the slice's acceptance check, committing locally and pushing
25
+ only on explicit approval. A prompt names the tools; the server stays read-only.
26
+
27
+ Two fixed resources join `simt://rules/{id}` and `simt://decisions/{adr}`:
28
+ `simt://kernel` serves the collaborating region rendered in kernel mode for
29
+ whatever repository the server runs in — the URI promises the kernel's bytes,
30
+ whatever `mode` the manifest declares — and `simt://plan/next` serves the
31
+ section of the next ready plan slice, listed only while one is ready. A listed
32
+ resource's size is the size its read returns.
33
+
34
+ The tool descriptions in `tools/list` are cut from 2,783 bytes to 1,949,
35
+ inside the 2 KB budget plan 0003 R41 sets for a cacheable tools list; the
36
+ input and output schemas stay full, per ADR-068.
37
+
38
+ `harness detect` reports the MCP registration files the loader table records —
39
+ `.mcp.json` (Claude Code), `.codex/config.toml`, `.cursor/mcp.json`,
40
+ `.agents/mcp_config.json`, `.gemini/settings.json`, `.vscode/mcp.json` — as
41
+ `kind: 'mcp'` rows whose provenance is the vendor page each path was read from.
42
+ A row rests on the file existing, never on a directory's presence, and never
43
+ counts toward the no-rule-channel note: a config file doesn't claim one.
44
+
45
+ The loader table gains the Gemini CLI reader, whose configuration reference the
46
+ table previously recorded as unavailable: it is live again (read 2026-10-26), so
47
+ the row carries the GEMINI.md chain with `.git` boundary markers, the
48
+ `context.fileName` rename (the only documented way this reader picks up
49
+ AGENTS.md), depth-5 `@path` imports, no published cap, and the `mcpServers`
50
+ registration. It stays a facts row — the `gemini-md` pointer remains the one
51
+ rule channel for that reader.
52
+
53
+ Each release now carries a fourth artefact beside the tarball, the wheel and the
54
+ formula: one single-file executable per target (`darwin-arm64`, `darwin-x64`,
55
+ `linux-x64`), built from the same `files` set with a pinned Node runtime, published to
56
+ the GitHub release with a `.sha256` beside it and a build-provenance attestation. It is
57
+ the channel for a machine that has no toolchain to install one with — the binary lands
58
+ as one file in `.simt/bin/` and carries its own runtime — and its acceptance is
59
+ executable: a Gradle fixture with every directory containing a node removed from `PATH`
60
+ runs `check` and the hook shim from the built bytes.
61
+
62
+ `simt pack new <name> --source <npm:<package>|git+https://…>` scaffolds a
63
+ versioned pack — `pack.json`, an unmeasured `bench.json`, one stack rule — and
64
+ `simt pack lint [dir]` validates it and states its measured ΔR, rejecting a pack
65
+ with no bench summary under `--require-measured`. `simt pack publish [dir]` lints
66
+ first, publishes an npm-sourced pack idempotently (a live version is skipped),
67
+ and names the tag-and-push for a git-sourced one. The summary binds to every
68
+ byte but itself, so recording a measurement cannot invalidate it.
69
+
70
+ ### Changed
71
+
72
+ `harness detect`'s "some readers read AGENTS.md" rows no longer say bare "some"
73
+ when the row knows which one: the `readsAgentsMdNote` travels to the text
74
+ output, and `.gemini` graduates from unverified candidate to verified detection
75
+ facts (presence implies Gemini CLI; AGENTS.md only when `context.fileName`
76
+ names it).
77
+
78
+ The one-line description the three channels publish (npm, PyPI and Homebrew) now
79
+ names the goal plan `0003` is building toward — an intelligence amplifier for AI
80
+ coding agents — instead of the adoption-only story it grew out of.
81
+
82
+ The per-repository state directory is renamed from `.simt-dev/` to `.simt/`: the
83
+ index, ledger, lessons, bench artifacts, local-model proposals (`distilled/`,
84
+ `reviews/`) and repo-local profiles all live under `.simt/` now. Existing state is
85
+ not migrated — a repository that carries a `.simt-dev/` directory moves it once by
86
+ hand (`mv .simt-dev .simt`); everything in it is cache or ledger, regenerable from
87
+ git. The names this tool writes into files it does not own stay put: the `simt.json`
88
+ manifest, the `simt-dev-check.yml` gate, the user-level config directory and the
89
+ `SIMT_DEV_*` environment variables keep their names.
90
+
91
+ The skill registry leaves the published set again, as ADR-061 ruled when it
92
+ first left in 0.2.1. It is a catalogue of one workspace's skills — the
93
+ repositories whose bodies it resolves — and an installed copy serving that
94
+ catalogue to an adopting repository is a confident wrong answer: the skills
95
+ it names do not live in the reader's workspace. 0.5.0 carried the registry
96
+ because a fresh install's `simt skills *` and `simt distill` otherwise found
97
+ none; the fix is the honest absence the tiered loader already reports — the
98
+ path it would have read, and the `simt graph lint <path>` remedy — with a
99
+ workspace that owns the registry naming it through `--workspace`,
100
+ `SIMT_DEV_WORKSPACE` or the user config file. Custom skills were never part
101
+ of the registry: they live in each repository, and the disclosure scan
102
+ projects them into AGENTS.md.
103
+
104
+ The entry point file is renamed from `bin/simt-dev.mjs` to `bin/simt.mjs`,
105
+ matching the command it installs: the command has been `simt` for a long
106
+ time, the package is still `simt-dev`, and the file path was the last place
107
+ that carried the old spelling. `BIN_REL` in `src/name.mjs` is the single
108
+ source of truth, so the generated hook shim and CI workflow pick up the new
109
+ path on their next regeneration; the channels (npm, PyPI, Homebrew), the
110
+ repository's own CI and the test harnesses follow.
111
+
112
+ The hook shim's remedy and the generated CI workflow now install the release binary
113
+ for a repository without npm, instead of the pinned global npm install (`npm i -g`)
114
+ that needed the npm that repository kind is defined by not having. The remedy is the
115
+ one-line download the binary channel names, with its platform derived from `uname`;
116
+ the CI step verifies the download against the published `.sha256` and runs with no
117
+ `setup-node` step at all — a file that runs without a Node toolchain should not have
118
+ one installed to run it.
119
+
120
+ The locator resolves `.simt/bin/simt` between `node_modules` and `PATH`, so the bytes
121
+ a repository downloaded are the bytes its gate runs and a machine-wide install cannot
122
+ shadow them. The dispatcher's version check is unchanged and still refuses a stale
123
+ copy, whichever path found it.
124
+
125
+ Homebrew's formula downloads the release binaries rather than the npm tarball — one
126
+ `url`/`sha256` pair per target, chosen at install time — and no longer declares
127
+ `depends_on "node"`. `scripts/release-formula.mjs` patches each pair by content, and
128
+ the release refuses to publish a formula whose checksums are not the bytes the tagged
129
+ tree builds (ADR-098).
130
+
131
+ ## [0.5.0] — 2026-10-25
132
+
133
+ ### An offline distiller that proposes, never projects
134
+
135
+ `simt distill <skill|doc>` writes a budgeted summary of a skill body or repository
136
+ document with citations to source line ranges (`[L12-L15]`). The default engine is a
137
+ deterministic outline pass with no model and no network; `--local` uses the configured
138
+ local model endpoint from plan 0003 R37. Proposals are cached by content digest in
139
+ `.simt-dev/distilled/<digest>.md` and carry provenance frontmatter (source digest,
140
+ engine, prompt hash, `verified`), so a human merges them into the pack or repository:
141
+ model output never lands in projected or committed text (ADR-090). Every citation is
142
+ verified against the source, and a fabricated one makes the proposal
143
+ `verified: false` with the fault named.
144
+
145
+ ### An advisory critic over the staged diff
146
+
147
+ `simt review` gathers the brief — the governing decision records and scoped rules for
148
+ the staged files — with no model and no network. `simt review --local` sends that brief
149
+ plus the staged diff to the local model and receives an ADR-008 verdict skeleton
150
+ (`BLOCK`, `APPROVE WITH RESIDUAL RISK` or `APPROVE`) that cites rule ids with an
151
+ `@` marker; a citation to an id that governs nothing is named a fabrication, a
152
+ `BLOCK` carries no weight without a file:line or command finding, and a residual-risk
153
+ approval must list what the critic did not review. Verdicts land as proposals in
154
+ `.simt-dev/reviews/<digest>.md` and stay advisory: they become a gate only when
155
+ `simt bench critic --labels <path>` measures precision of at least 0.8 (with recall
156
+ reported) on at least 30 historical diffs human-labelled in a JSONL file the tool
157
+ consumes but never writes.
158
+
159
+ ### Model and effort advice in the brief header
160
+
161
+ `simt brief` now carries an `ADVICE` header, such as `small model, no plan mode` or
162
+ `frontier model, plan first`, derived from the estate's own bench history: the brief's
163
+ task kind and estimated file size pick a neighbourhood of similar bench tasks, the
164
+ cheapest model class that actually resolved them sets the tier on a thirds ladder of
165
+ the classes the estate has observed (no vendor names in code), and median tool calls in
166
+ the neighbourhood set the effort. Nothing is selected: a human still names the model.
167
+ With no history the brief says nothing, and with a thin one it prints a caution rather
168
+ than a guess. The advice is advisory until a held-out bench shows a cost cut of at
169
+ least 25% at a resolved-rate loss of at most 2 points, so the unmeasured bar travels
170
+ in every packet the advice appears in.
171
+
172
+ ### Fixed
173
+
174
+ `package.json` gained the `repository` field npm's provenance verification requires:
175
+ the sigstore bundle is checked against the public source repository, and the missing
176
+ URL rejected the 0.4.0 upload with `E422`.
177
+
9
178
  ## [0.4.0] — 2026-10-20
10
179
 
11
180
  ### Hybrid retrieval fuses BM25, the code graph, and the resolver
@@ -733,6 +902,7 @@ never ran `simt hooks install` again will find nothing until the dependency is r
733
902
  and `simt hooks install --yes` is re-run. That is a real upgrade step and it is called out
734
903
  here rather than discovered.
735
904
 
905
+ [0.5.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.5.0
736
906
  [0.4.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.4.0
737
907
  [0.3.1]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.1
738
908
  [0.3.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.0
package/README.md CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
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)
4
4
 
5
- `simt` adopts a repository for the agents that work in it.
5
+ `simt` adopts a repository for the agents that work in it, and builds an intelligence
6
+ amplifier around them: a brief that answers before the agent explores, gates that
7
+ validate before a tool call, benches that price every rule text, and memory that puts
8
+ a recorded failure to work on the next one.
6
9
 
7
10
  It reads what the repository actually runs, projects the rules that are not already
8
11
  obvious into the files those agents read, and installs only the gates that repository
@@ -20,81 +23,21 @@ Anything that needs a parser grammar, a local model, or another server is a sepa
20
23
  package, off until the repository names it, and it proposes rows or text for a person
21
24
  to merge. It does not write the projection.
22
25
 
23
- ## Today
24
-
25
- ```sh
26
- simt init # adopt or scaffold; prints a plan; --yes writes
27
- simt doctor # what this repo is, and whether its config is healthy
28
- simt check # projection drift, the manifest, and declared checkers
29
- simt sync --yes # regenerate the projection
30
- simt upgrade --yes # move every pin of this tool to this version
31
-
32
- simt rules why ADR-042 # the decision behind a rule, and what was rejected
33
- simt skills brief --task # a short brief for one task
34
- simt tokens # bytes a reader loads at session start
35
- simt shared plan # rules a workspace repeats, and what carrying them once saves
36
- simt harness loaders # what each harness loads, and what its cap drops
37
-
38
- simt hooks install --yes # the git dispatcher, for gates this repo can run
39
- simt agent-hooks install --yes # the same policy before a tool call
40
- simt evidence # runs recorded against this tree
41
- simt index # files, exports and imports, from git blob hashes
42
- simt plan next # the next tracker row that is ready
43
-
44
- simt bench report # resolved rate, quality, cost, across arms
45
- simt compare # every sibling checkout that has adopted
46
- simt mcp # the read-only surface, over stdio
47
- ```
48
-
49
- `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`
50
- and `plan done` print a plan and write nothing without `--yes`. None of them commit
51
- or push. `simt index` writes its cache without asking: the file is gitignored and
52
- `git ls-files` can rebuild it.
53
-
54
- `check` runs the checkers a rule names. A marked line leaves the projection as
55
- `Enforced:` and the checker's name. The file-length line warns past 400 lines and
56
- fails past 1000. `simt evidence check` warns when a commit message claims a passing
57
- run this tree does not have, and the commit fails when `gates.evidence` is `block`.
58
- The commit-msg hook is installed only when that setting is `warn` or `block`.
59
-
60
- ## Where the plan finishes
61
-
62
- The work above is the part that runs. The plan still adds the rest of the loop, in
63
- this order of purpose:
64
-
65
- - **Gates on the change.** A check selects the tests that cover the diff, and the
66
- tool's own gate output is shortened without dropping a failure line.
67
- - **Answers instead of exploration.** A ranked map of the repository, the impact of
68
- a file or a symbol, the tests that cover a change, and the decisions, rules and
69
- skills that govern a path. An external code graph can answer for a language it
70
- covers, and the answer names that source.
71
- - **A brief for the task in front of the agent.** At most 2 KB, pulled at submit or
72
- pushed by a hook, built from the map, the tests and the governing records.
73
- - **A memory that has to earn its place.** A lesson is a candidate when a failing run
74
- is followed by a fix. It is recalled on a later task that looks like it, and it
75
- expires. Variant wording of a rule ships only when the bench says it won.
76
- - **Local models, off unless asked.** Distillation and a critic propose. They do not
77
- write projected text. With no model configured, nothing opens a socket.
78
- - **The small doors.** One finding code explained, a safe `doctor` fix, a one-line
79
- status, an undo journal, a diff of every planned write, shell completions, one
80
- ignore list for every harness plus a secret scan, a worktree per slice, a file
81
- lease when two agents would edit the same path, and a pull-request body taken from
82
- the evidence.
83
-
84
26
  ## Install
85
27
 
86
- Requires **Node >= 22.20.0**. The current published release is **0.4.0**. Pin it.
87
- The tool writes a content digest into the files it generates, and an unpinned upgrade
88
- changes them under you.
28
+ Requires **Node >= 22.20.0** for the npm and PyPI channels; the release binary carries
29
+ its own runtime. The current published release is **0.5.0**. Pin it. The tool writes a
30
+ content digest into the files it generates, and an unpinned upgrade changes them under
31
+ you.
89
32
 
90
33
  ```sh
91
- npm i -D simt-dev@0.4.0
34
+ npm i -D simt-dev@0.5.0
92
35
 
93
36
  # or globally
94
- npm i -g simt-dev@0.4.0
37
+ npm i -g simt-dev@0.5.0
95
38
 
96
39
  # or once, with no install
97
- npx -y simt-dev@0.4.0 check
40
+ npx -y simt-dev@0.5.0 check
98
41
  ```
99
42
 
100
43
  ### From PyPI
@@ -119,37 +62,312 @@ one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra,
119
62
  brew install QuazarMedia/homebrew-tap/simt-dev
120
63
  ```
121
64
 
122
- The formula depends on `node`, so the command works on a machine that has never had
123
- Node installed.
65
+ The formula downloads the single-file binary for this machine, which carries its own
66
+ runtime: the command works with no Node installed.
67
+
68
+ ### As a single-file binary
69
+
70
+ Each release carries one executable per platform — macOS arm64 and x64, Linux x64 —
71
+ beside its `.sha256`. The channel's first release is the version after 0.5.0; pin that,
72
+ and run this from the repository's top level:
73
+
74
+ ```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
76
+ ```
77
+
78
+ The locator checks `.simt/bin/simt` before `PATH`, so the repository's own copy is the
79
+ 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.
82
+
83
+ ## What `simt` does
84
+
85
+ ```sh
86
+ # Adopt, inspect, and maintain a repository
87
+ simt init # adopt or scaffold; prints a plan; --yes writes
88
+ simt doctor # stack, facts, evidence, and config health
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 decide "<title>" --yes # scaffold the next ADR with structured simt-affects / simt-supersedes
107
+ simt lessons list # fail-to-fix, revert, review-block, and hook-denial candidates
108
+ simt lessons review <id> --yes # promote a candidate to docs/lessons/NNNN-<slug>.md
109
+ simt skills index # tier-0 catalogue: every skill, one line each
110
+ simt skills brief --task "<task>" # tier-1 ranked skill selection within budget
111
+ simt skills show <name> # tier-2 skill body on demand (respects --max-bytes)
112
+ simt skills why <name> # the signal chain that selected or rejected a skill
113
+ simt skills find <query> # search skills by capability and keyword
114
+ simt skills install <name> --yes # pin a skill into the repository
115
+ simt skills compile [<name>] # compile to Agent Skills layout, split > 5,000-token bodies, report triggers
116
+ simt skills eval [corpus] # measure resolver precision and recall against a gold corpus
117
+ simt graph lint [--spec agentskills]# verify the skill registry against skills on disk
118
+
119
+ # Dual gates (git time and agent tool-call time) and execution evidence
120
+ simt hooks install --yes # install the shared POSIX git hook dispatcher
121
+ simt hooks status # what each git event routes to, and whether it is wired
122
+ simt hooks run <event> # run pre-commit or pre-push gates now, as git would
123
+ simt agent-hooks install --yes # write pre/post-tool and prompt-submit hooks for active harnesses
124
+ simt agent-hooks status # what each harness will run, and whether Codex trusts it
125
+ simt agent-hook <event> --harness # evaluate pre-tool-use, post-tool-use, or prompt-submit
126
+ simt evidence # gate and test runs recorded against the current git tree
127
+ simt evidence check <msg-file> # verify a commit message does not claim unrecorded passing runs
128
+
129
+ # Plans, context metering, workspace learning, benchmarks, local models, and MCP
130
+ simt plan status # count queued, in-progress, complete, and accepted tracker rows
131
+ simt plan next [<id>] # print the next ready slice section (~1 KB)
132
+ simt plan done <id> [<sha>] --yes # mark a tracker row complete with its commit SHA and test command
133
+ simt tokens [--repos] [--session] # measure bytes loaded at session start or split a transcript
134
+ simt harness detect [--user] # detect configured harnesses at repo and user level
135
+ simt harness loaders [--table] # what each harness loads, in what order, and where its cap truncates
136
+ simt shared plan # rules repeated across a workspace and the bytes saved by sharing
137
+ simt shared install --yes # write shared rules once at user level and record the repo delta
138
+ simt compare # workspace matrix, violated rules, noisy/slow gates, and ADR drafts
139
+ simt local doctor [--allow-remote] # probe configured OpenAI-compatible local chat and embed endpoints
140
+ simt bench mine --yes # mine verified fail-to-pass tasks from git history into the vault
141
+ simt bench run --yes # evaluate arms (bare, current, kernel, brief) in isolated exports
142
+ simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstrap CIs, McNemar/Wilcoxon
143
+ simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
144
+ simt bench probes --yes # 12 deterministic rule-compliance probes
145
+ simt bench variants --yes # evaluate simt-variants slots and lock winners in simt-dev.lock.json
146
+ simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
147
+ simt pack lint [dir] [--require-measured] # validate a pack and state its measured ΔR
148
+ simt pack publish [dir] --yes # publish an npm-sourced pack (git packs name the tag-and-push)
149
+ simt mcp [--list] # serve the 13 read-only tools over stdio JSON-RPC
150
+ ```
151
+
152
+ `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`,
153
+ `skills install`, `plan done`, `lessons review`, `decide`, `pack new`, `pack publish`
154
+ and the `bench` writers print
155
+ a plan and write nothing without `--yes`. None of them commit or push. `simt index`
156
+ writes its cache without asking: the file is gitignored and `git ls-files` can rebuild it.
157
+
158
+ `check` runs the checkers a rule names (`max-file-lines`, `forbid-regex`,
159
+ `forbidden-path-edit`, `required-file`), verifies structured ADR supersessions
160
+ (`prose-partial-supersession`), and flags expired lessons (`LESSON-EXPIRED`). A marked
161
+ rule line leaves the projection as `Enforced:` and the checker's name. The file-length
162
+ line warns past 400 lines and fails past 1000. `simt evidence check` warns when a commit
163
+ message claims a passing run this tree does not have, and the commit fails when
164
+ `gates.evidence` is `block`.
165
+
166
+ ## Agent playbook: how and when to use each module
167
+
168
+ An agent working in an adopted repository should use `simt` as its primary orientation,
169
+ retrieval, validation and memory layer rather than scanning the tree by hand. Every
170
+ read-only command supports `--json` (and `--max-bytes <n>`) or can be called over stdio
171
+ through `simt mcp`.
172
+
173
+ ### Decision tree: which command to run when
174
+
175
+ | Situation | First command | If you need more |
176
+ | --- | --- | --- |
177
+ | New task, no context yet | `simt brief "<task>"` | `simt map --task "<task>"` for broader file ranking |
178
+ | About to edit a file | `simt why <file>` | `simt impact <file>` for blast radius |
179
+ | Need to know what tests to run | `simt tests <file>` | `simt gate --changed` to run them |
180
+ | Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
181
+ | Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
182
+ | Before committing | `simt check` | `simt evidence` to verify test claims |
183
+ | Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
184
+ | Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
185
+ | Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
186
+
187
+ ### 1. Start of task — orient in one call instead of broad exploration
188
+
189
+ 1. **Assemble the task packet first.** Run `simt brief "<task>"` (or call MCP `brief`, or
190
+ read the packet injected automatically when `agent-hooks install --yes` wired
191
+ `prompt-submit`). Within `--budget 2048` bytes (pass `--budget 0` for unlimited or
192
+ `--explain` to see why items were kept or cut), the packet gives:
193
+ - `TASK`: the classified task kind (`bugfix`, `feature`, `refactor`, `test`, `docs`,
194
+ `config`) and the evidence behind it.
195
+ - `COMMANDS`: the exact `build`, `test`, `lint`, `format`, `typecheck`, and focused
196
+ test templates for this repository.
197
+ - `LIKELY FILES`: top files ranked by reciprocal-rank fusion (`RRF_K = 40`) across
198
+ SQLite FTS5 `bm25()`, PageRank graph proximity, and resolver signals.
199
+ - `TESTS`: the test files mapped to those likely files.
200
+ - `DECISIONS`, `SKILLS`, `LESSONS`, `CAUTIONS`, and `FEDERATION`: governing ADRs,
201
+ matched skills, promoted lessons for those paths, active worktree/hook cautions, and
202
+ any structural answer from a declared external code-graph server.
203
+ 2. **Pull the next tracker slice when working from a plan.** Instead of reading a multi-thousand-line
204
+ plan in `docs/plans/` or `docs/reviews/`, run `simt plan next` (or MCP `plan_next`) to
205
+ load only the next queued slice (~1 KB) whose dependencies are already `Complete` or
206
+ `Accepted`.
207
+
208
+ **When to use `--json` format.** When piping output to other tools or when the agent needs
209
+ structured data, add `--json` to any read-only command. For example, `simt brief "<task>" --json`
210
+ returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `skills`,
211
+ `lessons`, `cautions`, and `federation` fields that can be programmatically consumed.
212
+
213
+ ### 2. Before editing — query the graph, blast radius, and governance
214
+
215
+ 1. **Rank files or symbols at the right granularity.** When `brief`'s file list is too
216
+ narrow or the task evolves, run `simt map --task "<task>" --level outline` for paths,
217
+ `--level names` for exported symbols, or `--level signatures` for declaration lines.
218
+ Pass `--embed` when `local.embed` is configured in `simt.json` and clears the +10-point
219
+ recall@10 bar.
220
+ 2. **Check blast radius before changing a shared file or export.** Run
221
+ `simt impact <file|symbol>` to see every direct and transitive importer, the tests
222
+ covering them, the governing rules and ADRs, and any sibling repository in the
223
+ workspace that imports that symbol.
224
+ 3. **Read the governance on a path before changing its behaviour.** Run `simt why <path>`
225
+ to list every ADR whose `simt-affects` matches the file, every scoped rule, skill,
226
+ gate, and promoted lesson. Run `simt why` with no path to audit the repository for
227
+ `UNRESOLVED-AFFECTS` tokens.
228
+ 4. **Resolve deferred rules and citations on demand.** When `simt.json` sets
229
+ `"mode": "kernel"`, only `hard` and `command` rules are loaded at session start;
230
+ `convention` and `style` rules are listed by ID at the foot of the projection. Fetch a
231
+ deferred rule with `simt rules show <id>`, and read any cited `ADR-NNN` with
232
+ `simt rules why ADR-NNN` (or MCP `rules_why`) to see its rulings and whether any ruling
233
+ was superseded or narrowed.
234
+ 5. **Load skills progressively (Tier 0 → Tier 1 → Tier 2).** Never read every skill file
235
+ upfront:
236
+ - Tier 0: `simt skills index` (or MCP `skills_index`) lists one line per skill.
237
+ - Tier 1: `simt skills brief --task "<task>"` (or MCP `skills_brief`) ranks compatible
238
+ skills within budget (`--plan` emits a fetch plan without bodies).
239
+ - Tier 2: `simt skills show <name> --max-bytes 8192` (or MCP `skills_show`) loads only
240
+ the chosen skill's body.
241
+
242
+ **Optimal retrieval strategy.** For best performance, use this sequence:
243
+ 1. `simt brief "<task>"` — gets the most relevant files and tests in one call
244
+ 2. If more files are needed, `simt map --task "<task>" --level outline` — broader ranking
245
+ 3. If you need to understand a specific file's impact, `simt impact <file>` — blast radius
246
+ 4. If you need to understand governance, `simt why <file>` — ADRs and rules
247
+
248
+ ### 3. During implementation — validate incrementally under dual gates
249
+
250
+ 1. **Keep the local index current.** After adding, renaming, or changing exports/imports,
251
+ run `simt index`. It hashes tracked blobs via `git ls-files --stage` and re-extracts
252
+ only changed files in under 300 ms.
253
+ 2. **Run only the tests your change reaches.** Use `simt tests <path>` to inspect which
254
+ tests cover a file (via import edges, naming conventions, or coverage records; add
255
+ `--cochange` to include historical co-change pairs). Run `simt gate --changed` (or
256
+ `simt gate <path...>`) to execute only the tests reachable from the diff, with gate
257
+ output compacted so every failure line survives while passing noise is trimmed.
258
+ 3. **Respect agent-time hooks and learn from failures.** With `simt agent-hooks install --yes`,
259
+ `pre-tool-use` blocks unapproved `git push`, history rewrites (`--no-verify`,
260
+ `--amend`, `reset --hard`, `rebase`), and direct edits to generated regions before the
261
+ tool executes. When a test or gate fails, `post-tool-use` hashes the normalised first
262
+ error line against `docs/lessons/*.md` and injects the matching lesson into context.
263
+
264
+ **Incremental validation workflow.** After each meaningful code change:
265
+ 1. Run `simt tests <changed-file>` to see which tests cover your changes
266
+ 2. Run `simt gate --changed` to execute only the affected tests
267
+ 3. If a test fails, check `simt lessons list` for known issues and their remedies
268
+ 4. If the failure is new, fix it and consider promoting the lesson with `simt lessons review <id> --yes`
269
+
270
+ ### 4. Before committing and closing a slice — verify drift, evidence, and memory
271
+
272
+ 1. **Run the repository gate.** Run `simt check` (or MCP `check`). Fix any reported
273
+ `DRIFT` with `simt sync --yes`, and resolve any rule checker or manifest findings.
274
+ 2. **Verify execution evidence matches the current tree.** Run `simt evidence` to confirm
275
+ that the tests and gates you plan to cite were recorded against the current
276
+ `git write-tree` digest in `.simt/ledger.jsonl`. Any file edit invalidates earlier
277
+ evidence.
278
+ 3. **Record decisions, lessons, and tracker state:**
279
+ - If the change alters what the repository or tool believes, scaffold an ADR with
280
+ `simt decide "<title>" [--supersedes ADR-NNN[:<ruling>]] --yes`.
281
+ - If a failing gate or test was fixed during the session, inspect captured candidates
282
+ with `simt lessons list` and promote reusable ones with
283
+ `simt lessons review <id> --yes`.
284
+ - After committing locally (never push without explicit approval per `ADR-001`), close
285
+ the tracker slice with `simt plan done <id> <sha> --test "<cmd>" --yes`.
286
+
287
+ **Pre-commit checklist.** Before committing, run this sequence:
288
+ 1. `simt check` — verify no drift and all rules pass
289
+ 2. `simt evidence` — confirm test runs are recorded against current tree
290
+ 3. `simt lessons list` — check for any unreviewed lesson candidates
291
+ 4. `git commit` — commit locally (never push without explicit approval)
292
+ 5. `simt plan done <id> <sha> --yes` — close the tracker slice if working from a plan
293
+
294
+ ## Optimal setup for every project, repository, and workspace shape
295
+
296
+ | Shape | How to configure and run `simt` optimally |
297
+ | --- | --- |
298
+ | **Single-package repository** (Node, TypeScript, Python/`uv`, Go, Rust, JVM/Gradle/Maven, Android, Swift, .NET, Deno, Ruby, Dart, Elixir, Cloudflare Workers, React Web, React Native, ConnectIQ, Container) | Run `simt init --yes`, `simt hooks install --yes`, `simt agent-hooks install --yes`, and `simt index`. Stack profiles and runnable gates are selected from committed manifests and build files (`simt doctor` shows `stack`, `facts`, and `factEvidence`). Set `"mode": "kernel"` and `"budget": { "bytes": 12000 }` in `simt.json` to keep session-start tokens minimal while keeping convention/style rules reachable via `simt rules show <id>`. |
299
+ | **Custom stack or repo-specific house rules** | An ecosystem with no built-in profile is still adopted with `core` rules. Add repo-local profiles in `.simt/profiles/<id>.md` with `simt-id`, `simt-title`, `simt-applies`, and `simt-priority` (`hard`, `command`, `convention`, `style`); local profiles project alongside or shadow central ones. Declare custom gates under `gates.commands` and placeholders under `substitutions` in `simt.json`. |
300
+ | **Single-language or polyglot monorepo** (`package.json` `workspaces`, `pnpm-workspace.yaml`, `turbo.json`, `Cargo.toml` `[workspace]`, `go.work`, `settings.gradle`, `settings.gradle.kts`) | `simt init --yes` and `simt sync --yes` discover every workspace member and write both the root `AGENTS.md` and nested `<package>/AGENTS.md` projections carrying only the profiles specific to each package. Set `gates.cwd` in `simt.json` for gates that execute inside a sub-package. Measure nested context load with `simt harness loaders --at <package-dir>`, and use `simt gate --changed` to run only tests for modified packages. |
301
+ | **Multi-repository workspace / estate** (sibling checkouts under a workspace directory or `SIMT_DEV_WORKSPACE`) | Run `simt compare` across the workspace root to inspect adoption, drift, pinned SHAs, hook routing, most-violated rules, noisy/slow gates (`NOISY-GATE`), zero-value rules, and proposed ADR drafts. Run `simt tokens --repos` and `simt shared plan`, then `simt shared install --yes` to move rules repeated across repos into user-level harness files (`~/.claude/CLAUDE.md`, `~/.codex/AGENTS.md`, etc.). Vendor shared rule packs in `.simt/packs/<name>/` pinned by digest in `simt.json`, and upgrade the entire estate atomically with `simt upgrade --yes`. |
302
+ | **Repositories with external code-graph MCP servers** | Declare external stdio MCP servers under `federation` in `simt.json` (`{ name, command, args, tool, argument, languages, timeoutMs }`). `simt brief "<task>"` and the MCP `federation_query` tool ask each server one bounded structural question and cite the server name in `FEDERATION`. |
303
+ | **Offline or local-model-assisted workflows** (Ollama, `llama-server`, LM Studio, MLX) | By default, `simt` uses zero models and opens zero sockets (`ADR-075`, `ADR-090`). To opt in, add `local: { chat: { url, model }, embed: { url, model } }` in `simt.json` pointing at `http://127.0.0.1:<port>/v1`. Each role accepts an optional `apiKey` (sent as `Authorization: Bearer <key>`) for servers that require a token. Verify with `simt local doctor`, and build/query SQLite vector embeddings with `simt index --embed` and `simt map --embed` (non-loopback URLs are refused without `--allow-remote`). |
304
+ | **Rule, skill, and benchmark maintainers** | Lint skills with `simt graph lint --spec agentskills`, compile and split > 5,000-token skills with `simt skills compile`, and score the resolver with `simt skills eval`. Mine git history tasks with `simt bench mine --yes`, run arms with `simt bench run --yes`, compare arms with `simt bench report --compare bare kernel`, run leave-one-out ablation with `simt bench ablate --yes`, run compliance probes with `simt bench probes --yes`, and lock winning `simt-variants` wordings with `simt bench variants --yes`. |
305
+
306
+ ## Module and MCP reference
307
+
308
+ | Module | CLI commands | Read-only MCP tools | When an agent should use it |
309
+ | --- | --- | --- | --- |
310
+ | **Task Brief** | `simt brief "<task>" [--budget <n>] [--explain]` | `brief` | First call on every task to get task kind, commands, ranked files, tests, ADRs, skills, and lessons in <= 2 KB |
311
+ | **Code Graph & Retrieval** | `simt index [--embed]`, `simt map`, `simt impact`, `simt tests`, `simt gate` | `federation_query` | Before editing to rank files (`map`), trace blast radius (`impact`), or run only diff-affected tests (`gate --changed`) |
312
+ | **Governance & Provenance** | `simt why [path]`, `simt rules list`, `simt rules show <id>`, `simt rules why <id\|ADR-NNN>`, `simt decide` | `rules_list`, `rules_why` | Before touching governed files (`why`), when reading deferred kernel rules (`rules show`), or when checking/scaffolding ADRs (`rules why`, `decide`) |
313
+ | **Skills & Disclosure** | `simt skills index\|brief\|show\|why\|find\|install\|compile\|eval`, `simt graph lint` | `skills_index`, `skills_find`, `skills_brief`, `skills_show`, `skills_why` | When a task requires domain workflows or reference docs without blowing the session token budget |
314
+ | **Memory & Lessons** | `simt lessons list`, `simt lessons review <id> --yes` | — | After fixing a failing test/gate or hitting a hook denial, to inspect or promote reusable failure-to-fix lessons |
315
+ | **Plans & Trackers** | `simt plan status`, `simt plan next [<id>]`, `simt plan done <id> [<sha>] --yes` | `plan_next`, `plan_done` | When executing a phased implementation or review plan row by row |
316
+ | **Adoption & Projection** | `simt init`, `simt doctor`, `simt check [--frozen]`, `simt sync`, `simt upgrade`, `simt ci` | `doctor`, `check` | When adopting a repo, diagnosing stack/config health, or verifying zero drift before commit |
317
+ | **Dual Gates & Evidence** | `simt hooks install\|status\|run`, `simt agent-hooks install\|status`, `simt agent-hook`, `simt evidence [check]` | — | When installing git/agent hooks, running gates manually, or verifying test claims before committing |
318
+ | **Context & Harnesses** | `simt tokens [--repos] [--session]`, `simt harness detect\|loaders`, `simt shared plan\|install` | — | When auditing startup token cost across harnesses (`claude`, `codex`, `cursor`, `opencode`, `antigravity`, `copilot`, `deepseek`) or deduplicating workspace rules |
319
+ | **Workspace & Benchmarks** | `simt compare`, `simt bench mine\|run\|report\|ablate\|probes\|variants`, `simt local doctor` | `compare` | When auditing an entire multi-repo estate, measuring rule uplift/cost, or probing local model endpoints |
320
+
321
+ ## Where the plan finishes
322
+
323
+ Slices `R01`–`R45` are complete and shipped in `0.6.0`. The remaining queued slices are the
324
+ small ergonomics:
325
+
326
+ - **The small doors (`R46`–`R55`).** `simt explain <CODE>` for every finding code, safe
327
+ idempotent `simt doctor --fix`, a `< 50 ms` `simt status --line`, a write journal with
328
+ `simt undo`, `--diff` on every writer, shell completions, one cross-harness ignore list
329
+ plus a staged-diff secret scan, `simt slice start/finish <ID>` worktrees, file leases
330
+ for parallel agents, and `simt pr-body` assembled from the evidence ledger.
331
+
332
+ The local-model slices (`R38`–`R40`) shipped as they lab-written: `simt distill` proposes
333
+ budgeted summaries with line citations, `simt review` proposes an advisory ADR-008
334
+ verdict over the staged diff, and `simt brief` carries model/effort advice from bench
335
+ history. All remain off until named and propose rather than write projected text.
124
336
 
125
337
  ## What it writes
126
338
 
127
339
  | Path | What |
128
340
  | --- | --- |
129
- | `AGENTS.md` | the projection, between `<!-- simt:begin -->` and `<!-- simt:end -->`. The old `simt-dev:` markers are still read, and a region migrates on its next write |
130
- | `simt.json` | the manifest: gates, substitutions, budget, shared rules, surfaces |
131
- | `simt-dev.lock.json` | the digest of the inputs and the digest of the projection |
341
+ | `AGENTS.md` (and `<package>/AGENTS.md` in monorepos) | the projection, between `<!-- simt:begin -->` and `<!-- simt:end -->`. The old `simt-dev:` markers are still read, and a region migrates on its next write |
342
+ | `simt.json` | the manifest: `gates`, `substitutions`, `budget`, `mode`, `shared`, `surfaces`, `plans`, `packs`, `federation`, `local` |
343
+ | `simt-dev.lock.json` | the digest of the inputs, the digest of the projection, and locked `variants` winners from `simt bench variants` |
132
344
  | `.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 |
133
345
  | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
134
346
  | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
347
+ | `docs/decisions/ADR-NNN-<slug>.md` | numbered decision records scaffolded by `simt decide --yes` with `simt-affects` and `simt-supersedes` frontmatter |
348
+ | `docs/lessons/NNNN-<slug>.md` | reviewed lessons promoted by `simt lessons review <id> --yes` with `simt-trigger`, `simt-evidence`, and `simt-expires` frontmatter |
135
349
 
136
350
  Text outside the markers is left alone. A regeneration does not revert it.
137
351
 
138
352
  `simt.json` also carries a `federation` block when the repository names external
139
- code-graph servers, each with the command that starts it. A brief may then ask one of
140
- them one structural question for a task and cite the answer's source, and the MCP
141
- `federation_query` tool asks one on demand, naming the server it asked. The question goes
142
- to the tool and argument the manifest declared, so no foreign tool is reachable that the
143
- repository did not name. Nothing is started unless the manifest declared it, and a server
144
- that does not answer costs the packet a sentence, never the packet.
353
+ code-graph servers, each with the command that starts it, and an optional `local` block
354
+ when the repository names loopback OpenAI-compatible `chat` or `embed` endpoints. A brief
355
+ may then ask a federated server one structural question for a task and cite the answer's
356
+ source, and the MCP `federation_query` tool asks one on demand, naming the server it
357
+ asked. The question goes to the tool and argument the manifest declared, so no foreign
358
+ tool is reachable that the repository did not name. Nothing is started and no socket is
359
+ opened unless the manifest declared it, and a server that does not answer costs the
360
+ packet a sentence, never the packet.
145
361
 
146
362
  These are caches, gitignored, and rebuildable. They are not repository content:
147
363
 
148
364
  | Path | What |
149
365
  | --- | --- |
150
- | `.simt-dev/index.sqlite` | files, symbols, import edges. JSON-lines at `.simt-dev/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
151
- | `.simt-dev/ledger.jsonl` | one line per gate the dispatcher actually ran, against one git tree |
152
- | `.simt-dev/bench/runs/` | benchmark runs |
366
+ | `.simt/index.sqlite` | files, symbols, import/call/test/governs/cochange edges, FTS5 `fts` tokens across `code`, `docs`, `skills`, `decisions` and `lessons`, and optional `embeddings` vector blobs. JSON-lines at `.simt/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
367
+ | `.simt/ledger.jsonl` | one line per gate or test the dispatcher actually ran, against one git tree, plus normalised failure signatures |
368
+ | `.simt/lessons.jsonl` | deterministic lesson candidates captured from fail-to-fix pairs, reverts, `BLOCK` reviews, and hook denials |
369
+ | `.simt/bench/` | mined tasks (`tasks/`), test patch vault (`vault/`), and benchmark runs (`runs/`) |
370
+ | `.simt/proposals/` | non-authoritative skill description proposals with `{model, promptHash, digest}` provenance |
153
371
 
154
372
  `simt shared install --yes` writes a user-level copy of the rules a workspace
155
373
  repeats, into the file that harness documents, and records the ids on each
@@ -2,6 +2,19 @@
2
2
 
3
3
  Status: **accepted** · 2026-10-11
4
4
 
5
+ > Ruling 7's re-run mechanics are superseded by
6
+ > [ADR-097](ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md):
7
+ > the two channel jobs moved to a manual `workflow_dispatch` workflow whose `version`
8
+ > input dissolves the branch-vs-tag failure recorded below. The ordering ruling —
9
+ > npm live before either channel publishes — stands.
10
+
11
+ > Ruling 5's artefact choice and the Homebrew half of ruling 7 are superseded by
12
+ > [ADR-098](ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md): the
13
+ > formula now downloads the release binary, not the npm tarball, and the Homebrew job's
14
+ > precondition is that those assets exist rather than that the npm version is live. The
15
+ > PyPI half of ruling 7 — npm live before the wheel publishes — stands, as does ruling
16
+ > 5's refusal of `std_npm_args`.
17
+
5
18
  Affects: `pyproject.toml`, `python/simt_dev/`, `Formula/simt-dev.rb`,
6
19
  `.github/workflows/publish.yml`, `scripts/release-formula.mjs`,
7
20
  `scripts/verify-wheel.mjs`, `test/packaging.test.mjs`