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