simt-dev 0.4.0__tar.gz → 0.6.0__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 (276) hide show
  1. simt_dev-0.6.0/.gitignore +22 -0
  2. {simt_dev-0.4.0 → simt_dev-0.6.0}/CHANGELOG.md +170 -0
  3. simt_dev-0.6.0/PKG-INFO +432 -0
  4. simt_dev-0.6.0/README.md +402 -0
  5. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +13 -0
  6. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +1 -1
  7. simt_dev-0.6.0/docs/decisions/ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md +71 -0
  8. simt_dev-0.6.0/docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md +149 -0
  9. {simt_dev-0.4.0 → simt_dev-0.6.0}/package.json +8 -4
  10. {simt_dev-0.4.0 → simt_dev-0.6.0}/pyproject.toml +1 -1
  11. {simt_dev-0.4.0 → simt_dev-0.6.0}/python/simt_dev/cli.py +2 -2
  12. simt_dev-0.6.0/src/advice/advice.mjs +229 -0
  13. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/agenthooks/render.mjs +87 -21
  14. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/argv.mjs +25 -0
  15. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/ablate.mjs +1 -3
  16. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/grade.mjs +1 -1
  17. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/mine.mjs +3 -3
  18. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/probes.mjs +1 -3
  19. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/report.mjs +1 -3
  20. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/run.mjs +4 -18
  21. simt_dev-0.6.0/src/bench/tasks.mjs +36 -0
  22. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/variants.mjs +1 -3
  23. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/brief/assemble.mjs +24 -4
  24. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/brief/packet.mjs +4 -1
  25. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/ci/dependabot.mjs +1 -1
  26. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/ci/workflow.mjs +40 -12
  27. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/agenthook.mjs +6 -2
  28. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/bench.mjs +35 -3
  29. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/ci.mjs +1 -1
  30. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/compare.mjs +1 -1
  31. simt_dev-0.6.0/src/commands/distill.mjs +36 -0
  32. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/gate.mjs +2 -2
  33. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/graph.mjs +2 -2
  34. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/harness.mjs +87 -14
  35. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/help.mjs +54 -4
  36. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/hooks.mjs +1 -1
  37. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/index.mjs +29 -3
  38. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/init.mjs +2 -2
  39. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/local.mjs +11 -0
  40. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/mcp.mjs +1 -1
  41. simt_dev-0.6.0/src/commands/pack.mjs +246 -0
  42. simt_dev-0.6.0/src/commands/plugin.mjs +61 -0
  43. simt_dev-0.6.0/src/commands/review.mjs +65 -0
  44. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/rules.mjs +1 -1
  45. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/skills.mjs +3 -34
  46. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/skillscompile.mjs +1 -3
  47. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/skillsinstall.mjs +1 -1
  48. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/sync.mjs +8 -8
  49. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/tokens.mjs +1 -1
  50. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/upgrade.mjs +1 -1
  51. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/why.mjs +6 -3
  52. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/compare/discover.mjs +1 -1
  53. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/compare/hooksstate.mjs +19 -7
  54. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/compare/learn.mjs +2 -2
  55. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/compare/row.mjs +3 -3
  56. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/decisions/index.mjs +1 -1
  57. simt_dev-0.6.0/src/distill/distill.mjs +246 -0
  58. simt_dev-0.6.0/src/distill/engine.mjs +187 -0
  59. simt_dev-0.6.0/src/distribute/release.mjs +142 -0
  60. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/graph/load.mjs +9 -8
  61. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/dispatcher.mjs +3 -2
  62. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/shim.mjs +11 -6
  63. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/govern.mjs +1 -1
  64. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/map.mjs +1 -1
  65. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/persist.mjs +2 -2
  66. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/store.mjs +50 -20
  67. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/ledger/index.mjs +2 -2
  68. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/local/client.mjs +22 -8
  69. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/local/config.mjs +52 -0
  70. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/locate.mjs +22 -1
  71. simt_dev-0.6.0/src/mcp/prompts.mjs +118 -0
  72. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/mcp/resources.mjs +96 -22
  73. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/mcp/server.mjs +33 -6
  74. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/mcp/tools.mjs +12 -12
  75. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/measure/session.mjs +1 -1
  76. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/memory/decide.mjs +1 -1
  77. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/memory/lessons.mjs +14 -14
  78. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/name.mjs +11 -1
  79. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/package-version.mjs +12 -10
  80. simt_dev-0.6.0/src/packs/manage.mjs +563 -0
  81. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/packs.mjs +15 -5
  82. simt_dev-0.6.0/src/plugins.mjs +164 -0
  83. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/loaders.mjs +84 -10
  84. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/manifest.mjs +4 -4
  85. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/project.mjs +3 -3
  86. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/rules.mjs +24 -4
  87. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/surfaces.mjs +20 -2
  88. simt_dev-0.6.0/src/resolve/body.mjs +46 -0
  89. simt_dev-0.6.0/src/review/critic.mjs +509 -0
  90. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/toolwords.mjs +8 -5
  91. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/tsconfig.mjs +3 -3
  92. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/upgrade/plan.mjs +1 -1
  93. simt_dev-0.4.0/.gitignore +0 -18
  94. simt_dev-0.4.0/PKG-INFO +0 -214
  95. simt_dev-0.4.0/README.md +0 -184
  96. {simt_dev-0.4.0 → simt_dev-0.6.0}/LICENSE +0 -0
  97. /simt_dev-0.4.0/bin/simt-dev.mjs → /simt_dev-0.6.0/bin/simt.mjs +0 -0
  98. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-001-push-requires-approval.md +0 -0
  99. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-002-refactor-blast-radius.md +0 -0
  100. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-003-test-breadth.md +0 -0
  101. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-004-hook-owns-format.md +0 -0
  102. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-005-file-length.md +0 -0
  103. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-006-coverage-bar.md +0 -0
  104. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-007-section-skeleton.md +0 -0
  105. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-008-verdict-vocabulary.md +0 -0
  106. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-009-skill-layout.md +0 -0
  107. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-010-runner-invocation.md +0 -0
  108. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-011-windows-support.md +0 -0
  109. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-012-drop-windows-support.md +0 -0
  110. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +0 -0
  111. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-014-workspace-is-configuration.md +0 -0
  112. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +0 -0
  113. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +0 -0
  114. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +0 -0
  115. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +0 -0
  116. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +0 -0
  117. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +0 -0
  118. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-021-one-surface-per-repo.md +0 -0
  119. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +0 -0
  120. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +0 -0
  121. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +0 -0
  122. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +0 -0
  123. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +0 -0
  124. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +0 -0
  125. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +0 -0
  126. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +0 -0
  127. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +0 -0
  128. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +0 -0
  129. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +0 -0
  130. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -0
  131. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +0 -0
  132. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +0 -0
  133. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md +0 -0
  134. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +0 -0
  135. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +0 -0
  136. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +0 -0
  137. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +0 -0
  138. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +0 -0
  139. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +0 -0
  140. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +0 -0
  141. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-044-compatibility-is-not-evidence.md +0 -0
  142. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +0 -0
  143. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-046-one-rule-one-copy.md +0 -0
  144. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +0 -0
  145. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +0 -0
  146. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-049-a-ruling-that-a-later-record-moved-says-so-where-it-is-printed.md +0 -0
  147. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-050-a-byte-count-is-not-a-region-and-updated-is-not-a-change-of-rules.md +0 -0
  148. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-051-a-pointer-is-the-readers-only-route-so-it-is-not-a-convenience.md +0 -0
  149. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +0 -0
  150. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +0 -0
  151. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +0 -0
  152. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +0 -0
  153. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +0 -0
  154. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +0 -0
  155. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-060-a-repository-with-nothing-to-run-is-adopted-and-says-so.md +0 -0
  156. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md +0 -0
  157. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md +0 -0
  158. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md +0 -0
  159. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md +0 -0
  160. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md +0 -0
  161. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-066-a-monorepo-projects-once-per-package.md +0 -0
  162. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-067-which-harnesses-read-agents-md-is-a-column.md +0 -0
  163. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md +0 -0
  164. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-069-the-conformance-lint-checks-the-published-specification.md +0 -0
  165. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md +0 -0
  166. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md +0 -0
  167. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md +0 -0
  168. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md +0 -0
  169. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md +0 -0
  170. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-075-nothing-leaves-the-machine.md +0 -0
  171. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md +0 -0
  172. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md +0 -0
  173. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md +0 -0
  174. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md +0 -0
  175. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-080-the-tools-own-names-are-not-repositories-and-neither-reader-decides-by-shape.md +0 -0
  176. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md +0 -0
  177. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +0 -0
  178. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md +0 -0
  179. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md +0 -0
  180. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md +0 -0
  181. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md +0 -0
  182. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md +0 -0
  183. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md +0 -0
  184. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md +0 -0
  185. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md +0 -0
  186. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md +0 -0
  187. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md +0 -0
  188. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-093-why-names-what-governs-a-file.md +0 -0
  189. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md +0 -0
  190. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-095-gate-output-keeps-the-failures.md +0 -0
  191. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/ADR-096-impact-names-who-a-change-reaches.md +0 -0
  192. {simt_dev-0.4.0 → simt_dev-0.6.0}/docs/decisions/README.md +0 -0
  193. {simt_dev-0.4.0 → simt_dev-0.6.0}/python/simt_dev/__init__.py +0 -0
  194. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/core.md +0 -0
  195. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/mdc/intake-questions.mdc +0 -0
  196. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/mdc/preview-postflight.mdc +0 -0
  197. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/mdc/slice-commit.mdc +0 -0
  198. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/mdc/test-gate.mdc +0 -0
  199. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/android.md +0 -0
  200. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/cloudflare-workers.md +0 -0
  201. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/connectiq.md +0 -0
  202. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/container.md +0 -0
  203. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/dart.md +0 -0
  204. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/deno.md +0 -0
  205. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/dotnet.md +0 -0
  206. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/elixir.md +0 -0
  207. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/go.md +0 -0
  208. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/jvm.md +0 -0
  209. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/node.md +0 -0
  210. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/python.md +0 -0
  211. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/react-native.md +0 -0
  212. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/react-web.md +0 -0
  213. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/ruby.md +0 -0
  214. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/rust.md +0 -0
  215. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/swift.md +0 -0
  216. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/typescript.md +0 -0
  217. {simt_dev-0.4.0 → simt_dev-0.6.0}/rules/stacks/uv.md +0 -0
  218. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/agenthooks/decide.mjs +0 -0
  219. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/agenthooks/policy.mjs +0 -0
  220. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/agenthooks/prompt.mjs +0 -0
  221. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/bench/adapters.json +0 -0
  222. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/brief/kind.mjs +0 -0
  223. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/brief.mjs +0 -0
  224. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/decide.mjs +0 -0
  225. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/evidence.mjs +0 -0
  226. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/impact.mjs +0 -0
  227. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/lessons.mjs +0 -0
  228. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/map.mjs +0 -0
  229. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/plan.mjs +0 -0
  230. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/repoindex.mjs +0 -0
  231. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/shared.mjs +0 -0
  232. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/commands/tests.mjs +0 -0
  233. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/federation/client.mjs +0 -0
  234. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/federation/config.mjs +0 -0
  235. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/federation/query.mjs +0 -0
  236. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/graph/compile.mjs +0 -0
  237. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/graph/spec.mjs +0 -0
  238. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/graph/speccheck.mjs +0 -0
  239. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/capability.mjs +0 -0
  240. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/gates.mjs +0 -0
  241. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/resolve.mjs +0 -0
  242. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/hooks/where.mjs +0 -0
  243. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/identity.mjs +0 -0
  244. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/compact.mjs +0 -0
  245. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/extract.mjs +0 -0
  246. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/gate.mjs +0 -0
  247. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/impact.mjs +0 -0
  248. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/index/tests.mjs +0 -0
  249. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/kernel/budget.mjs +0 -0
  250. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/kernel/card.mjs +0 -0
  251. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/kernel/checks.mjs +0 -0
  252. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/kernel/inferability.mjs +0 -0
  253. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/kernel/variants.mjs +0 -0
  254. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/mcp/schema.mjs +0 -0
  255. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/measure/context.mjs +0 -0
  256. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/measure/loaderView.mjs +0 -0
  257. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/monorepo.mjs +0 -0
  258. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/output/index.mjs +0 -0
  259. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/plan/index.mjs +0 -0
  260. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/plan/template.mjs +0 -0
  261. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/baselines.mjs +0 -0
  262. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/conflicts.mjs +0 -0
  263. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/disclosure.mjs +0 -0
  264. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/lock.mjs +0 -0
  265. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/markers.mjs +0 -0
  266. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/mdc.mjs +0 -0
  267. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/shared.mjs +0 -0
  268. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/projection/targets.mjs +0 -0
  269. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/resolve/eval.mjs +0 -0
  270. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/resolve/fingerprint.mjs +0 -0
  271. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/resolve/near.mjs +0 -0
  272. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/resolve/resolve.mjs +0 -0
  273. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/resolve/source.mjs +0 -0
  274. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/toolchain.mjs +0 -0
  275. {simt_dev-0.4.0 → simt_dev-0.6.0}/src/workspace.mjs +0 -0
  276. {simt_dev-0.4.0 → simt_dev-0.6.0}/templates/plan/tracker.json +0 -0
@@ -0,0 +1,22 @@
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
+
13
+ # Local index, evidence ledger, benchmark run outputs and local-model proposals
14
+ # (plan 0003 §4). Task descriptors in .simt/bench/tasks/*.json are committed;
15
+ # runs, distilled summaries and review proposals are not.
16
+ .simt/index.sqlite
17
+ .simt/index.jsonl
18
+ .simt/ledger.jsonl
19
+ .simt/bench/runs/
20
+ .simt/gate/
21
+ .simt/distilled/
22
+ .simt/reviews/
@@ -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
@@ -0,0 +1,432 @@
1
+ Metadata-Version: 2.5
2
+ Name: simt-dev
3
+ Version: 0.6.0
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
+ Project-URL: Homepage, https://github.com/QuazarMedia/simt-dev
6
+ Project-URL: Repository, https://github.com/QuazarMedia/simt-dev
7
+ Project-URL: Changelog, https://github.com/QuazarMedia/simt-dev/blob/main/CHANGELOG.md
8
+ Author: Said Elimam
9
+ License-Expression: Apache-2.0
10
+ License-File: LICENSE
11
+ Keywords: agent,agents,ai,codex,cursor,git-hooks,llm,rules,skills
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: Apache Software License
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Software Development :: Quality Assurance
26
+ Requires-Python: >=3.9
27
+ Provides-Extra: node
28
+ Requires-Dist: nodejs-wheel-binaries; extra == 'node'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # simt-dev
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)
34
+
35
+ `simt` adopts a repository for the agents that work in it, and builds an intelligence
36
+ amplifier around them: a brief that answers before the agent explores, gates that
37
+ validate before a tool call, benches that price every rule text, and memory that puts
38
+ a recorded failure to work on the next one.
39
+
40
+ It reads what the repository actually runs, projects the rules that are not already
41
+ obvious into the files those agents read, and installs only the gates that repository
42
+ can run. Around that projection it keeps the bytes stable, replaces an instruction
43
+ with a check where a check can decide, answers questions about the tree from a local
44
+ index, and records whether a run still applies to the tree on disk.
45
+
46
+ The aim of the whole design is a higher share of tasks resolved, at a lower cost per
47
+ resolved task. Those targets are hypotheses. A change that touches what an agent reads
48
+ ships with a measurement, or its record says the measurement was not run. `simt rules
49
+ why ADR-NNN` prints the record, including whether it is still in force.
50
+
51
+ The default path is deterministic: no model, no network, no runtime dependencies.
52
+ Anything that needs a parser grammar, a local model, or another server is a separate
53
+ package, off until the repository names it, and it proposes rows or text for a person
54
+ to merge. It does not write the projection.
55
+
56
+ ## Install
57
+
58
+ Requires **Node >= 22.20.0** for the npm and PyPI channels; the release binary carries
59
+ its own runtime. The current published release is **0.5.0**. Pin it. The tool writes a
60
+ content digest into the files it generates, and an unpinned upgrade changes them under
61
+ you.
62
+
63
+ ```sh
64
+ npm i -D simt-dev@0.5.0
65
+
66
+ # or globally
67
+ npm i -g simt-dev@0.5.0
68
+
69
+ # or once, with no install
70
+ npx -y simt-dev@0.5.0 check
71
+ ```
72
+
73
+ ### From PyPI
74
+
75
+ The wheel carries the same bytes as the npm tarball. It does not fetch them from npm
76
+ at install time.
77
+
78
+ ```sh
79
+ pip install simt-dev
80
+
81
+ # when this machine has no node
82
+ pip install "simt-dev[node]"
83
+ ```
84
+
85
+ `simt` is the command on both channels. Node is resolved in this order, and the first
86
+ one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra, then
87
+ `node` on `PATH`.
88
+
89
+ ### From Homebrew
90
+
91
+ ```sh
92
+ brew install QuazarMedia/homebrew-tap/simt-dev
93
+ ```
94
+
95
+ The formula downloads the single-file binary for this machine, which carries its own
96
+ runtime: the command works with no Node installed.
97
+
98
+ ### As a single-file binary
99
+
100
+ Each release carries one executable per platform — macOS arm64 and x64, Linux x64 —
101
+ beside its `.sha256`. The channel's first release is the version after 0.5.0; pin that,
102
+ and run this from the repository's top level:
103
+
104
+ ```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
106
+ ```
107
+
108
+ The locator checks `.simt/bin/simt` before `PATH`, so the repository's own copy is the
109
+ 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.
112
+
113
+ ## What `simt` does
114
+
115
+ ```sh
116
+ # Adopt, inspect, and maintain a repository
117
+ simt init # adopt or scaffold; prints a plan; --yes writes
118
+ simt doctor # stack, facts, evidence, and config health
119
+ simt check [--frozen] # projection drift, manifest, lock, and declared checkers
120
+ simt sync [--explain] --yes # regenerate the projection
121
+ simt upgrade --yes # move every consumer in the workspace to this SHA
122
+
123
+ # Orient on a task and query the local code and governance graph
124
+ simt brief "<task>" # one <= 2 KB packet: kind, commands, files, tests, ADRs, skills, lessons
125
+ simt index [--embed] # files, symbols, edges, FTS5 tokens (+ optional local embeddings)
126
+ simt map --task "<task>" # hybrid BM25 + PageRank + resolver file ranking (outline|names|signatures)
127
+ simt impact <file|symbol> # importers, covering tests, governance, and cross-repo consumers
128
+ simt tests <path> [--cochange] # tests covering a file via imports, naming, coverage, or co-change
129
+ simt gate --changed # run only the tests the current diff reaches, with compacted output
130
+ simt why [path] # ADRs, rules, skills, gates, and lessons governing a path
131
+
132
+ # Rules, skills, decisions, and lessons
133
+ simt rules list [--root <path>] # rule catalogue and what applies to a repository
134
+ simt rules show <id> # read one rule body (including rules deferred in kernel mode)
135
+ simt rules why <id|ADR-NNN> [--all] # the decision that settled a rule, and whether it still stands
136
+ simt decide "<title>" --yes # scaffold the next ADR with structured simt-affects / simt-supersedes
137
+ simt lessons list # fail-to-fix, revert, review-block, and hook-denial candidates
138
+ simt lessons review <id> --yes # promote a candidate to docs/lessons/NNNN-<slug>.md
139
+ simt skills index # tier-0 catalogue: every skill, one line each
140
+ simt skills brief --task "<task>" # tier-1 ranked skill selection within budget
141
+ simt skills show <name> # tier-2 skill body on demand (respects --max-bytes)
142
+ simt skills why <name> # the signal chain that selected or rejected a skill
143
+ simt skills find <query> # search skills by capability and keyword
144
+ simt skills install <name> --yes # pin a skill into the repository
145
+ simt skills compile [<name>] # compile to Agent Skills layout, split > 5,000-token bodies, report triggers
146
+ simt skills eval [corpus] # measure resolver precision and recall against a gold corpus
147
+ simt graph lint [--spec agentskills]# verify the skill registry against skills on disk
148
+
149
+ # Dual gates (git time and agent tool-call time) and execution evidence
150
+ simt hooks install --yes # install the shared POSIX git hook dispatcher
151
+ simt hooks status # what each git event routes to, and whether it is wired
152
+ simt hooks run <event> # run pre-commit or pre-push gates now, as git would
153
+ simt agent-hooks install --yes # write pre/post-tool and prompt-submit hooks for active harnesses
154
+ simt agent-hooks status # what each harness will run, and whether Codex trusts it
155
+ simt agent-hook <event> --harness # evaluate pre-tool-use, post-tool-use, or prompt-submit
156
+ simt evidence # gate and test runs recorded against the current git tree
157
+ simt evidence check <msg-file> # verify a commit message does not claim unrecorded passing runs
158
+
159
+ # Plans, context metering, workspace learning, benchmarks, local models, and MCP
160
+ simt plan status # count queued, in-progress, complete, and accepted tracker rows
161
+ simt plan next [<id>] # print the next ready slice section (~1 KB)
162
+ simt plan done <id> [<sha>] --yes # mark a tracker row complete with its commit SHA and test command
163
+ simt tokens [--repos] [--session] # measure bytes loaded at session start or split a transcript
164
+ simt harness detect [--user] # detect configured harnesses at repo and user level
165
+ simt harness loaders [--table] # what each harness loads, in what order, and where its cap truncates
166
+ simt shared plan # rules repeated across a workspace and the bytes saved by sharing
167
+ simt shared install --yes # write shared rules once at user level and record the repo delta
168
+ simt compare # workspace matrix, violated rules, noisy/slow gates, and ADR drafts
169
+ simt local doctor [--allow-remote] # probe configured OpenAI-compatible local chat and embed endpoints
170
+ simt bench mine --yes # mine verified fail-to-pass tasks from git history into the vault
171
+ simt bench run --yes # evaluate arms (bare, current, kernel, brief) in isolated exports
172
+ simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstrap CIs, McNemar/Wilcoxon
173
+ simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
174
+ simt bench probes --yes # 12 deterministic rule-compliance probes
175
+ simt bench variants --yes # evaluate simt-variants slots and lock winners in simt-dev.lock.json
176
+ simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
177
+ simt pack lint [dir] [--require-measured] # validate a pack and state its measured ΔR
178
+ simt pack publish [dir] --yes # publish an npm-sourced pack (git packs name the tag-and-push)
179
+ simt mcp [--list] # serve the 13 read-only tools over stdio JSON-RPC
180
+ ```
181
+
182
+ `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`,
183
+ `skills install`, `plan done`, `lessons review`, `decide`, `pack new`, `pack publish`
184
+ and the `bench` writers print
185
+ a plan and write nothing without `--yes`. None of them commit or push. `simt index`
186
+ writes its cache without asking: the file is gitignored and `git ls-files` can rebuild it.
187
+
188
+ `check` runs the checkers a rule names (`max-file-lines`, `forbid-regex`,
189
+ `forbidden-path-edit`, `required-file`), verifies structured ADR supersessions
190
+ (`prose-partial-supersession`), and flags expired lessons (`LESSON-EXPIRED`). A marked
191
+ rule line leaves the projection as `Enforced:` and the checker's name. The file-length
192
+ line warns past 400 lines and fails past 1000. `simt evidence check` warns when a commit
193
+ message claims a passing run this tree does not have, and the commit fails when
194
+ `gates.evidence` is `block`.
195
+
196
+ ## Agent playbook: how and when to use each module
197
+
198
+ An agent working in an adopted repository should use `simt` as its primary orientation,
199
+ retrieval, validation and memory layer rather than scanning the tree by hand. Every
200
+ read-only command supports `--json` (and `--max-bytes <n>`) or can be called over stdio
201
+ through `simt mcp`.
202
+
203
+ ### Decision tree: which command to run when
204
+
205
+ | Situation | First command | If you need more |
206
+ | --- | --- | --- |
207
+ | New task, no context yet | `simt brief "<task>"` | `simt map --task "<task>"` for broader file ranking |
208
+ | About to edit a file | `simt why <file>` | `simt impact <file>` for blast radius |
209
+ | Need to know what tests to run | `simt tests <file>` | `simt gate --changed` to run them |
210
+ | Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
211
+ | Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
212
+ | Before committing | `simt check` | `simt evidence` to verify test claims |
213
+ | Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
214
+ | Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
215
+ | Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
216
+
217
+ ### 1. Start of task — orient in one call instead of broad exploration
218
+
219
+ 1. **Assemble the task packet first.** Run `simt brief "<task>"` (or call MCP `brief`, or
220
+ read the packet injected automatically when `agent-hooks install --yes` wired
221
+ `prompt-submit`). Within `--budget 2048` bytes (pass `--budget 0` for unlimited or
222
+ `--explain` to see why items were kept or cut), the packet gives:
223
+ - `TASK`: the classified task kind (`bugfix`, `feature`, `refactor`, `test`, `docs`,
224
+ `config`) and the evidence behind it.
225
+ - `COMMANDS`: the exact `build`, `test`, `lint`, `format`, `typecheck`, and focused
226
+ test templates for this repository.
227
+ - `LIKELY FILES`: top files ranked by reciprocal-rank fusion (`RRF_K = 40`) across
228
+ SQLite FTS5 `bm25()`, PageRank graph proximity, and resolver signals.
229
+ - `TESTS`: the test files mapped to those likely files.
230
+ - `DECISIONS`, `SKILLS`, `LESSONS`, `CAUTIONS`, and `FEDERATION`: governing ADRs,
231
+ matched skills, promoted lessons for those paths, active worktree/hook cautions, and
232
+ any structural answer from a declared external code-graph server.
233
+ 2. **Pull the next tracker slice when working from a plan.** Instead of reading a multi-thousand-line
234
+ plan in `docs/plans/` or `docs/reviews/`, run `simt plan next` (or MCP `plan_next`) to
235
+ load only the next queued slice (~1 KB) whose dependencies are already `Complete` or
236
+ `Accepted`.
237
+
238
+ **When to use `--json` format.** When piping output to other tools or when the agent needs
239
+ structured data, add `--json` to any read-only command. For example, `simt brief "<task>" --json`
240
+ returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `skills`,
241
+ `lessons`, `cautions`, and `federation` fields that can be programmatically consumed.
242
+
243
+ ### 2. Before editing — query the graph, blast radius, and governance
244
+
245
+ 1. **Rank files or symbols at the right granularity.** When `brief`'s file list is too
246
+ narrow or the task evolves, run `simt map --task "<task>" --level outline` for paths,
247
+ `--level names` for exported symbols, or `--level signatures` for declaration lines.
248
+ Pass `--embed` when `local.embed` is configured in `simt.json` and clears the +10-point
249
+ recall@10 bar.
250
+ 2. **Check blast radius before changing a shared file or export.** Run
251
+ `simt impact <file|symbol>` to see every direct and transitive importer, the tests
252
+ covering them, the governing rules and ADRs, and any sibling repository in the
253
+ workspace that imports that symbol.
254
+ 3. **Read the governance on a path before changing its behaviour.** Run `simt why <path>`
255
+ to list every ADR whose `simt-affects` matches the file, every scoped rule, skill,
256
+ gate, and promoted lesson. Run `simt why` with no path to audit the repository for
257
+ `UNRESOLVED-AFFECTS` tokens.
258
+ 4. **Resolve deferred rules and citations on demand.** When `simt.json` sets
259
+ `"mode": "kernel"`, only `hard` and `command` rules are loaded at session start;
260
+ `convention` and `style` rules are listed by ID at the foot of the projection. Fetch a
261
+ deferred rule with `simt rules show <id>`, and read any cited `ADR-NNN` with
262
+ `simt rules why ADR-NNN` (or MCP `rules_why`) to see its rulings and whether any ruling
263
+ was superseded or narrowed.
264
+ 5. **Load skills progressively (Tier 0 → Tier 1 → Tier 2).** Never read every skill file
265
+ upfront:
266
+ - Tier 0: `simt skills index` (or MCP `skills_index`) lists one line per skill.
267
+ - Tier 1: `simt skills brief --task "<task>"` (or MCP `skills_brief`) ranks compatible
268
+ skills within budget (`--plan` emits a fetch plan without bodies).
269
+ - Tier 2: `simt skills show <name> --max-bytes 8192` (or MCP `skills_show`) loads only
270
+ the chosen skill's body.
271
+
272
+ **Optimal retrieval strategy.** For best performance, use this sequence:
273
+ 1. `simt brief "<task>"` — gets the most relevant files and tests in one call
274
+ 2. If more files are needed, `simt map --task "<task>" --level outline` — broader ranking
275
+ 3. If you need to understand a specific file's impact, `simt impact <file>` — blast radius
276
+ 4. If you need to understand governance, `simt why <file>` — ADRs and rules
277
+
278
+ ### 3. During implementation — validate incrementally under dual gates
279
+
280
+ 1. **Keep the local index current.** After adding, renaming, or changing exports/imports,
281
+ run `simt index`. It hashes tracked blobs via `git ls-files --stage` and re-extracts
282
+ only changed files in under 300 ms.
283
+ 2. **Run only the tests your change reaches.** Use `simt tests <path>` to inspect which
284
+ tests cover a file (via import edges, naming conventions, or coverage records; add
285
+ `--cochange` to include historical co-change pairs). Run `simt gate --changed` (or
286
+ `simt gate <path...>`) to execute only the tests reachable from the diff, with gate
287
+ output compacted so every failure line survives while passing noise is trimmed.
288
+ 3. **Respect agent-time hooks and learn from failures.** With `simt agent-hooks install --yes`,
289
+ `pre-tool-use` blocks unapproved `git push`, history rewrites (`--no-verify`,
290
+ `--amend`, `reset --hard`, `rebase`), and direct edits to generated regions before the
291
+ tool executes. When a test or gate fails, `post-tool-use` hashes the normalised first
292
+ error line against `docs/lessons/*.md` and injects the matching lesson into context.
293
+
294
+ **Incremental validation workflow.** After each meaningful code change:
295
+ 1. Run `simt tests <changed-file>` to see which tests cover your changes
296
+ 2. Run `simt gate --changed` to execute only the affected tests
297
+ 3. If a test fails, check `simt lessons list` for known issues and their remedies
298
+ 4. If the failure is new, fix it and consider promoting the lesson with `simt lessons review <id> --yes`
299
+
300
+ ### 4. Before committing and closing a slice — verify drift, evidence, and memory
301
+
302
+ 1. **Run the repository gate.** Run `simt check` (or MCP `check`). Fix any reported
303
+ `DRIFT` with `simt sync --yes`, and resolve any rule checker or manifest findings.
304
+ 2. **Verify execution evidence matches the current tree.** Run `simt evidence` to confirm
305
+ that the tests and gates you plan to cite were recorded against the current
306
+ `git write-tree` digest in `.simt/ledger.jsonl`. Any file edit invalidates earlier
307
+ evidence.
308
+ 3. **Record decisions, lessons, and tracker state:**
309
+ - If the change alters what the repository or tool believes, scaffold an ADR with
310
+ `simt decide "<title>" [--supersedes ADR-NNN[:<ruling>]] --yes`.
311
+ - If a failing gate or test was fixed during the session, inspect captured candidates
312
+ with `simt lessons list` and promote reusable ones with
313
+ `simt lessons review <id> --yes`.
314
+ - After committing locally (never push without explicit approval per `ADR-001`), close
315
+ the tracker slice with `simt plan done <id> <sha> --test "<cmd>" --yes`.
316
+
317
+ **Pre-commit checklist.** Before committing, run this sequence:
318
+ 1. `simt check` — verify no drift and all rules pass
319
+ 2. `simt evidence` — confirm test runs are recorded against current tree
320
+ 3. `simt lessons list` — check for any unreviewed lesson candidates
321
+ 4. `git commit` — commit locally (never push without explicit approval)
322
+ 5. `simt plan done <id> <sha> --yes` — close the tracker slice if working from a plan
323
+
324
+ ## Optimal setup for every project, repository, and workspace shape
325
+
326
+ | Shape | How to configure and run `simt` optimally |
327
+ | --- | --- |
328
+ | **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>`. |
329
+ | **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`. |
330
+ | **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. |
331
+ | **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`. |
332
+ | **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`. |
333
+ | **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`). |
334
+ | **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`. |
335
+
336
+ ## Module and MCP reference
337
+
338
+ | Module | CLI commands | Read-only MCP tools | When an agent should use it |
339
+ | --- | --- | --- | --- |
340
+ | **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 |
341
+ | **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`) |
342
+ | **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`) |
343
+ | **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 |
344
+ | **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 |
345
+ | **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 |
346
+ | **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 |
347
+ | **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 |
348
+ | **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 |
349
+ | **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 |
350
+
351
+ ## Where the plan finishes
352
+
353
+ Slices `R01`–`R45` are complete and shipped in `0.6.0`. The remaining queued slices are the
354
+ small ergonomics:
355
+
356
+ - **The small doors (`R46`–`R55`).** `simt explain <CODE>` for every finding code, safe
357
+ idempotent `simt doctor --fix`, a `< 50 ms` `simt status --line`, a write journal with
358
+ `simt undo`, `--diff` on every writer, shell completions, one cross-harness ignore list
359
+ plus a staged-diff secret scan, `simt slice start/finish <ID>` worktrees, file leases
360
+ for parallel agents, and `simt pr-body` assembled from the evidence ledger.
361
+
362
+ The local-model slices (`R38`–`R40`) shipped as they lab-written: `simt distill` proposes
363
+ budgeted summaries with line citations, `simt review` proposes an advisory ADR-008
364
+ verdict over the staged diff, and `simt brief` carries model/effort advice from bench
365
+ history. All remain off until named and propose rather than write projected text.
366
+
367
+ ## What it writes
368
+
369
+ | Path | What |
370
+ | --- | --- |
371
+ | `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 |
372
+ | `simt.json` | the manifest: `gates`, `substitutions`, `budget`, `mode`, `shared`, `surfaces`, `plans`, `packs`, `federation`, `local` |
373
+ | `simt-dev.lock.json` | the digest of the inputs, the digest of the projection, and locked `variants` winners from `simt bench variants` |
374
+ | `.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 |
375
+ | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
376
+ | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
377
+ | `docs/decisions/ADR-NNN-<slug>.md` | numbered decision records scaffolded by `simt decide --yes` with `simt-affects` and `simt-supersedes` frontmatter |
378
+ | `docs/lessons/NNNN-<slug>.md` | reviewed lessons promoted by `simt lessons review <id> --yes` with `simt-trigger`, `simt-evidence`, and `simt-expires` frontmatter |
379
+
380
+ Text outside the markers is left alone. A regeneration does not revert it.
381
+
382
+ `simt.json` also carries a `federation` block when the repository names external
383
+ code-graph servers, each with the command that starts it, and an optional `local` block
384
+ when the repository names loopback OpenAI-compatible `chat` or `embed` endpoints. A brief
385
+ may then ask a federated server one structural question for a task and cite the answer's
386
+ source, and the MCP `federation_query` tool asks one on demand, naming the server it
387
+ asked. The question goes to the tool and argument the manifest declared, so no foreign
388
+ tool is reachable that the repository did not name. Nothing is started and no socket is
389
+ opened unless the manifest declared it, and a server that does not answer costs the
390
+ packet a sentence, never the packet.
391
+
392
+ These are caches, gitignored, and rebuildable. They are not repository content:
393
+
394
+ | Path | What |
395
+ | --- | --- |
396
+ | `.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 |
397
+ | `.simt/ledger.jsonl` | one line per gate or test the dispatcher actually ran, against one git tree, plus normalised failure signatures |
398
+ | `.simt/lessons.jsonl` | deterministic lesson candidates captured from fail-to-fix pairs, reverts, `BLOCK` reviews, and hook denials |
399
+ | `.simt/bench/` | mined tasks (`tasks/`), test patch vault (`vault/`), and benchmark runs (`runs/`) |
400
+ | `.simt/proposals/` | non-authoritative skill description proposals with `{model, promptHash, digest}` provenance |
401
+
402
+ `simt shared install --yes` writes a user-level copy of the rules a workspace
403
+ repeats, into the file that harness documents, and records the ids on each
404
+ repository's manifest. The next `sync` drops those rules from the region and names
405
+ them.
406
+
407
+ ## How a rule is chosen
408
+
409
+ Detection reads dependency manifests, build files and CI workflows, and ranks rules
410
+ by path, keyword, name, capability and stack. The ranking is a score. A pull request
411
+ can diff it.
412
+
413
+ A repository whose ecosystem has no profile yet is still adopted: it gets the core
414
+ rules and no gates, until gate templates exist for it. A hook that would run nothing
415
+ is not installed.
416
+
417
+ Every behaviour that is a choice has a numbered record. `simt rules why <id>` is the
418
+ path from a rule you did not expect to the reason it is there.
419
+
420
+ ## Platform
421
+
422
+ **macOS and Linux.** The hooks are POSIX `sh`. There is no Windows build. `npm i` on
423
+ Windows fails with npm's `EBADPLATFORM`, which npm will not let a package explain, so
424
+ the answer is here: **use WSL2**, and the gate works inside it.
425
+
426
+ A Windows checkout without WSL2 can still read the projection. It is plain text. The
427
+ hooks and the CI gate need the POSIX host.
428
+
429
+ ## Licence
430
+
431
+ Apache-2.0. See [LICENSE](LICENSE). Report a vulnerability through
432
+ [SECURITY.md](SECURITY.md).