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.
- package/CHANGELOG.md +170 -0
- package/README.md +300 -82
- package/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +13 -0
- package/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +1 -1
- package/docs/decisions/ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md +71 -0
- package/docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md +149 -0
- package/package.json +8 -4
- package/src/advice/advice.mjs +229 -0
- package/src/agenthooks/render.mjs +87 -21
- package/src/argv.mjs +25 -0
- package/src/bench/ablate.mjs +1 -3
- package/src/bench/grade.mjs +1 -1
- package/src/bench/mine.mjs +3 -3
- package/src/bench/probes.mjs +1 -3
- package/src/bench/report.mjs +1 -3
- package/src/bench/run.mjs +4 -18
- package/src/bench/tasks.mjs +36 -0
- package/src/bench/variants.mjs +1 -3
- package/src/brief/assemble.mjs +24 -4
- package/src/brief/packet.mjs +4 -1
- package/src/ci/dependabot.mjs +1 -1
- package/src/ci/workflow.mjs +40 -12
- package/src/commands/agenthook.mjs +6 -2
- package/src/commands/bench.mjs +35 -3
- package/src/commands/ci.mjs +1 -1
- package/src/commands/compare.mjs +1 -1
- package/src/commands/distill.mjs +36 -0
- package/src/commands/gate.mjs +2 -2
- package/src/commands/graph.mjs +2 -2
- package/src/commands/harness.mjs +87 -14
- package/src/commands/help.mjs +54 -4
- package/src/commands/hooks.mjs +1 -1
- package/src/commands/index.mjs +29 -3
- package/src/commands/init.mjs +2 -2
- package/src/commands/local.mjs +11 -0
- package/src/commands/mcp.mjs +1 -1
- package/src/commands/pack.mjs +246 -0
- package/src/commands/plugin.mjs +61 -0
- package/src/commands/review.mjs +65 -0
- package/src/commands/rules.mjs +1 -1
- package/src/commands/skills.mjs +3 -34
- package/src/commands/skillscompile.mjs +1 -3
- package/src/commands/skillsinstall.mjs +1 -1
- package/src/commands/sync.mjs +8 -8
- package/src/commands/tokens.mjs +1 -1
- package/src/commands/upgrade.mjs +1 -1
- package/src/commands/why.mjs +6 -3
- package/src/compare/discover.mjs +1 -1
- package/src/compare/hooksstate.mjs +19 -7
- package/src/compare/learn.mjs +2 -2
- package/src/compare/row.mjs +3 -3
- package/src/decisions/index.mjs +1 -1
- package/src/distill/distill.mjs +246 -0
- package/src/distill/engine.mjs +187 -0
- package/src/distribute/release.mjs +142 -0
- package/src/graph/load.mjs +9 -8
- package/src/hooks/dispatcher.mjs +3 -2
- package/src/hooks/shim.mjs +11 -6
- package/src/index/govern.mjs +1 -1
- package/src/index/map.mjs +1 -1
- package/src/index/persist.mjs +2 -2
- package/src/index/store.mjs +50 -20
- package/src/ledger/index.mjs +2 -2
- package/src/local/client.mjs +22 -8
- package/src/local/config.mjs +52 -0
- package/src/locate.mjs +22 -1
- package/src/mcp/prompts.mjs +118 -0
- package/src/mcp/resources.mjs +96 -22
- package/src/mcp/server.mjs +33 -6
- package/src/mcp/tools.mjs +12 -12
- package/src/measure/session.mjs +1 -1
- package/src/memory/decide.mjs +1 -1
- package/src/memory/lessons.mjs +14 -14
- package/src/name.mjs +11 -1
- package/src/package-version.mjs +12 -10
- package/src/packs/manage.mjs +563 -0
- package/src/packs.mjs +15 -5
- package/src/plugins.mjs +164 -0
- package/src/projection/loaders.mjs +84 -10
- package/src/projection/manifest.mjs +4 -4
- package/src/projection/project.mjs +3 -3
- package/src/projection/rules.mjs +24 -4
- package/src/projection/surfaces.mjs +20 -2
- package/src/resolve/body.mjs +46 -0
- package/src/review/critic.mjs +509 -0
- package/src/toolwords.mjs +8 -5
- package/src/tsconfig.mjs +3 -3
- package/src/upgrade/plan.mjs +1 -1
- /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
|

|
|
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
|
|
87
|
-
|
|
88
|
-
changes them under
|
|
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.
|
|
34
|
+
npm i -D simt-dev@0.5.0
|
|
92
35
|
|
|
93
36
|
# or globally
|
|
94
|
-
npm i -g simt-dev@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.
|
|
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
|
|
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
|
|
131
|
-
| `simt-dev.lock.json` | the digest of the inputs
|
|
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
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
that
|
|
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
|
|
151
|
-
| `.simt
|
|
152
|
-
| `.simt
|
|
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`
|