simt-dev 0.6.3__tar.gz → 0.7.1__tar.gz

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 (351) hide show
  1. simt_dev-0.7.1/.gitignore +27 -0
  2. simt_dev-0.7.1/CHANGELOG.md +305 -0
  3. {simt_dev-0.6.3 → simt_dev-0.7.1}/PKG-INFO +22 -136
  4. {simt_dev-0.6.3 → simt_dev-0.7.1}/README.md +21 -135
  5. simt_dev-0.7.1/agents/simt-agent.md +84 -0
  6. simt_dev-0.7.1/bin/simt.mjs +24 -0
  7. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-009-skill-layout.md +1 -1
  8. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-014-workspace-is-configuration.md +1 -1
  9. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md +1 -1
  10. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +1 -1
  11. simt_dev-0.7.1/docs/decisions/ADR-106-the-harness-hook-runs-through-a-repo-shim.md +46 -0
  12. simt_dev-0.7.1/docs/decisions/ADR-107-an-install-can-name-one-harness-and-the-skipped-ones-are-named.md +51 -0
  13. simt_dev-0.7.1/docs/decisions/ADR-108-an-adoption-builds-the-index-and-a-command-refreshes-it-on-read.md +59 -0
  14. simt_dev-0.7.1/docs/decisions/ADR-109-simt-dev-is-its-own-consumer-and-the-guards-that-kept-it-from-being-one-are-retired.md +47 -0
  15. simt_dev-0.7.1/docs/decisions/ADR-110-the-lock-file-follows-the-manifest-name-and-the-old-name-is-read-until-the-next-write.md +43 -0
  16. simt_dev-0.7.1/docs/decisions/ADR-111-the-tool-ships-one-agent-rendered-per-harness-and-installs-it-with-init-and-a-command.md +75 -0
  17. simt_dev-0.7.1/docs/decisions/ADR-112-the-registry-is-what-simt-dev-ships-and-a-repo-owns-its-own-skills.md +81 -0
  18. simt_dev-0.7.1/docs/decisions/ADR-113-a-pre-push-that-carries-only-documentation-skips-the-test-gate-and-says-so.md +87 -0
  19. simt_dev-0.7.1/docs/decisions/ADR-114-the-bench-pairs-at-the-task-level-a-missing-cost-is-not-zero-and-an-unasked-cross-group-compare-is-refused.md +74 -0
  20. simt_dev-0.7.1/docs/decisions/ADR-115-the-index-stamps-its-schema-version-migrates-older-databases-in-place-and-serves-newer-ones-from-a-sidecar.md +69 -0
  21. simt_dev-0.7.1/docs/decisions/ADR-116-rust-support-reaches-the-example-path-the-indent-and-the-bench-runner.md +100 -0
  22. simt_dev-0.7.1/docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md +81 -0
  23. simt_dev-0.7.1/docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md +91 -0
  24. simt_dev-0.7.1/docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md +90 -0
  25. simt_dev-0.7.1/docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md +96 -0
  26. simt_dev-0.7.1/docs/decisions/ADR-122-the-shims-move-into-the-state-directory-and-the-legacy-directory-removes-itself.md +94 -0
  27. simt_dev-0.7.1/docs/decisions/ADR-123-a-surplus-positional-is-not-refused-because-arity-is-not-in-the-source.md +57 -0
  28. simt_dev-0.7.1/docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md +64 -0
  29. simt_dev-0.7.1/docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md +65 -0
  30. {simt_dev-0.6.3 → simt_dev-0.7.1}/package.json +13 -3
  31. {simt_dev-0.6.3 → simt_dev-0.7.1}/pyproject.toml +4 -0
  32. {simt_dev-0.6.3 → simt_dev-0.7.1}/python/simt_dev/cli.py +41 -0
  33. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/core.md +9 -2
  34. simt_dev-0.7.1/rules/mdc/slice-commit.mdc +105 -0
  35. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/mdc/test-gate.mdc +2 -0
  36. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/android.md +3 -3
  37. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/connectiq.md +2 -2
  38. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/dart.md +1 -1
  39. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/deno.md +1 -1
  40. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/dotnet.md +1 -1
  41. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/elixir.md +1 -1
  42. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/go.md +1 -1
  43. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/jvm.md +3 -2
  44. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/node.md +2 -2
  45. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/python.md +7 -6
  46. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/ruby.md +1 -1
  47. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/rust.md +1 -1
  48. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/swift.md +1 -1
  49. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/typescript.md +2 -2
  50. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/uv.md +3 -2
  51. simt_dev-0.7.1/skills/simt-commands/SKILL.md +70 -0
  52. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/advice/advice.mjs +7 -3
  53. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/agenthooks/decide.mjs +141 -9
  54. simt_dev-0.7.1/src/agenthooks/opencode.mjs +72 -0
  55. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/agenthooks/prompt.mjs +10 -3
  56. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/agenthooks/render.mjs +186 -19
  57. simt_dev-0.7.1/src/agenthooks/shim.mjs +55 -0
  58. simt_dev-0.7.1/src/agents/render.mjs +277 -0
  59. simt_dev-0.7.1/src/api.mjs +29 -0
  60. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/argv.mjs +37 -3
  61. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/ablate.mjs +31 -14
  62. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/adapters.json +16 -0
  63. simt_dev-0.7.1/src/bench/corpus.mjs +150 -0
  64. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/grade.mjs +23 -49
  65. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/mine.mjs +247 -36
  66. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/probes.mjs +104 -68
  67. simt_dev-0.7.1/src/bench/process.mjs +128 -0
  68. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/report.mjs +260 -84
  69. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/run.mjs +251 -150
  70. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/variants.mjs +112 -40
  71. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/brief/assemble.mjs +44 -3
  72. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/ci/workflow.mjs +46 -14
  73. simt_dev-0.6.3/bin/simt.mjs → simt_dev-0.7.1/src/cli.mjs +8 -23
  74. simt_dev-0.7.1/src/commands/agent.mjs +205 -0
  75. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/agenthook.mjs +113 -20
  76. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/bench.mjs +192 -18
  77. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/brief.mjs +5 -4
  78. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/ci.mjs +2 -1
  79. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/compare.mjs +50 -49
  80. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/completions.mjs +2 -6
  81. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/decide.mjs +10 -9
  82. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/distill.mjs +4 -3
  83. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/doctor.mjs +11 -7
  84. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/evidence.mjs +19 -12
  85. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/explain.mjs +0 -1
  86. simt_dev-0.7.1/src/commands/gate.mjs +235 -0
  87. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/graph.mjs +20 -8
  88. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/harness.mjs +3 -2
  89. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/help.mjs +160 -31
  90. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/hooks.mjs +163 -50
  91. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/ignore.mjs +2 -1
  92. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/impact.mjs +8 -9
  93. simt_dev-0.7.1/src/commands/index.mjs +420 -0
  94. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/init.mjs +171 -38
  95. simt_dev-0.7.1/src/commands/lease.mjs +303 -0
  96. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/lessons.mjs +72 -15
  97. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/local.mjs +3 -3
  98. simt_dev-0.7.1/src/commands/map.mjs +146 -0
  99. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/mcp.mjs +0 -1
  100. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/pack.mjs +9 -6
  101. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/plan.mjs +6 -5
  102. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/plugin.mjs +3 -3
  103. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/prbody.mjs +3 -3
  104. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/repoindex.mjs +5 -3
  105. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/review.mjs +2 -2
  106. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/rules.mjs +124 -33
  107. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/shared.mjs +2 -3
  108. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/skills.mjs +82 -45
  109. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/skillscompile.mjs +12 -12
  110. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/skillsinstall.mjs +14 -2
  111. simt_dev-0.7.1/src/commands/slice.mjs +723 -0
  112. simt_dev-0.7.1/src/commands/spec.mjs +151 -0
  113. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/status.mjs +4 -7
  114. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/sync.mjs +50 -33
  115. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/tests.mjs +11 -11
  116. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/tokens.mjs +2 -2
  117. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/undo.mjs +29 -31
  118. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/upgrade.mjs +40 -4
  119. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/commands/why.mjs +19 -12
  120. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/compare/hooksstate.mjs +23 -1
  121. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/compare/learn.mjs +82 -57
  122. simt_dev-0.7.1/src/compare/parallel.mjs +50 -0
  123. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/compare/row.mjs +26 -3
  124. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/completions.mjs +5 -0
  125. simt_dev-0.7.1/src/context.mjs +64 -0
  126. simt_dev-0.7.1/src/decisions/dir.mjs +84 -0
  127. simt_dev-0.7.1/src/decisions/index-doc.mjs +46 -0
  128. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/decisions/index.mjs +109 -11
  129. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/diff.mjs +1 -1
  130. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/distill/distill.mjs +17 -2
  131. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/distill/engine.mjs +5 -1
  132. simt_dev-0.7.1/src/ecosystem/node-runner.mjs +144 -0
  133. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/explain.mjs +18 -6
  134. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/graph/load.mjs +42 -20
  135. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/hooks/capability.mjs +17 -4
  136. simt_dev-0.7.1/src/hooks/dispatcher.mjs +948 -0
  137. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/hooks/gates.mjs +0 -43
  138. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/hooks/resolve.mjs +11 -10
  139. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/hooks/shim.mjs +17 -9
  140. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/identity.mjs +96 -15
  141. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/extract.mjs +192 -11
  142. simt_dev-0.7.1/src/index/persist.mjs +556 -0
  143. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/store.mjs +263 -60
  144. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/tests.mjs +6 -35
  145. simt_dev-0.7.1/src/journal.mjs +614 -0
  146. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/kernel/card.mjs +37 -12
  147. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/kernel/checks.mjs +44 -9
  148. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/kernel/variants.mjs +27 -16
  149. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/lease.mjs +97 -15
  150. simt_dev-0.7.1/src/ledger/index.mjs +242 -0
  151. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/local/client.mjs +4 -6
  152. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/locate.mjs +33 -9
  153. simt_dev-0.7.1/src/manifest/schema.mjs +213 -0
  154. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/mcp/resources.mjs +12 -13
  155. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/mcp/server.mjs +151 -38
  156. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/mcp/tools.mjs +90 -16
  157. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/measure/session.mjs +3 -2
  158. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/memory/decide.mjs +98 -43
  159. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/memory/lessons.mjs +168 -33
  160. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/name.mjs +9 -0
  161. simt_dev-0.7.1/src/node-version.mjs +37 -0
  162. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/output/index.mjs +111 -3
  163. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/packs/manage.mjs +17 -3
  164. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/packs.mjs +20 -2
  165. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/plan/index.mjs +31 -8
  166. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/plan/template.mjs +27 -5
  167. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/plugins.mjs +6 -2
  168. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/prbody.mjs +7 -5
  169. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/baselines.mjs +1 -1
  170. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/disclosure.mjs +2 -2
  171. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/loaders.mjs +41 -1
  172. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/lock.mjs +31 -14
  173. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/manifest.mjs +89 -53
  174. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/markers.mjs +43 -3
  175. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/mdc.mjs +34 -7
  176. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/project.mjs +162 -18
  177. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/rules.mjs +58 -6
  178. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/surfaces.mjs +9 -1
  179. simt_dev-0.7.1/src/repo-root.mjs +88 -0
  180. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/body.mjs +4 -0
  181. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/fingerprint.mjs +24 -15
  182. simt_dev-0.7.1/src/resolve/local.mjs +58 -0
  183. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/review/critic.mjs +6 -3
  184. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/secrets.mjs +165 -22
  185. simt_dev-0.7.1/src/state.mjs +76 -0
  186. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/status.mjs +9 -4
  187. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/toolwords.mjs +8 -0
  188. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/tsconfig.mjs +39 -99
  189. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/workspace.mjs +55 -10
  190. {simt_dev-0.6.3 → simt_dev-0.7.1}/templates/plan/tracker.json +1 -1
  191. simt_dev-0.6.3/.gitignore +0 -33
  192. simt_dev-0.6.3/CHANGELOG.md +0 -984
  193. simt_dev-0.6.3/docs/decisions/README.md +0 -591
  194. simt_dev-0.6.3/rules/mdc/slice-commit.mdc +0 -52
  195. simt_dev-0.6.3/src/commands/gate.mjs +0 -165
  196. simt_dev-0.6.3/src/commands/index.mjs +0 -322
  197. simt_dev-0.6.3/src/commands/lease.mjs +0 -136
  198. simt_dev-0.6.3/src/commands/map.mjs +0 -126
  199. simt_dev-0.6.3/src/commands/slice.mjs +0 -353
  200. simt_dev-0.6.3/src/hooks/dispatcher.mjs +0 -471
  201. simt_dev-0.6.3/src/index/persist.mjs +0 -296
  202. simt_dev-0.6.3/src/journal.mjs +0 -326
  203. simt_dev-0.6.3/src/ledger/index.mjs +0 -147
  204. {simt_dev-0.6.3 → simt_dev-0.7.1}/LICENSE +0 -0
  205. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-001-push-requires-approval.md +0 -0
  206. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-002-refactor-blast-radius.md +0 -0
  207. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-003-test-breadth.md +0 -0
  208. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-004-hook-owns-format.md +0 -0
  209. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-005-file-length.md +0 -0
  210. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-006-coverage-bar.md +0 -0
  211. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-007-section-skeleton.md +0 -0
  212. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-008-verdict-vocabulary.md +0 -0
  213. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-010-runner-invocation.md +0 -0
  214. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-011-windows-support.md +0 -0
  215. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-012-drop-windows-support.md +0 -0
  216. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +0 -0
  217. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +0 -0
  218. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +0 -0
  219. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +0 -0
  220. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +0 -0
  221. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +0 -0
  222. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +0 -0
  223. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-021-one-surface-per-repo.md +0 -0
  224. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +0 -0
  225. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +0 -0
  226. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +0 -0
  227. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +0 -0
  228. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +0 -0
  229. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +0 -0
  230. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +0 -0
  231. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +0 -0
  232. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +0 -0
  233. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +0 -0
  234. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +0 -0
  235. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -0
  236. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +0 -0
  237. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +0 -0
  238. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md +0 -0
  239. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +0 -0
  240. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +0 -0
  241. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +0 -0
  242. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +0 -0
  243. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +0 -0
  244. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +0 -0
  245. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +0 -0
  246. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-044-compatibility-is-not-evidence.md +0 -0
  247. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +0 -0
  248. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-046-one-rule-one-copy.md +0 -0
  249. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +0 -0
  250. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +0 -0
  251. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-049-a-ruling-that-a-later-record-moved-says-so-where-it-is-printed.md +0 -0
  252. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-050-a-byte-count-is-not-a-region-and-updated-is-not-a-change-of-rules.md +0 -0
  253. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-051-a-pointer-is-the-readers-only-route-so-it-is-not-a-convenience.md +0 -0
  254. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +0 -0
  255. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +0 -0
  256. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +0 -0
  257. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +0 -0
  258. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +0 -0
  259. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +0 -0
  260. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +0 -0
  261. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +0 -0
  262. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-060-a-repository-with-nothing-to-run-is-adopted-and-says-so.md +0 -0
  263. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md +0 -0
  264. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md +0 -0
  265. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md +0 -0
  266. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md +0 -0
  267. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md +0 -0
  268. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-066-a-monorepo-projects-once-per-package.md +0 -0
  269. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-067-which-harnesses-read-agents-md-is-a-column.md +0 -0
  270. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md +0 -0
  271. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-069-the-conformance-lint-checks-the-published-specification.md +0 -0
  272. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md +0 -0
  273. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md +0 -0
  274. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md +0 -0
  275. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md +0 -0
  276. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md +0 -0
  277. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-075-nothing-leaves-the-machine.md +0 -0
  278. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md +0 -0
  279. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md +0 -0
  280. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md +0 -0
  281. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md +0 -0
  282. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-080-the-tools-own-names-are-not-repositories-and-neither-reader-decides-by-shape.md +0 -0
  283. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md +0 -0
  284. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +0 -0
  285. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md +0 -0
  286. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md +0 -0
  287. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md +0 -0
  288. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md +0 -0
  289. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md +0 -0
  290. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md +0 -0
  291. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md +0 -0
  292. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md +0 -0
  293. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md +0 -0
  294. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-093-why-names-what-governs-a-file.md +0 -0
  295. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md +0 -0
  296. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-095-gate-output-keeps-the-failures.md +0 -0
  297. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-096-impact-names-who-a-change-reaches.md +0 -0
  298. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md +0 -0
  299. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md +0 -0
  300. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-100-a-staged-diff-is-the-last-gate-before-history-and-it-runs-inside-the-tool.md +0 -0
  301. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-101-a-file-lease-belongs-to-one-session-and-the-pre-edit-hook-refuses-another.md +0 -0
  302. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -0
  303. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-103-co-projected-duplicates-merge-down.md +0 -0
  304. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-104-the-pre-tool-use-policy-reads-the-command-the-way-a-shell-reads-it.md +0 -0
  305. {simt_dev-0.6.3 → simt_dev-0.7.1}/docs/decisions/ADR-105-the-json-ceiling-shrinks-arrays-and-never-cuts-bytes.md +0 -0
  306. {simt_dev-0.6.3 → simt_dev-0.7.1}/python/simt_dev/__init__.py +0 -0
  307. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/mdc/intake-questions.mdc +0 -0
  308. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/mdc/preview-postflight.mdc +0 -0
  309. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/cloudflare-workers.md +0 -0
  310. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/container.md +0 -0
  311. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/react-native.md +0 -0
  312. {simt_dev-0.6.3 → simt_dev-0.7.1}/rules/stacks/react-web.md +0 -0
  313. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/agenthooks/policy.mjs +0 -0
  314. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/agenthooks/shell.mjs +0 -0
  315. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/bench/tasks.mjs +0 -0
  316. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/brief/kind.mjs +0 -0
  317. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/brief/packet.mjs +0 -0
  318. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/ci/dependabot.mjs +0 -0
  319. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/compare/discover.mjs +0 -0
  320. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/distribute/release.mjs +0 -0
  321. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/federation/client.mjs +0 -0
  322. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/federation/config.mjs +0 -0
  323. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/federation/query.mjs +0 -0
  324. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/graph/compile.mjs +0 -0
  325. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/graph/spec.mjs +0 -0
  326. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/graph/speccheck.mjs +0 -0
  327. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/hooks/where.mjs +0 -0
  328. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/ignore.mjs +0 -0
  329. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/compact.mjs +0 -0
  330. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/gate.mjs +0 -0
  331. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/govern.mjs +0 -0
  332. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/impact.mjs +0 -0
  333. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/index/map.mjs +0 -0
  334. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/kernel/budget.mjs +0 -0
  335. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/kernel/inferability.mjs +0 -0
  336. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/local/config.mjs +0 -0
  337. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/mcp/prompts.mjs +0 -0
  338. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/mcp/schema.mjs +0 -0
  339. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/measure/context.mjs +0 -0
  340. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/measure/loaderView.mjs +0 -0
  341. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/monorepo.mjs +0 -0
  342. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/package-version.mjs +0 -0
  343. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/conflicts.mjs +0 -0
  344. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/shared.mjs +0 -0
  345. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/projection/targets.mjs +0 -0
  346. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/eval.mjs +0 -0
  347. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/near.mjs +0 -0
  348. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/resolve.mjs +0 -0
  349. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/resolve/source.mjs +0 -0
  350. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/toolchain.mjs +0 -0
  351. {simt_dev-0.6.3 → simt_dev-0.7.1}/src/upgrade/plan.mjs +0 -0
@@ -0,0 +1,27 @@
1
+ # Editors and operating systems
2
+ .DS_Store
3
+ .idea/
4
+ # Per-developer git identity, written by `simt init`. Not a file to share:
5
+ # it carries whoever is committing into the tree, and a repository has more than
6
+ # one of those. See ADR-057.
7
+ git.config
8
+
9
+ .pybuild/
10
+ dist/
11
+ .sea-cache/
12
+ .cloud-attachments/
13
+
14
+ # simt-dev runtime state (per-developer; never shared): journal, evidence ledger,
15
+ # index cache, benchmark runs, local-model proposals. Nothing in here is committed,
16
+ # so ignore the whole directory rather than tracking its ever-growing file list.
17
+ .simt/
18
+
19
+ .codex/
20
+ .opencode/
21
+ .claude/
22
+ .cursor/
23
+ .gemini/
24
+ .freebuff/
25
+
26
+ # Write journal for `simt undo`. Local state, never shared.
27
+ .simt/local/
@@ -0,0 +1,305 @@
1
+ # Changelog
2
+
3
+ All notable changes to this package are recorded here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project follows
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.7.1] — 2026-11-01
10
+
11
+ ### Added
12
+
13
+ - `simt --help` answers one command at a time from the spec table, and a core page that fits a terminal; `--all` prints everything.
14
+ - Every command declares the flags it reads in one spec table that owns the command list, the group defaults and the MCP tool surface; the parser accepts exactly what the table declares.
15
+ - The `simt.json` manifest has a schema in the tool: the loader names an unknown key, and the keys the tool generates come from the table, so a repository's own keys stay the repository's. — [ADR-124](docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md)
16
+ - The `simt.lock.json` lock records its own format version, and namespaces register the keys they own.
17
+ - The read commands are a library imported by name: `check`, `fingerprint`, `skills`, `doctor` and `rules` read the repository through one shared context, so a read that asked five questions walks the tree once. — [ADR-125](docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md)
18
+ - The `Co-Authored-By` trailer is written into the commit template and into `slice finish` commits.
19
+ - `SIMT_DEV_WORKSPACE` points into a workspace the repository declared. — [ADR-119](docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md)
20
+
21
+ ### Changed
22
+
23
+ The git shims move from the top-level `.simt-hooks/` directory into the state
24
+ directory at `.simt/hooks/`, and `core.hooksPath` follows (ADR-122). Every
25
+ piece of per-repo state now has one root, and the ignore line that existed
26
+ only for the shims is dropped. A repository installed before the move
27
+ self-heals on its next `hooks install --yes`: the routing re-points, the new
28
+ shims land, and the legacy directory is removed — journaled, so `undo`
29
+ brings it back — but only when every file in it carries a simt-dev marker; a
30
+ file the tool cannot recognise as its own leaves the directory in place.
31
+ Because the shims land under the state directory, the journal records writes
32
+ to the shim directory: it is the one named exception to the unjournaled state
33
+ directory, since the undo that restores `core.hooksPath` must restore the
34
+ shims with it.
35
+
36
+ Journal sets that predate the move into `.simt/local/journal` live in the
37
+ fallback directory `.simt/journal`, which `undo` can only see while the
38
+ current directory is absent — a repository that accumulated history under the
39
+ old path lost it to `undo` on its first write after the move. The next
40
+ journal write now moves the legacy sets into the current directory, and the
41
+ fallback directory goes with its last file: a name present in both keeps
42
+ both records when the bytes differ, and a crash mid-move is finished by the
43
+ next write, so the migration is idempotent.
44
+
45
+ - The CLI loads only the command module the matched path needs, so a run pays for one command, not the registry.
46
+ - The `--json` envelope carries the canonical command path and the run's exit code, and `ok` agrees with the exit code.
47
+ - Run warnings travel in the JSON document, not only on stderr, and run notices are named distinctly from the warnings count the commands already report.
48
+ - A pre-push whose tree already passed the full suite skips the test gate on that evidence and says so, naming the push kind; the hook runs in a clone, and main is gated with a timeout that fits the run. — [ADR-120](docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md)
49
+ - The decisions index is rendered from the decision records and leaves the shipped records directory, so it cannot drift from what the records say.
50
+ - The bench corpus is keyed on history, append-only, and portable as a sealed document; a re-mine no longer silently replaces it, and the Gradle and Maven graders read nothing from the corpus. — [ADR-118](docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md)
51
+ - The publish workflow's version input may be `latest`, resolved before the guard runs, and the darwin release targets build on supported macOS 15 runners. — [ADR-117](docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md)
52
+ - The npm tarball excludes the decisions index, and the shipped surface is linted before publish.
53
+
54
+ ### Fixed
55
+
56
+ - The parser refuses a value a flag does not accept, a second value for a flag that is not repeatable, and the tolerated flags once the release that removes them ships.
57
+ - The tool no longer lets a repository-local `user.*` setting shadow the shared `git.config` identity.
58
+ - The MCP protocol validates the envelope and the arguments it advertised.
59
+ - A gate is bounded in time, and its output is read as a tail, so a hung gate cannot hang the hook.
60
+ - The runtime floor is checked before the CLI loads, so a Node that is too old fails before the tool does.
61
+ - `simt brief` names only what this tool can resolve.
62
+ - `simt packs`: a preview stays offline, a link is pinned or refused, and the positional argument wins over the flag.
63
+ - `simt bench`: a run cannot outlive its deadline, a failed run is a record, and the small bugs report what they measured.
64
+ - `simt ledger` names the tree when `.gitignore` ignores the state directory.
65
+ - The upgrade verdict and the exit code are one thing, so `ok` and the exit code cannot disagree.
66
+
67
+ ## [0.7.0] — 2026-10-31
68
+
69
+ ### Added
70
+
71
+ - `simt agent-hooks install --harness <id>` writes the policies into one harness instead of all of them; an unknown id is a usage error that names the valid ones. — [ADR-107](docs/decisions/ADR-107-an-install-can-name-one-harness-and-the-skipped-ones-are-named.md)
72
+ - `simt init --yes` builds the repository index as part of the adoption, so the first `simt map` or `simt brief` in a fresh repository answers from real files. — [ADR-108](docs/decisions/ADR-108-an-adoption-builds-the-index-and-a-command-refreshes-it-on-read.md)
73
+ - The rule text names the manifest as `simt.json`, the name it has had since the rename; four rule files still said `simt-dev.json`, which resolves in no repository.
74
+
75
+ ### Changed
76
+
77
+ - The projection lock is `simt.lock.json`, the name that follows the command and the manifest. — [ADR-110](docs/decisions/ADR-110-the-lock-file-follows-the-manifest-name-and-the-old-name-is-read-until-the-next-write.md)
78
+ - This repository is now a consumer of itself: `simt init` ran on its own source, so the two tests that asserted it was *not* a consumer are rewritten to assert the new state, and `AGENTS.md`'s "not self-adopted" section now says what is true — [ADR-109](docs/decisions/ADR-109-simt-dev-is-its-own-consumer-and-the-guards-that-kept-it-from-being-one-are-retired.md)
79
+
80
+ ## [0.6.3] — 2026-10-29
81
+
82
+ ### Added
83
+
84
+ - `simt explain <CODE>` names what a `check` finding means, the decision behind it, how to fix it, and a concrete trigger — one table row per finding code, so every code `check` can emit has an entry.
85
+ - `simt doctor --fix` applies only the remedies flagged safe (local, idempotent, journaled) and lists the rest; a fixture with three safe and two unsafe findings fixes exactly three.
86
+ - `simt status --line` prints the gate state from the last `check` in under 50 ms from cache — `simt PASS ✓rules ✓hooks 3/3gates` — for shell prompts, tmux and agent status lines.
87
+ - Every write records `{path, beforeDigest, afterDigest, beforeBytes}` in `.simt/journal/`, and `simt undo` restores the last set when every file in it is untouched since.
88
+ - `--diff` on every writer prints a unified diff of the plan next to the report, changing nothing about what the run writes.
89
+ - `simt completions <bash|zsh|fish>` prints a completion script generated from the command registry, so the three shells complete exactly the commands the binary dispatches.
90
+ - One ignore list (`.simtignore`) renders `.cursorignore`, `.aiderignore`, `.geminiignore` and Claude `permissions.deny`, and a zero-dependency staged-diff secret scan (vendor patterns plus Shannon entropy over added lines only) blocks a comm
91
+ - `simt slice start <id>` isolates the work in a linked worktree on branch `slice/<id>` with the brief preloaded and flips the tracker row In progress; `simt slice finish <id>` runs the declared gates, commits a Conventional subject from the
92
+ - `simt lease <paths> --session <id>` claims files until a TTL in `.simt/leases.json`, and the pre-edit hook denies an edit leased by another session (ADR-101). — [ADR-101](docs/decisions/ADR-101-a-file-lease-belongs-to-one-session-and-the-pre-edit-hook-refuses-another.md)
93
+ - `simt pr-body [--base <ref>]` assembles the pull request body from the evidence ledger, the decision records the diff touches, the gate state from the last check, and the residual risk in ADR-008 vocabulary. — [ADR-008](docs/decisions/ADR-008-verdict-vocabulary.md)
94
+
95
+ ## [0.6.2] — 2026-10-27
96
+
97
+ ### Fixed
98
+
99
+ - The v0.6.1 tag run failed its own tests step: two decision-corpus lists in `test/rules.test.mjs` were not moved with ADR-099 (the partial-supersession shapes and the leaking-paths count, both designed to move with the corpus). — [ADR-099](docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md)
100
+
101
+ ## [0.6.1] — 2026-10-27 (tagged, never published to npm)
102
+
103
+ ### Fixed
104
+
105
+ - The release automation, which the v0.6.0 tag proved broken in two places. — [ADR-099](docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md)
106
+
107
+ ## [0.6.0] — 2026-10-27
108
+
109
+ ### Added
110
+
111
+ - `simt plugin <claude|gemini|cursor> --out <dir>` generates one of the three harness packages from the same tables `agent-hooks install` writes — the hooks file, the MCP registration and, for cursor, the kernel rules — each carrying a self-c
112
+ - The MCP server answers `prompts/list` and `prompts/get` with two templates: `simt-brief` starts a task from the pre-assembled brief packet, and `simt-slice` implements one slice of the working plan (the next one whose dependencies are compl
113
+ - Two fixed resources join `simt://rules/{id}` and `simt://decisions/{adr}`: `simt://kernel` serves the collaborating region rendered in kernel mode for whatever repository the server runs in — the URI promises the kernel's bytes, whatever `m
114
+ - The tool descriptions in `tools/list` are cut from 2,783 bytes to 1,949, inside the 2 KB budget plan 0003 R41 sets for a cacheable tools list; the input and output schemas stay full, per ADR-068. — [ADR-068](docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md)
115
+ - `harness detect` reports the MCP registration files the loader table records — `.mcp.json` (Claude Code), `.codex/config.toml`, `.cursor/mcp.json`, `.agents/mcp_config.json`, `.gemini/settings.json`, `.vscode/mcp.json` — as `kind: 'mcp'` ro
116
+ - The loader table gains the Gemini CLI reader, whose configuration reference the table previously recorded as unavailable: it is live again (read 2026-10-26), so the row carries the GEMINI.md chain with `.git` boundary markers, the `context.
117
+ - Each release now carries a fourth artefact beside the tarball, the wheel and the formula: one single-file executable per target (`darwin-arm64`, `darwin-x64`, `linux-x64`), built from the same `files` set with a pinned Node runtime, publish
118
+ - `simt pack new <name> --source <npm:<package>|git+https://…>` scaffolds a versioned pack — `pack.json`, an unmeasured `bench.json`, one stack rule — and `simt pack lint [dir]` validates it and states its measured ΔR, rejecting a pack with n
119
+
120
+ ### Changed
121
+
122
+ - `harness detect`'s "some readers read AGENTS.md" rows no longer say bare "some" when the row knows which one: the `readsAgentsMdNote` travels to the text output, and `.gemini` graduates from unverified candidate to verified detection facts
123
+ - The one-line description the three channels publish (npm, PyPI and Homebrew) now names the goal plan `0003` is building toward — an intelligence amplifier for AI coding agents — instead of the adoption-only story it grew out of.
124
+ - The per-repository state directory is renamed from `.simt-dev/` to `.simt/`: the index, ledger, lessons, bench artifacts, local-model proposals (`distilled/`, `reviews/`) and repo-local profiles all live under `.simt/` now.
125
+ - The skill registry leaves the published set again, as ADR-061 ruled when it first left in 0.2.1. — [ADR-061](docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md)
126
+ - The entry point file is renamed from `bin/simt-dev.mjs` to `bin/simt.mjs`, matching the command it installs: the command has been `simt` for a long time, the package is still `simt-dev`, and the file path was the last place that carried the
127
+ - The hook shim's remedy and the generated CI workflow now install the release binary for a repository without npm, instead of the pinned global npm install (`npm i -g`) that needed the npm that repository kind is defined by not having.
128
+ - The locator resolves `.simt/bin/simt` between `node_modules` and `PATH`, so the bytes a repository downloaded are the bytes its gate runs and a machine-wide install cannot shadow them.
129
+ - Homebrew's formula downloads the release binaries rather than the npm tarball — one `url`/`sha256` pair per target, chosen at install time — and no longer declares `depends_on "node"`. — [ADR-098](docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md)
130
+
131
+ ## [0.5.0] — 2026-10-25
132
+
133
+ - **An offline distiller that proposes, never projects** — `simt distill <skill|doc>` writes a budgeted summary of a skill body or repository document with citations to source line ranges (`[L12-L15]`). — [ADR-090](docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md)
134
+
135
+ - **An advisory critic over the staged diff** — `simt review` gathers the brief — the governing decision records and scoped rules for the staged files — with no model and no network. — [ADR-008](docs/decisions/ADR-008-verdict-vocabulary.md)
136
+
137
+ - **Model and effort advice in the brief header** — `simt brief` now carries an `ADVICE` header, such as `small model, no plan mode` or `frontier model, plan first`, derived from the estate's own bench history: the brief's task kind and estimated file size pick a neighbourhood of similar ben
138
+
139
+ ### Fixed
140
+
141
+ - `package.json` gained the `repository` field npm's provenance verification requires: the sigstore bundle is checked against the public source repository, and the missing URL rejected the 0.4.0 upload with `E422`.
142
+
143
+ ## [0.4.0] — 2026-10-20
144
+
145
+ - **Hybrid retrieval fuses BM25, the code graph, and the resolver** — `simt index` indexes full-text tokens across `code`, `docs`, `skills`, `decisions` and `lessons` into the SQLite FTS5 `fts` table (with an Okapi BM25 fallback when the index is JSON-lines). — [ADR-091](docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md)
146
+
147
+ - **A local model adapter that opens zero sockets until named** — `simt local doctor` probes the OpenAI-compatible `local.chat` and `local.embed` endpoints declared in `simt.json` (`/v1/models`, `/v1/chat/completions`, `/v1/embeddings` for Ollama, `llama-server`, LM Studio and MLX servers) and reports rea — [ADR-075](docs/decisions/ADR-075-nothing-leaves-the-machine.md), [ADR-090](docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md)
148
+
149
+ - **Estate learning and ADR drafts across a workspace** — `simt compare --learn` aggregates benchmark uplift (`ΔR`, `ΔC`) per rule section across adopted sibling repositories, promotes lessons repeated across at least two repositories as shared candidates, and flags gates that fail more than 20% o
150
+
151
+ - **Rule text variants have to win on the bench** — A rule may declare candidate wordings under `simt-variants:` in its frontmatter (or supply them with `--variants-file`).
152
+
153
+ - **Decision records carry structured supersession frontmatter** — `simt decide "<title>"` scaffolds the next numbered ADR in `docs/decisions/` with structured frontmatter (`Status`, `Date`, `Supersedes`, `Superseded-by`, `Affects`) and updates the records it supersedes when `--supersedes` and `--yes` are
154
+
155
+ - **Lessons are captured from failure-to-fix pairs, recalled on match, and expire** — When a failing gate or test run in `.simt-dev/ledger.jsonl` is followed by a passing run on the same package, `simt lessons` records a deterministic candidate in `.simt-dev/lessons-candidates.jsonl`.
156
+
157
+ - **Skills compile to the Agent Skills standard and report their triggers** — `simt skills compile` validates and compiles skill sources against the Agent Skills standard (frontmatter `name` and `description`, description under 1024 characters, `SKILL.md` body at most 500 lines, and on-demand `references/` and `scrip
158
+
159
+ - **A task brief fits in the bytes a prompt can carry** — `simt brief "<task>"` assembles what a task needs into one packet: the kind of the task and the commands that kind needs, the files the map ranks highest, the tests the index knows for them, the decisions that govern them, the skills the re
160
+
161
+ - **The packet arrives without being asked for** — A repository that declares a `brief` key in its manifest gets the packet injected as context before every prompt: `simt agent-hooks install` writes a `UserPromptSubmit` hook into Claude Code's and Codex's own config, and `simt agent-hook pr
162
+
163
+ - **A brief can cite a code graph it did not build** — A repository may declare a `federation` block in `simt.json` naming external code-graph servers, each with the command that starts it and, optionally, the MCP tool to ask, the argument the question goes in, the languages it covers and the t
164
+
165
+ ## [0.3.1] — 2026-10-18
166
+
167
+ - **Who a change reaches** — `simt impact` takes a tracked path or the name of one export. — [ADR-096](docs/decisions/ADR-096-impact-names-who-a-change-reaches.md)
168
+
169
+ - **A gate report keeps the failures and counts the passes** — `simt gate` compacts a report it knows how to read: TAP, JUnit XML, pytest's junit file, vitest or jest JSON, and `go test -json`. — [ADR-095](docs/decisions/ADR-095-gate-output-keeps-the-failures.md)
170
+
171
+ - **A change runs the tests that import it** — `simt gate` selects the test files that import a changed file, directly or through other files, and runs only those with the package's own runner. — [ADR-094](docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md)
172
+
173
+ - **what governs a file is the decision, rule, skill, gate or lesson that names it** — `simt why` reads an Affects line as the tokens in backticks, including a line the paragraph wraps onto. — [ADR-017](docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md), [ADR-093](docs/decisions/ADR-093-why-names-what-governs-a-file.md)
174
+
175
+ - **The tests of a file are its importers, its conventional neighbour, and its coverage** — `simt tests` lists the tests that exercise a file. — [ADR-092](docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md)
176
+
177
+ - **The map ranks the files a task is likely to touch** — `simt map` orders the index by the task's words and by the import and call edges around them. — [ADR-091](docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md)
178
+
179
+ - **The index names the exports and the imports** — `simt index` fills symbols and import edges from the blob it already hashes. — [ADR-090](docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md)
180
+
181
+ - **The local index is a cache of git blobs** — `simt index` rebuilds `.simt-dev/index.sqlite` from `git ls-files`. — [ADR-089](docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md)
182
+
183
+ - **A marked line is enforced by a checker** — A rule line may name a checker with `simt-check`. — [ADR-088](docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md)
184
+
185
+ - **A run is evidence for one tree** — `simt evidence` prints the runs recorded against the tree on disk. — [ADR-087](docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md)
186
+
187
+ - **A workspace carries its repeated rules once** — `simt shared plan` names the rules every repository in a workspace renders with the same bytes, and where each harness would load that copy. — [ADR-084](docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md)
188
+
189
+ - **The region ends with the names of what it kept out** — The generated region ends with a `## Disclosure` section: one line per scoped profile, with the patterns and the files it moved to, and one line per installed skill, with its name and the description that says when to open it. — [ADR-085](docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md)
190
+
191
+ - **The stable prefix comes first** — Shipped rules lead the region, and the command card follows them, so an edit this repository makes changes only the tail. — [ADR-086](docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md)
192
+
193
+ - **Kernel mode packs to the budget the repository declared** — `mode: kernel` reads `budget.bytes`, holds back a reserve for the files that load beside the region, and drops rules least-valuable-first until the region fits. — [ADR-083](docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md)
194
+
195
+ - **Vulnerability reports** — `SECURITY.md` names the two places a report goes: a GitHub issue on this repository, or `security@simt.space`.
196
+
197
+ ## [0.3.0] — 2026-10-17
198
+
199
+ - **The rules and the decisions are readable as MCP resources** — A client that wants to browse this tool's rules and rulings had no way to: every answer came back from a tool call with an argument in it. — [ADR-074](docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md)
200
+
201
+ - **A plan is resumed one slice at a time** — `simt plan next` returns the next ready slice and only its section. — [ADR-081](docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md), [ADR-082](docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md)
202
+
203
+ - **The rules are enforced at the tool call** — Three rules that text does not hold — a `git push`, a `--no-verify`, an edit inside a generated region — are now a decision before the tool call. — [ADR-079](docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md)
204
+
205
+ - **A line the repository already proves does not ship** — A rule line may say when the repository already proves it. — [ADR-078](docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md)
206
+
207
+ - **The region leads with this repository's commands** — The projected region opens with the commands this repository actually runs, derived from its committed gates and runner, in both the full projection and kernel mode (ADR-077). — [ADR-077](docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md)
208
+
209
+ - **A change to what an agent reads can be measured** — `simt bench mine`, `run`, `report`, `ablate` and `probes` measure a change to projected context against tasks taken from this repository's own history. — [ADR-076](docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md)
210
+
211
+ - **What each reader loads, and a transcript split** — `simt harness loaders` reports what each reader loads at session start, in bytes, and what its size cap drops.
212
+
213
+ - **A name this tool owns is not reported as a repository** — `simt rules why` keeps this tool's own names (`simt-priority`, `simt-hooks`, and the rest) and still redacts a repository the reader cannot open (ADR-080). — [ADR-080](docs/decisions/ADR-080-the-tools-own-names-are-not-repositories-and-neither-reader-decides-by-shape.md)
214
+
215
+ ## [0.2.2] — 2026-10-14
216
+
217
+ - **A repository can ask for a smaller projection** — `simt tokens` measured the cost and `check` now holds the line the repository draws: `budget.bytes` in `simt.json` is how many always-on bytes that repository has agreed to carry, and both the meter and the gate report the overflow with the — [ADR-073](docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md)
218
+
219
+ - **A repository can declare how many always-on bytes it is willing to carry** — `simt tokens` has reported that number since the meter landed, against a constant nobody could argue with. — [ADR-072](docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md)
220
+
221
+ - **A repository can declare the always-on bytes it intends to carry** — `simt tokens` measured the number; it could not be held to one. — [ADR-072](docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md)
222
+
223
+ - **A stack profile loads only when a matching file is in play** — A stack profile used to be always-on everywhere, because profiles reached a reader through the generated region in AGENTS.md and through nothing else. — [ADR-071](docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md)
224
+
225
+ - **Every `--json` payload says which version it is** — An agent that parses `--json` had no way to notice that a field had moved: the parse succeeds, the lookup returns `undefined`, and the answer is quietly wrong. — [ADR-070](docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md)
226
+
227
+ - **`graph lint` now checks skills against the published specification** — The Agent Skills specification sets limits nobody here was checking: a name of lowercase letters, digits and single hyphens that equals the directory it lives in; a description under 1,024 characters; a compatibility note under 500; a body
228
+
229
+ - **The MCP surface speaks three protocol revisions, and answers in the shape each asks for** — The server was pinned to one revision and returned pretty JSON in a text block, so a client could read the answer but could not validate it, could not cache it, and could not tell a read-only tool from one that writes.
230
+
231
+ - **Which harnesses a repository is set up for is now answerable** — `simt-dev harness detect` looks at the configuration directories that exist and says which harnesses this repository — and, with `--user`, its reader — is set up for.
232
+
233
+ - **A monorepo gets rules for each of its packages** — One repository, one projection: every package under the root was given the root's rules, so a React application inside a node workspace was handed the node profile and nothing else, and the profile that should have applied to it was applied
234
+
235
+ - **One rule set, shared by the repositories that agreed on it** — Several repositories want the same rules and each kept its own copy, so a policy change was several edits that could be several-minus-one, and the repository that missed it carried instructions nobody there wrote. — [ADR-065](docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md)
236
+
237
+ - **`simt tokens` counts what a reader loads** — Review 0002 filed the estate's always-on context at 90 KB per turn, 72% of it a paragraph an earlier repository had already loaded — a number produced by reading seven repositories by hand, which ages the moment a rule is edited and cannot — [ADR-064](docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md)
238
+
239
+ ## [0.2.1] — 2026-10-13
240
+
241
+ - **`init` writes in place; the backup tag and adopt branch are opt-in** — `simt init --yes` used to always tag the pre-adoption commit and branch onto a dedicated adopt branch before writing. — [ADR-063](docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md)
242
+
243
+ - **A fresh adoption seeds the gates it can run — and only those** — The eight common ecosystems outside the JavaScript world — Rust, Go, .NET, Swift, Deno, Ruby, Dart and Elixir — were recognised by the fingerprint and served by nothing: no profile selected them, no gate was proposed for them. — [ADR-062](docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md)
244
+
245
+ - **The resolver is measured against a gold corpus** — `simt skills eval` scores the skill resolver against a corpus of real tasks × real repositories, each case carrying a gold list of the skills it should select and a list of the ones it must not.
246
+
247
+ - **The skill registry is workspace data; the package ships none of it** — The npm tarball and the wheel carried `graph/skills.graph.json` — the directory of skill sources for one workspace, naming the repositories whose bodies it resolves. — [ADR-061](docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md)
248
+
249
+ - **No published file may name a repository from this estate** — The decision records ship in all three channels — npm, the wheel and the sdist — so a private repository name written into one is published to three registries.
250
+
251
+ - **Four shipped strings named a command this package does not install** — `0.2.0` installs one binary, `simt`, and `package.json`'s `bin` map says so.
252
+
253
+ ### Fixed
254
+
255
+ - `hooks install` removes a shim whose gate was dropped from the manifest instead of leaving it to run nothing. A repository that removed its last gate was refused outright, with a remedy telling it to put the gate back; only un-routing git was left to the reader. install also no longer chains a hook to itself.
256
+ - **Dead exports and duplicated frontmatter, with a test that stops them returning (S21).**
257
+ Eight functions were exported and called by nothing (`gateKind`, `gateWhy`, `gateAdr`,
258
+ `resetWorkspace`, `tracksIdentity`, `isTty`, `surfaceFrontmatter`, `workspaceOrNull`),
259
+ three `__internals` testing seams had no importer, and thirteen more bindings were
260
+ exported while being used only inside their own file — `isExecutable` among them, which
261
+ a first pass through this list wrongly recorded as dead and which its own callers
262
+ proved otherwise. `KNOWN_SUBS` was a hand-kept second copy of the dispatch table, and
263
+ had already drifted: it carried `doctor`, a bare command the group lookup can never
264
+ reach. `mdcFrontmatter` was a second construction of frontmatter the writer now derives
265
+ itself, with a test asserting the copy rather than the behaviour.
266
+ - **"Did you mean" offered the shortest fragment first, and a misspelt skill was
267
+ suggested for a correctly spelled one (S22).** `nearMatches` had no test at all.
268
+ Both directions of substring scored 0 — the same score as an exact match — so the
269
+ alphabetical tiebreak decided the order, and `skills graphs` suggested `graph`
270
+ before `graphs`. Worse, the containment test had no length floor, so `test` matched
271
+ the candidate `e` and the message read `did you mean e, test-writer?`, which an
272
+ agent has every reason to install. A prefix now scores 1 rather than 0, a fragment
273
+ counts only when it is at least half the query, and the edit bound scales with the
274
+ query's length — three edits is a typo in `slice-commmit` and is most of a
275
+ four-character query.
276
+ - **The conflict scanner skipped two of the five rule surfaces, and one pointer file
277
+ (S22).** `rulePaths` enumerated filenames by hand, so `.claude/rules/` and
278
+ `.agents/rules/` — added to the surface table after the list was written — were
279
+ never scanned, and a hand-written rule contradicting a generated one there was
280
+ invisible. A conflict detector that only looks where it was pointed looks nowhere
281
+ new. The scan list is now derived from the surface table and the pointer table.
282
+
283
+ ## [0.2.0] — 2026-10-11
284
+
285
+ - **Publishable from PyPI and Homebrew as well as npm** — simt-dev is a *repository* tool, and the people who adopt a repository are not all Node developers. — [ADR-058](docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md)
286
+
287
+ ## [0.1.1] — 2026-10-11
288
+
289
+ - **A foreign hook on an event this repo does not gate is chained** — `0.1.0` chained the wrong set of hooks and is worth replacing rather than recommending. — [ADR-018](docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md)
290
+
291
+ ## [0.1.0] — 2026-10-11
292
+
293
+ - **The command is `simt`** — The package is `simt-dev` and the command is `simt`.
294
+
295
+ - **The manifest is `simt.json`** — The manifest was called `simt-dev.json`; it is now `simt.json`. — [ADR-056](docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md)
296
+
297
+ - **The region markers are `simt:`** — The generated region was stamped `<!-- simt-dev:begin -->` / `<!-- simt-dev:end -->` — and so was the provenance header inside it; every one of those lines is now `simt:`. — [ADR-056](docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md)
298
+
299
+ - **A hook you already had keeps running** — `hooks install` points `core.hooksPath` at `.simt-hooks/`, and git reads **every** hook from that one directory — not just the two events this tool gates. — [ADR-018](docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md)
300
+
301
+ - **What a first release has to say out loud** — These are the behaviours a reader is most likely to trip over. — [ADR-010](docs/decisions/ADR-010-runner-invocation.md), [ADR-012](docs/decisions/ADR-012-drop-windows-support.md), [ADR-017](docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md), [ADR-018](docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md), [ADR-021](docs/decisions/ADR-021-one-surface-per-repo.md), [ADR-035](docs/decisions/ADR-035-one-write-decision-and-one-json-document.md), [ADR-036](docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md), [ADR-046](docs/decisions/ADR-046-one-rule-one-copy.md)
302
+
303
+ - **Packaging** — - Licence set to Apache-2.0; the `LICENSE` file is the canonical, unmodified text.
304
+
305
+ - **Notes for anyone upgrading a hook** — A shim installed by an earlier version looks for `SIMT_DEV_BIN`, then for `node_modules/simt-dev/bin/simt-dev.mjs`, then for a program named `simt` on `PATH`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: simt-dev
3
- Version: 0.6.3
3
+ Version: 0.7.1
4
4
  Summary: An intelligence amplifier for AI coding agents: rules and dual gates adopted by one command, plus local retrieval, task briefs, benches and repo memory — deterministic by default, with local-model adapters that propose and never select.
5
5
  Project-URL: Homepage, https://github.com/QuazarMedia/simt-dev
6
6
  Project-URL: Repository, https://github.com/QuazarMedia/simt-dev
@@ -30,7 +30,9 @@ Description-Content-Type: text/markdown
30
30
 
31
31
  # simt-dev
32
32
 
33
- ![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)
33
+ ![simt-dev, the intelligence amplifier for coding agents, and its four claims. One: say less, always — a kernel under 2 KB whose bytes stay stable so the prompt cache survives. Two: answers over exploration — a local code graph and a short task brief. Three: enforce, don't instruct — dual gates, before a tool call and at git time. Four: close the loop — benches and memory. Beneath them, the harnesses it works across and its three channels.](https://raw.githubusercontent.com/QuazarMedia/simt-dev/main/res/hero.jpg)
34
+
35
+ [![simt-dev own gate](https://github.com/QuazarMedia/simt-dev/actions/workflows/simt-dev-check.yml/badge.svg)](https://github.com/QuazarMedia/simt-dev/actions/workflows/simt-dev-check.yml)
34
36
 
35
37
  `simt` adopts a repository for the agents that work in it, and builds an intelligence
36
38
  amplifier around them: a brief that answers before the agent explores, gates that
@@ -102,13 +104,20 @@ beside its `.sha256`. Pin the release you download,
102
104
  and run this from the repository's top level:
103
105
 
104
106
  ```sh
105
- 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
107
+ version=<version>; os=$(uname -s | tr A-Z a-z); arch=$(uname -m | sed "s/x86_64/x64/")
108
+ base="https://github.com/QuazarMedia/simt-dev/releases/download/v$version"
109
+ asset="simt-dev-$version-$os-$arch"; tmp=$(mktemp -d)
110
+ curl -fsSL "$base/$asset" -o "$tmp/$asset"
111
+ curl -fsSL "$base/$asset.sha256" -o "$tmp/$asset.sha256"
112
+ (cd "$tmp" && shasum -a 256 -c "$asset.sha256")
113
+ mkdir -p .simt/bin && mv "$tmp/$asset" .simt/bin/simt && chmod +x .simt/bin/simt
106
114
  ```
107
115
 
108
116
  The locator checks `.simt/bin/simt` before `PATH`, so the repository's own copy is the
109
117
  one its hooks and its CI run — this is the same command the hook shim prints as its
110
- remedy. The generated CI workflow downloads the same asset and verifies it against the
111
- published `.sha256` before running anything.
118
+ remedy. Both the snippet above and the generated CI workflow verify the asset against the
119
+ published `.sha256` before it runs: a digest that does not match stops the copy, so a
120
+ truncated or substituted download never becomes the command.
112
121
 
113
122
  ## What `simt` does
114
123
 
@@ -182,7 +191,7 @@ simt bench run --yes # evaluate arms (bare, current, kernel, brie
182
191
  simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstrap CIs, McNemar/Wilcoxon
183
192
  simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
184
193
  simt bench probes --yes # 12 deterministic rule-compliance probes
185
- simt bench variants --yes # evaluate simt-variants slots and lock winners in simt-dev.lock.json
194
+ simt bench variants --yes # evaluate simt-variants slots and lock winners in simt.lock.json
186
195
  simt review [--local] # an advisory ADR-008 verdict skeleton over the staged diff
187
196
  simt distill <skill|doc> # a budgeted proposal summary with line citations, for a person to merge
188
197
  simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
@@ -215,134 +224,11 @@ line warns past 400 lines and fails past 1000. `simt evidence check` warns when
215
224
  message claims a passing run this tree does not have, and the commit fails when
216
225
  `gates.evidence` is `block`. Every finding `check` can emit is explained by `simt explain <CODE>` (DRIFT, UNMANAGED, PACK-DIGEST-MISMATCH, ...).
217
226
 
218
- ## Agent playbook: how and when to use each module
219
-
220
- An agent working in an adopted repository should use `simt` as its primary orientation,
221
- retrieval, validation and memory layer rather than scanning the tree by hand. Every
222
- read-only command supports `--json` (and `--max-bytes <n>`) or can be called over stdio
223
- through `simt mcp`.
224
-
225
- ### Decision tree: which command to run when
226
-
227
- | Situation | First command | If you need more |
228
- | --- | --- | --- |
229
- | New task, no context yet | `simt brief "<task>"` | `simt map --task "<task>"` for broader file ranking |
230
- | About to edit a file | `simt why <file>` | `simt impact <file>` for blast radius |
231
- | Need to know what tests to run | `simt tests <file>` | `simt gate --changed` to run them |
232
- | Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
233
- | Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
234
- | Before committing | `simt check` | `simt evidence` to verify test claims |
235
- | Opening a pull request | `simt pr-body` | `--base <ref>` to diff against another fork point |
236
- | Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
237
- | Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
238
- | Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
239
-
240
- ### 1. Start of task — orient in one call instead of broad exploration
241
-
242
- 1. **Assemble the task packet first.** Run `simt brief "<task>"` (or call MCP `brief`, or
243
- read the packet injected automatically when `agent-hooks install --yes` wired
244
- `prompt-submit`). Within `--budget 2048` bytes (pass `--budget 0` for unlimited or
245
- `--explain` to see why items were kept or cut), the packet gives:
246
- - `TASK`: the classified task kind (`bugfix`, `feature`, `refactor`, `test`, `docs`,
247
- `config`) and the evidence behind it.
248
- - `COMMANDS`: the exact `build`, `test`, `lint`, `format`, `typecheck`, and focused
249
- test templates for this repository.
250
- - `LIKELY FILES`: top files ranked by reciprocal-rank fusion (`RRF_K = 40`) across
251
- SQLite FTS5 `bm25()`, PageRank graph proximity, and resolver signals.
252
- - `TESTS`: the test files mapped to those likely files.
253
- - `DECISIONS`, `SKILLS`, `LESSONS`, `CAUTIONS`, and `FEDERATION`: governing ADRs,
254
- matched skills, promoted lessons for those paths, active worktree/hook cautions, and
255
- any structural answer from a declared external code-graph server.
256
- 2. **Pull the next tracker slice when working from a plan.** Instead of reading a multi-thousand-line
257
- plan in `docs/plans/` or `docs/reviews/`, run `simt plan next` (or MCP `plan_next`) to
258
- load only the next queued slice (~1 KB) whose dependencies are already `Complete` or
259
- `Accepted`.
260
-
261
- **When to use `--json` format.** When piping output to other tools or when the agent needs
262
- structured data, add `--json` to any read-only command. For example, `simt brief "<task>" --json`
263
- returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `skills`,
264
- `lessons`, `cautions`, and `federation` fields that can be programmatically consumed.
265
-
266
- ### 2. Before editing — query the graph, blast radius, and governance
267
-
268
- 1. **Rank files or symbols at the right granularity.** When `brief`'s file list is too
269
- narrow or the task evolves, run `simt map --task "<task>" --level outline` for paths,
270
- `--level names` for exported symbols, or `--level signatures` for declaration lines.
271
- Pass `--embed` when `local.embed` is configured in `simt.json` and clears the +10-point
272
- recall@10 bar.
273
- 2. **Check blast radius before changing a shared file or export.** Run
274
- `simt impact <file|symbol>` to see every direct and transitive importer, the tests
275
- covering them, the governing rules and ADRs, and any sibling repository in the
276
- workspace that imports that symbol.
277
- 3. **Read the governance on a path before changing its behaviour.** Run `simt why <path>`
278
- to list every ADR whose `simt-affects` matches the file, every scoped rule, skill,
279
- gate, and promoted lesson. Run `simt why` with no path to audit the repository for
280
- `UNRESOLVED-AFFECTS` tokens.
281
- 4. **Resolve deferred rules and citations on demand.** When `simt.json` sets
282
- `"mode": "kernel"`, only `hard` and `command` rules are loaded at session start;
283
- `convention` and `style` rules are listed by ID at the foot of the projection. Fetch a
284
- deferred rule with `simt rules show <id>`, and read any cited `ADR-NNN` with
285
- `simt rules why ADR-NNN` (or MCP `rules_why`) to see its rulings and whether any ruling
286
- was superseded or narrowed.
287
- 5. **Load skills progressively (Tier 0 → Tier 1 → Tier 2).** Never read every skill file
288
- upfront:
289
- - Tier 0: `simt skills index` (or MCP `skills_index`) lists one line per skill.
290
- - Tier 1: `simt skills brief --task "<task>"` (or MCP `skills_brief`) ranks compatible
291
- skills within budget (`--plan` emits a fetch plan without bodies).
292
- - Tier 2: `simt skills show <name> --max-bytes 8192` (or MCP `skills_show`) loads only
293
- the chosen skill's body.
294
-
295
- **Optimal retrieval strategy.** For best performance, use this sequence:
296
- 1. `simt brief "<task>"` — gets the most relevant files and tests in one call
297
- 2. If more files are needed, `simt map --task "<task>" --level outline` — broader ranking
298
- 3. If you need to understand a specific file's impact, `simt impact <file>` — blast radius
299
- 4. If you need to understand governance, `simt why <file>` — ADRs and rules
300
-
301
- ### 3. During implementation — validate incrementally under dual gates
302
-
303
- 1. **Keep the local index current.** After adding, renaming, or changing exports/imports,
304
- run `simt index`. It hashes tracked blobs via `git ls-files --stage` and re-extracts
305
- only changed files in under 300 ms.
306
- 2. **Run only the tests your change reaches.** Use `simt tests <path>` to inspect which
307
- tests cover a file (via import edges, naming conventions, or coverage records; add
308
- `--cochange` to include historical co-change pairs). Run `simt gate --changed` (or
309
- `simt gate <path...>`) to execute only the tests reachable from the diff, with gate
310
- output compacted so every failure line survives while passing noise is trimmed.
311
- 3. **Respect agent-time hooks and learn from failures.** With `simt agent-hooks install --yes`,
312
- `pre-tool-use` blocks unapproved `git push`, history rewrites (`--no-verify`,
313
- `--amend`, `reset --hard`, `rebase`), and direct edits to generated regions before the
314
- tool executes. When a test or gate fails, `post-tool-use` hashes the normalised first
315
- error line against `docs/lessons/*.md` and injects the matching lesson into context.
316
-
317
- **Incremental validation workflow.** After each meaningful code change:
318
- 1. Run `simt tests <changed-file>` to see which tests cover your changes
319
- 2. Run `simt gate --changed` to execute only the affected tests
320
- 3. If a test fails, check `simt lessons list` for known issues and their remedies
321
- 4. If the failure is new, fix it and consider promoting the lesson with `simt lessons review <id> --yes`
322
-
323
- ### 4. Before committing and closing a slice — verify drift, evidence, and memory
324
-
325
- 1. **Run the repository gate.** Run `simt check` (or MCP `check`). Fix any reported
326
- `DRIFT` with `simt sync --yes`, and resolve any rule checker or manifest findings.
327
- 2. **Verify execution evidence matches the current tree.** Run `simt evidence` to confirm
328
- that the tests and gates you plan to cite were recorded against the current
329
- `git write-tree` digest in `.simt/ledger.jsonl`. Any file edit invalidates earlier
330
- evidence.
331
- 3. **Record decisions, lessons, and tracker state:**
332
- - If the change alters what the repository or tool believes, scaffold an ADR with
333
- `simt decide "<title>" [--supersedes ADR-NNN[:<ruling>]] --yes`.
334
- - If a failing gate or test was fixed during the session, inspect captured candidates
335
- with `simt lessons list` and promote reusable ones with
336
- `simt lessons review <id> --yes`.
337
- - After committing locally (never push without explicit approval per `ADR-001`), close
338
- the tracker slice with `simt plan done <id> <sha> --test "<cmd>" --yes`.
339
-
340
- **Pre-commit checklist.** Before committing, run this sequence:
341
- 1. `simt check` — verify no drift and all rules pass
342
- 2. `simt evidence` — confirm test runs are recorded against current tree
343
- 3. `simt lessons list` — check for any unreviewed lesson candidates
344
- 4. `git commit` — commit locally (never push without explicit approval)
345
- 5. `simt plan done <id> <sha> --yes` — close the tracker slice if working from a plan
227
+ ## Agent playbook
228
+
229
+ The full agent playbook — the decision tree for which command to run when, and the
230
+ workflow for orienting, editing, implementing and closing a slice — lives in
231
+ [PLAYBOOK.md](PLAYBOOK.md).
346
232
 
347
233
  ## Optimal setup for every project, repository, and workspace shape
348
234
 
@@ -399,10 +285,10 @@ history. All remain off until named and propose rather than write projected text
399
285
  | --- | --- |
400
286
  | `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 |
401
287
  | `simt.json` | the manifest: `gates`, `substitutions`, `budget`, `mode`, `shared`, `surfaces`, `plans`, `packs`, `federation`, `local` |
402
- | `simt-dev.lock.json` | the digest of the inputs, the digest of the projection, and locked `variants` winners from `simt bench variants` |
288
+ | `simt.lock.json` | the digest of the inputs, the digest of the projection, and locked `variants` winners from `simt bench variants`. The old `simt-dev.lock.json` is still read, and a lock migrates on its next write |
403
289
  | `.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 |
404
290
  | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
405
- | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
291
+ | `.simt/hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
406
292
  | `docs/decisions/ADR-NNN-<slug>.md` | numbered decision records scaffolded by `simt decide --yes` with `simt-affects` and `simt-supersedes` frontmatter |
407
293
  | `docs/lessons/NNNN-<slug>.md` | reviewed lessons promoted by `simt lessons review <id> --yes` with `simt-trigger`, `simt-evidence`, and `simt-expires` frontmatter |
408
294