simt-dev 0.3.0__tar.gz → 0.4.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 (259) hide show
  1. {simt_dev-0.3.0 → simt_dev-0.4.0}/.gitignore +2 -0
  2. {simt_dev-0.3.0 → simt_dev-0.4.0}/CHANGELOG.md +172 -0
  3. simt_dev-0.4.0/PKG-INFO +214 -0
  4. simt_dev-0.4.0/README.md +184 -0
  5. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md +1 -1
  6. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md +1 -1
  7. simt_dev-0.4.0/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md +153 -0
  8. simt_dev-0.4.0/docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md +100 -0
  9. simt_dev-0.4.0/docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md +72 -0
  10. simt_dev-0.4.0/docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md +69 -0
  11. simt_dev-0.4.0/docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md +67 -0
  12. simt_dev-0.4.0/docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md +59 -0
  13. simt_dev-0.4.0/docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md +52 -0
  14. simt_dev-0.4.0/docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md +55 -0
  15. simt_dev-0.4.0/docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md +60 -0
  16. simt_dev-0.4.0/docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md +60 -0
  17. simt_dev-0.4.0/docs/decisions/ADR-093-why-names-what-governs-a-file.md +58 -0
  18. simt_dev-0.4.0/docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md +44 -0
  19. simt_dev-0.4.0/docs/decisions/ADR-095-gate-output-keeps-the-failures.md +31 -0
  20. simt_dev-0.4.0/docs/decisions/ADR-096-impact-names-who-a-change-reaches.md +38 -0
  21. {simt_dev-0.3.0 → simt_dev-0.4.0}/package.json +2 -2
  22. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/core.md +2 -2
  23. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/agenthooks/policy.mjs +10 -2
  24. simt_dev-0.4.0/src/agenthooks/prompt.mjs +81 -0
  25. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/agenthooks/render.mjs +138 -17
  26. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/argv.mjs +34 -1
  27. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/grade.mjs +3 -0
  28. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/run.mjs +85 -39
  29. simt_dev-0.4.0/src/bench/variants.mjs +456 -0
  30. simt_dev-0.4.0/src/brief/assemble.mjs +346 -0
  31. simt_dev-0.4.0/src/brief/kind.mjs +134 -0
  32. simt_dev-0.4.0/src/brief/packet.mjs +197 -0
  33. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/ci/workflow.mjs +11 -1
  34. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/agenthook.mjs +84 -5
  35. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/bench.mjs +53 -16
  36. simt_dev-0.4.0/src/commands/brief.mjs +78 -0
  37. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/compare.mjs +10 -2
  38. simt_dev-0.4.0/src/commands/decide.mjs +116 -0
  39. simt_dev-0.4.0/src/commands/evidence.mjs +96 -0
  40. simt_dev-0.4.0/src/commands/gate.mjs +165 -0
  41. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/help.mjs +65 -3
  42. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/hooks.mjs +45 -5
  43. simt_dev-0.4.0/src/commands/impact.mjs +205 -0
  44. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/index.mjs +52 -1
  45. simt_dev-0.4.0/src/commands/lessons.mjs +127 -0
  46. simt_dev-0.4.0/src/commands/local.mjs +97 -0
  47. simt_dev-0.4.0/src/commands/map.mjs +126 -0
  48. simt_dev-0.4.0/src/commands/repoindex.mjs +55 -0
  49. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/rules.mjs +17 -2
  50. simt_dev-0.4.0/src/commands/shared.mjs +398 -0
  51. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/skills.mjs +3 -17
  52. simt_dev-0.4.0/src/commands/skillscompile.mjs +255 -0
  53. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/sync.mjs +87 -3
  54. simt_dev-0.4.0/src/commands/tests.mjs +145 -0
  55. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/tokens.mjs +30 -1
  56. simt_dev-0.4.0/src/commands/why.mjs +172 -0
  57. simt_dev-0.4.0/src/compare/learn.mjs +680 -0
  58. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/decisions/index.mjs +116 -65
  59. simt_dev-0.4.0/src/federation/client.mjs +188 -0
  60. simt_dev-0.4.0/src/federation/config.mjs +134 -0
  61. simt_dev-0.4.0/src/federation/query.mjs +48 -0
  62. simt_dev-0.4.0/src/graph/compile.mjs +475 -0
  63. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/graph/spec.mjs +1 -1
  64. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/dispatcher.mjs +15 -0
  65. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/shim.mjs +31 -0
  66. simt_dev-0.4.0/src/index/compact.mjs +228 -0
  67. simt_dev-0.4.0/src/index/extract.mjs +331 -0
  68. simt_dev-0.4.0/src/index/gate.mjs +89 -0
  69. simt_dev-0.4.0/src/index/govern.mjs +234 -0
  70. simt_dev-0.4.0/src/index/impact.mjs +186 -0
  71. simt_dev-0.4.0/src/index/map.mjs +627 -0
  72. simt_dev-0.4.0/src/index/persist.mjs +239 -0
  73. simt_dev-0.4.0/src/index/store.mjs +515 -0
  74. simt_dev-0.4.0/src/index/tests.mjs +294 -0
  75. simt_dev-0.4.0/src/kernel/budget.mjs +100 -0
  76. simt_dev-0.4.0/src/kernel/checks.mjs +378 -0
  77. simt_dev-0.4.0/src/kernel/variants.mjs +353 -0
  78. simt_dev-0.4.0/src/ledger/index.mjs +147 -0
  79. simt_dev-0.4.0/src/local/client.mjs +482 -0
  80. simt_dev-0.4.0/src/local/config.mjs +234 -0
  81. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/mcp/tools.mjs +138 -1
  82. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/measure/context.mjs +7 -5
  83. simt_dev-0.4.0/src/memory/decide.mjs +462 -0
  84. simt_dev-0.4.0/src/memory/lessons.mjs +858 -0
  85. simt_dev-0.4.0/src/projection/disclosure.mjs +92 -0
  86. simt_dev-0.4.0/src/projection/lock.mjs +125 -0
  87. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/manifest.mjs +52 -0
  88. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/markers.mjs +56 -17
  89. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/project.mjs +24 -17
  90. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/rules.mjs +407 -49
  91. simt_dev-0.4.0/src/projection/shared.mjs +428 -0
  92. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/targets.mjs +2 -1
  93. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/toolwords.mjs +8 -0
  94. simt_dev-0.3.0/PKG-INFO +0 -150
  95. simt_dev-0.3.0/README.md +0 -120
  96. {simt_dev-0.3.0 → simt_dev-0.4.0}/LICENSE +0 -0
  97. {simt_dev-0.3.0 → simt_dev-0.4.0}/bin/simt-dev.mjs +0 -0
  98. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-001-push-requires-approval.md +0 -0
  99. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-002-refactor-blast-radius.md +0 -0
  100. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-003-test-breadth.md +0 -0
  101. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-004-hook-owns-format.md +0 -0
  102. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-005-file-length.md +0 -0
  103. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-006-coverage-bar.md +0 -0
  104. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-007-section-skeleton.md +0 -0
  105. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-008-verdict-vocabulary.md +0 -0
  106. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-009-skill-layout.md +0 -0
  107. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-010-runner-invocation.md +0 -0
  108. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-011-windows-support.md +0 -0
  109. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-012-drop-windows-support.md +0 -0
  110. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +0 -0
  111. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-014-workspace-is-configuration.md +0 -0
  112. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +0 -0
  113. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +0 -0
  114. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +0 -0
  115. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +0 -0
  116. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +0 -0
  117. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +0 -0
  118. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-021-one-surface-per-repo.md +0 -0
  119. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +0 -0
  120. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +0 -0
  121. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +0 -0
  122. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +0 -0
  123. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +0 -0
  124. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +0 -0
  125. {simt_dev-0.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +0 -0
  127. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +0 -0
  128. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +0 -0
  129. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +0 -0
  130. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -0
  131. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +0 -0
  132. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +0 -0
  133. {simt_dev-0.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +0 -0
  135. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +0 -0
  136. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +0 -0
  137. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +0 -0
  138. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +0 -0
  139. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +0 -0
  140. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +0 -0
  141. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-044-compatibility-is-not-evidence.md +0 -0
  142. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +0 -0
  143. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-046-one-rule-one-copy.md +0 -0
  144. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +0 -0
  145. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +0 -0
  146. {simt_dev-0.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +0 -0
  150. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +0 -0
  151. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +0 -0
  152. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +0 -0
  153. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +0 -0
  154. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +0 -0
  155. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +0 -0
  156. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +0 -0
  157. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-060-a-repository-with-nothing-to-run-is-adopted-and-says-so.md +0 -0
  158. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md +0 -0
  159. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md +0 -0
  160. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md +0 -0
  161. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md +0 -0
  162. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md +0 -0
  163. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-066-a-monorepo-projects-once-per-package.md +0 -0
  164. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-067-which-harnesses-read-agents-md-is-a-column.md +0 -0
  165. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md +0 -0
  166. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-069-the-conformance-lint-checks-the-published-specification.md +0 -0
  167. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md +0 -0
  168. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md +0 -0
  169. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md +0 -0
  170. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md +0 -0
  171. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-075-nothing-leaves-the-machine.md +0 -0
  172. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md +0 -0
  173. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md +0 -0
  174. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md +0 -0
  175. {simt_dev-0.3.0 → simt_dev-0.4.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.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md +0 -0
  177. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +0 -0
  178. {simt_dev-0.3.0 → simt_dev-0.4.0}/docs/decisions/README.md +0 -0
  179. {simt_dev-0.3.0 → simt_dev-0.4.0}/pyproject.toml +0 -0
  180. {simt_dev-0.3.0 → simt_dev-0.4.0}/python/simt_dev/__init__.py +0 -0
  181. {simt_dev-0.3.0 → simt_dev-0.4.0}/python/simt_dev/cli.py +0 -0
  182. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/mdc/intake-questions.mdc +0 -0
  183. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/mdc/preview-postflight.mdc +0 -0
  184. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/mdc/slice-commit.mdc +0 -0
  185. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/mdc/test-gate.mdc +0 -0
  186. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/android.md +0 -0
  187. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/cloudflare-workers.md +0 -0
  188. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/connectiq.md +0 -0
  189. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/container.md +0 -0
  190. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/dart.md +0 -0
  191. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/deno.md +0 -0
  192. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/dotnet.md +0 -0
  193. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/elixir.md +0 -0
  194. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/go.md +0 -0
  195. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/jvm.md +0 -0
  196. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/node.md +0 -0
  197. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/python.md +0 -0
  198. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/react-native.md +0 -0
  199. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/react-web.md +0 -0
  200. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/ruby.md +0 -0
  201. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/rust.md +0 -0
  202. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/swift.md +0 -0
  203. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/typescript.md +0 -0
  204. {simt_dev-0.3.0 → simt_dev-0.4.0}/rules/stacks/uv.md +0 -0
  205. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/agenthooks/decide.mjs +0 -0
  206. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/ablate.mjs +0 -0
  207. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/adapters.json +0 -0
  208. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/mine.mjs +0 -0
  209. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/probes.mjs +0 -0
  210. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/bench/report.mjs +0 -0
  211. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/ci/dependabot.mjs +0 -0
  212. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/ci.mjs +0 -0
  213. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/graph.mjs +0 -0
  214. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/harness.mjs +0 -0
  215. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/init.mjs +0 -0
  216. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/mcp.mjs +0 -0
  217. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/plan.mjs +0 -0
  218. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/skillsinstall.mjs +0 -0
  219. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/commands/upgrade.mjs +0 -0
  220. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/compare/discover.mjs +0 -0
  221. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/compare/hooksstate.mjs +0 -0
  222. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/compare/row.mjs +0 -0
  223. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/graph/load.mjs +0 -0
  224. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/graph/speccheck.mjs +0 -0
  225. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/capability.mjs +0 -0
  226. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/gates.mjs +0 -0
  227. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/resolve.mjs +0 -0
  228. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/hooks/where.mjs +0 -0
  229. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/identity.mjs +0 -0
  230. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/kernel/card.mjs +0 -0
  231. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/kernel/inferability.mjs +0 -0
  232. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/locate.mjs +0 -0
  233. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/mcp/resources.mjs +0 -0
  234. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/mcp/schema.mjs +0 -0
  235. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/mcp/server.mjs +0 -0
  236. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/measure/loaderView.mjs +0 -0
  237. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/measure/session.mjs +0 -0
  238. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/monorepo.mjs +0 -0
  239. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/name.mjs +0 -0
  240. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/output/index.mjs +0 -0
  241. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/package-version.mjs +0 -0
  242. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/packs.mjs +0 -0
  243. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/plan/index.mjs +0 -0
  244. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/plan/template.mjs +0 -0
  245. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/baselines.mjs +0 -0
  246. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/conflicts.mjs +0 -0
  247. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/loaders.mjs +0 -0
  248. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/mdc.mjs +0 -0
  249. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/projection/surfaces.mjs +0 -0
  250. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/resolve/eval.mjs +0 -0
  251. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/resolve/fingerprint.mjs +0 -0
  252. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/resolve/near.mjs +0 -0
  253. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/resolve/resolve.mjs +0 -0
  254. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/resolve/source.mjs +0 -0
  255. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/toolchain.mjs +0 -0
  256. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/tsconfig.mjs +0 -0
  257. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/upgrade/plan.mjs +0 -0
  258. {simt_dev-0.3.0 → simt_dev-0.4.0}/src/workspace.mjs +0 -0
  259. {simt_dev-0.3.0 → simt_dev-0.4.0}/templates/plan/tracker.json +0 -0
@@ -12,5 +12,7 @@ dist/
12
12
  # Local index, evidence ledger and benchmark run outputs (plan 0003 §4).
13
13
  # Task descriptors in .simt-dev/bench/tasks/*.json are committed; runs are not.
14
14
  .simt-dev/index.sqlite
15
+ .simt-dev/index.jsonl
15
16
  .simt-dev/ledger.jsonl
16
17
  .simt-dev/bench/runs/
18
+ .simt-dev/gate/
@@ -6,6 +6,176 @@ All notable changes to this package are recorded here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] — 2026-10-20
10
+
11
+ ### Hybrid retrieval fuses BM25, the code graph, and the resolver
12
+
13
+ `simt index` indexes full-text tokens across `code`, `docs`, `skills`, `decisions` and
14
+ `lessons` into the SQLite FTS5 `fts` table (with an Okapi BM25 fallback when the index is
15
+ JSON-lines). `simt map` and `simt brief` fuse FTS5 `bm25()`, PageRank graph proximity and
16
+ resolver signals with reciprocal-rank fusion (`RRF_K = 40`), raising gold-file recall@10 on
17
+ the 20 mined tasks here from 54.3% to 61.3% (above the 60% bar in ADR-091). With `--embed`
18
+ and a configured `local.embed` endpoint, `simt index` stores `Float32Array` vector blobs in
19
+ the `embeddings` table and `simt map --embed` adds brute-force cosine similarity; embeddings
20
+ stay off by default unless they raise recall@10 by at least 10 percentage points.
21
+
22
+ ### A local model adapter that opens zero sockets until named
23
+
24
+ `simt local doctor` probes the OpenAI-compatible `local.chat` and `local.embed` endpoints
25
+ declared in `simt.json` (`/v1/models`, `/v1/chat/completions`, `/v1/embeddings` for Ollama,
26
+ `llama-server`, LM Studio and MLX servers) and reports reachability, model presence and
27
+ latency. Non-loopback URLs are refused unless `--allow-remote` is given (ADR-075, ADR-090),
28
+ and when `local` is unset nothing opens a socket.
29
+
30
+ ### Estate learning and ADR drafts across a workspace
31
+
32
+ `simt compare --learn` aggregates benchmark uplift (`ΔR`, `ΔC`) per rule section across
33
+ adopted sibling repositories, promotes lessons repeated across at least two repositories as
34
+ shared candidates, and flags gates that fail more than 20% of the time as `NOISY-GATE`.
35
+ `simt compare --draft-adr <pattern>` writes a proposed ADR draft under `docs/decisions/`
36
+ carrying `Origin: simt compare --draft-adr` and the workspace evidence behind it.
37
+
38
+ ### Rule text variants have to win on the bench
39
+
40
+ A rule may declare candidate wordings under `simt-variants:` in its frontmatter (or supply
41
+ them with `--variants-file`). `simt bench variants <rule-id>` evaluates each candidate on
42
+ paired benchmark runs with McNemar on resolved rate and Wilcoxon signed-rank on cost,
43
+ promotes a wording only when `ΔR > 0` (or `ΔR == 0` and `ΔC < 0`) at `p < 0.05`, and records
44
+ the winning variant and its `p`-value in `simt-dev.lock.json`.
45
+
46
+ ### Decision records carry structured supersession frontmatter
47
+
48
+ `simt decide "<title>"` scaffolds the next numbered ADR in `docs/decisions/` with structured
49
+ frontmatter (`Status`, `Date`, `Supersedes`, `Superseded-by`, `Affects`) and updates the
50
+ records it supersedes when `--supersedes` and `--yes` are given. `simt rules lint` reports
51
+ `PARTIAL-SUPERSEDE` when prose claims to supersede part of an earlier record without
52
+ matching frontmatter links.
53
+
54
+ ### Lessons are captured from failure-to-fix pairs, recalled on match, and expire
55
+
56
+ When a failing gate or test run in `.simt-dev/ledger.jsonl` is followed by a passing run on
57
+ the same package, `simt lessons` records a deterministic candidate in
58
+ `.simt-dev/lessons-candidates.jsonl`. `simt lessons promote <id> --yes` writes a reviewed
59
+ lesson to `docs/lessons/<id>.md` with `Paths`, `Check`, `Expires` and `ADR` fields, and
60
+ `simt check` reports `LESSON-EXPIRED` once the date passes or the linked ADR is superseded.
61
+ Matching lessons (at most two) are recalled in `simt brief` and by `simt agent-hook
62
+ after-tool` when a tool call fails on the same package or error signature.
63
+
64
+ ### Skills compile to the Agent Skills standard and report their triggers
65
+
66
+ `simt skills compile` validates and compiles skill sources against the Agent Skills standard
67
+ (frontmatter `name` and `description`, description under 1024 characters, `SKILL.md` body at
68
+ most 500 lines, and on-demand `references/` and `scripts/` links). `simt skills triggers
69
+ "<prompt>"` previews which skills match a task and the score breakdown behind each match.
70
+
71
+ ### A task brief fits in the bytes a prompt can carry
72
+
73
+ `simt brief "<task>"` assembles what a task needs into one packet: the kind of the task
74
+ and the commands that kind needs, the files the map ranks highest, the tests the index
75
+ knows for them, the decisions that govern them, the skills the resolver selects, the
76
+ lessons that name those paths, and the cautions — dirty files to leave alone, generated
77
+ paths, files no test covers. The packet stays inside `--budget` bytes (2048 by default,
78
+ `0` for all of it), ends with the number of items it had to cut, and prints the same bytes
79
+ on the same tree; `--explain` prints every item with the reason it was kept or dropped.
80
+ The accept figure it was designed against — 20% fewer turns, 15% cheaper than the kernel
81
+ arm at no loss of resolved rate — is unmeasured here, because it needs a bench run and an
82
+ installed agent CLI and neither is on this machine. `simt skills brief` keeps its own
83
+ behaviour for now: retiring it changes two accepted decisions and an MCP output schema,
84
+ and this slice carries no decision to do it.
85
+
86
+ ### The packet arrives without being asked for
87
+
88
+ A repository that declares a `brief` key in its manifest gets the packet injected as context
89
+ before every prompt: `simt agent-hooks install` writes a `UserPromptSubmit` hook into Claude
90
+ Code's and Codex's own config, and `simt agent-hook prompt-submit --harness <id>` answers in
91
+ that harness's dialect with `hookSpecificOutput.additionalContext`. It never decides and never
92
+ exits 2 — no prompt text, no opt-in, a cold index or an assembly error all print why on stderr
93
+ and exit 0. The injection is capped at 2048 bytes; `brief.bytes` may lower that and may not
94
+ raise it. Cursor and Gemini CLI are not in the table: Cursor's prompt event can only block a
95
+ prompt, and Gemini CLI's replacement is not in the reader table. The pre-tool path pays nothing
96
+ for this — the repository is reached through a dynamic import only a prompt event opens. MCP
97
+ gains a `brief` tool so a client can pull the same packet, assembled by the same code as the
98
+ command.
99
+
100
+ ### A brief can cite a code graph it did not build
101
+
102
+ A repository may declare a `federation` block in `simt.json` naming external code-graph
103
+ servers, each with the command that starts it and, optionally, the MCP tool to ask, the
104
+ argument the question goes in, the languages it covers and the timeout to wait. `simt brief`
105
+ and the MCP `brief` tool then ask each declared server one structural question for the task
106
+ and add the answer to a `FEDERATION` section that names its source; a `covers <languages>`
107
+ line records what a server claims without yet skipping the index's own extraction of those
108
+ languages. The list is the repository's own committed declaration, the same trust model as
109
+ `gates.commands`, and nothing is started that the manifest did not name. A malformed entry, a
110
+ spawn failure, a protocol error or a timeout all become a caution and the brief still exits
111
+ `0`; a server that never answers is bounded by its own per-server timeout. MCP also gains a
112
+ `federation_query` tool, which asks a named server (or every declared one) one structural
113
+ question on demand and returns the answer with its source; like the brief's fan-out it goes
114
+ only to the tool and argument the manifest declared. The packet delivered at prompt submit
115
+ does not federate — starting someone else's process is not a wait a 300 ms submit may take.
116
+
117
+ ## [0.3.1] — 2026-10-18
118
+
119
+ ### Who a change reaches
120
+
121
+ `simt impact` takes a tracked path or the name of one export. It lists the files that import it, the tests of that closure, the decisions and rules that govern the file, and the last matching CODEOWNERS line. In a workspace it also lists another repository that references an OpenAPI document or a JSON Schema file this change touches. Each list stops at 64 (ADR-096).
122
+
123
+ ### A gate report keeps the failures and counts the passes
124
+
125
+ `simt gate` compacts a report it knows how to read: TAP, JUnit XML, pytest's junit file, vitest or jest JSON, and `go test -json`. Failures come first, with the name, the assertion and the location. Passing tests are a count. The raw log path is printed. Anything else is printed unchanged (ADR-095).
126
+
127
+ ### A change runs the tests that import it
128
+
129
+ `simt gate` selects the test files that import a changed file, directly or through other files, and runs only those with the package's own runner. Paths name the change. `--changed` reads the diff. A clean diff runs nothing. Changing `src/resolve/resolve.mjs` in this checkout selects 51 files, the hand-built list, in about 40 ms. The bar is 5 seconds (ADR-094).
130
+
131
+ ### what governs a file is the decision, rule, skill, gate or lesson that names it
132
+
133
+ `simt why` reads an Affects line as the tokens in backticks, including a line the paragraph wraps onto. A token that is a command, a path, or a glob is an edge. A token that is none of those is printed as `UNRESOLVED-AFFECTS`. Rules, skills, gates and lessons contribute the path lists they already publish. At `4c27514` every one of the sixteen Affects tokens resolves or is reported, and ADR-017 is the only record that names the dispatcher (ADR-093).
134
+
135
+ ### The tests of a file are its importers, its conventional neighbour, and its coverage
136
+
137
+ `simt tests` lists the tests that exercise a file. An import counts, including one whose specifier is on the next line and a dynamic `import()`. So does the conventional source beside the test, and a coverage record that names both sides. Files that only share commits are a separate list, added with `--cochange`. On 30 hand-labelled files in this checkout every predicted test is in the label. The bar is 0.8 (ADR-092).
138
+
139
+ ### The map ranks the files a task is likely to touch
140
+
141
+ `simt map` orders the index by the task's words and by the import and call edges around them. It renders paths, exported names, or signatures, inside a byte budget. `simt bench report` prints recall@10: the mean fraction of a mined task's gold files that land in the top 10. On the 20 mined tasks measured here that figure is 55.6%. The bar is 60% (ADR-091).
142
+
143
+ ### The index names the exports and the imports
144
+
145
+ `simt index` fills symbols and import edges from the blob it already hashes. The built-in extractors are line-oriented, for the languages a map needs, and on the labelled fixtures they recall at least 90% of the exported names for TypeScript, Kotlin, Python and Go. A structural parser is a separate package named by `index.parsers`; with that key absent, nothing is loaded. It writes cache rows and does not edit the repository. A live comparison against tree-sitter is unmeasured (ADR-090).
146
+
147
+ ### The local index is a cache of git blobs
148
+
149
+ `simt index` rebuilds `.simt-dev/index.sqlite` from `git ls-files`. A blob that has not changed is not read again, and the same blobs produce the same rows. When this Node cannot open `node:sqlite` with FTS5, the same rows are written to `.simt-dev/index.jsonl` instead (ADR-089).
150
+
151
+ ### A marked line is enforced by a checker
152
+
153
+ A rule line may name a checker with `simt-check`. The projection keeps `Enforced:` and the checker's name, and `simt check` runs the checker. The file-length line is `max-file-lines`: past 400 lines warns, past 1000 fails, and a path is exempt only when `limits.fileLines.generated` names it. A path under `node_modules` is not counted: a committed dependency is not a file this repository wrote, and counting it failed every install of this package. A file-length warning and a checker that is not built yet are reported and do not fail `check` or `sync`. `import-direction` stays in the prose until the module graph exists. Probe compliance is unmeasured (ADR-088).
154
+
155
+ ### A run is evidence for one tree
156
+
157
+ `simt evidence` prints the runs recorded against the tree on disk. A gate the dispatcher runs appends a line: the command, the exit, a short summary, and a digest of the output. Editing any file changes the tree, so that line no longer applies. `simt evidence check` warns when a commit message says the tests passed and this tree has no passing line, and fails the commit when `gates.evidence` is `block`. `simt hooks install --yes` writes the commit-msg shim only when that setting is present (ADR-087).
158
+
159
+ ### A workspace carries its repeated rules once
160
+
161
+ `simt shared plan` names the rules every repository in a workspace renders with the same bytes, and where each harness would load that copy. `simt shared install --yes` writes the copy into the user-level file the harness actually reads, and records the ids on each repository's manifest under `shared`. The next `simt sync` drops those rules from the region and names them, with the command that shows each one. `simt doctor` says when the copy is missing or stale, and does not fail the repository for it. The 30 KB estate bar and the bench comparison are unmeasured (ADR-084).
162
+
163
+ ### The region ends with the names of what it kept out
164
+
165
+ The generated region ends with a `## Disclosure` section: one line per scoped profile, with the patterns and the files it moved to, and one line per installed skill, with its name and the description that says when to open it. The skill body stays in its file. A surface that cannot narrow a profile still carries that profile in the region (ADR-085).
166
+
167
+ ### The stable prefix comes first
168
+
169
+ Shipped rules lead the region, and the command card follows them, so an edit this repository makes changes only the tail. `simt sync --yes` writes `simt-dev.lock.json` with an input digest and an output digest. `simt check --frozen` fails when the output moves and the inputs did not, and names a stale lock separately (ADR-086).
170
+
171
+ ### Kernel mode packs to the budget the repository declared
172
+
173
+ `mode: kernel` reads `budget.bytes`, holds back a reserve for the files that load beside the region, and drops rules least-valuable-first until the region fits. Every cut rule is named, with the command that shows it. `full` mode cuts nothing. A repository whose hard rules already exceed the budget is told so, and those rules stay (ADR-083).
174
+
175
+ ### Vulnerability reports
176
+
177
+ `SECURITY.md` names the two places a report goes: a GitHub issue on this repository, or `security@simt.space`.
178
+
9
179
  ## [0.3.0] — 2026-10-17
10
180
 
11
181
  ### The rules and the decisions are readable as MCP resources
@@ -563,6 +733,8 @@ never ran `simt hooks install` again will find nothing until the dependency is r
563
733
  and `simt hooks install --yes` is re-run. That is a real upgrade step and it is called out
564
734
  here rather than discovered.
565
735
 
736
+ [0.4.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.4.0
737
+ [0.3.1]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.1
566
738
  [0.3.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.0
567
739
  [0.2.2]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.2.2
568
740
  [0.2.1]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.2.1
@@ -0,0 +1,214 @@
1
+ Metadata-Version: 2.4
2
+ Name: simt-dev
3
+ Version: 0.4.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
+ simt init # adopt or scaffold; prints a plan; --yes writes
57
+ simt doctor # what this repo is, and whether its config is healthy
58
+ simt check # projection drift, the manifest, and declared checkers
59
+ simt sync --yes # regenerate the projection
60
+ simt upgrade --yes # move every pin of this tool to this version
61
+
62
+ simt rules why ADR-042 # the decision behind a rule, and what was rejected
63
+ simt skills brief --task # a short brief for one task
64
+ simt tokens # bytes a reader loads at session start
65
+ simt shared plan # rules a workspace repeats, and what carrying them once saves
66
+ simt harness loaders # what each harness loads, and what its cap drops
67
+
68
+ simt hooks install --yes # the git dispatcher, for gates this repo can run
69
+ simt agent-hooks install --yes # the same policy before a tool call
70
+ simt evidence # runs recorded against this tree
71
+ simt index # files, exports and imports, from git blob hashes
72
+ simt plan next # the next tracker row that is ready
73
+
74
+ simt bench report # resolved rate, quality, cost, across arms
75
+ simt compare # every sibling checkout that has adopted
76
+ simt mcp # the read-only surface, over stdio
77
+ ```
78
+
79
+ `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`
80
+ and `plan done` print a plan and write nothing without `--yes`. None of them commit
81
+ or push. `simt index` writes its cache without asking: the file is gitignored and
82
+ `git ls-files` can rebuild it.
83
+
84
+ `check` runs the checkers a rule names. A marked line leaves the projection as
85
+ `Enforced:` and the checker's name. The file-length line warns past 400 lines and
86
+ fails past 1000. `simt evidence check` warns when a commit message claims a passing
87
+ run this tree does not have, and the commit fails when `gates.evidence` is `block`.
88
+ The commit-msg hook is installed only when that setting is `warn` or `block`.
89
+
90
+ ## Where the plan finishes
91
+
92
+ The work above is the part that runs. The plan still adds the rest of the loop, in
93
+ this order of purpose:
94
+
95
+ - **Gates on the change.** A check selects the tests that cover the diff, and the
96
+ tool's own gate output is shortened without dropping a failure line.
97
+ - **Answers instead of exploration.** A ranked map of the repository, the impact of
98
+ a file or a symbol, the tests that cover a change, and the decisions, rules and
99
+ skills that govern a path. An external code graph can answer for a language it
100
+ covers, and the answer names that source.
101
+ - **A brief for the task in front of the agent.** At most 2 KB, pulled at submit or
102
+ pushed by a hook, built from the map, the tests and the governing records.
103
+ - **A memory that has to earn its place.** A lesson is a candidate when a failing run
104
+ is followed by a fix. It is recalled on a later task that looks like it, and it
105
+ expires. Variant wording of a rule ships only when the bench says it won.
106
+ - **Local models, off unless asked.** Distillation and a critic propose. They do not
107
+ write projected text. With no model configured, nothing opens a socket.
108
+ - **The small doors.** One finding code explained, a safe `doctor` fix, a one-line
109
+ status, an undo journal, a diff of every planned write, shell completions, one
110
+ ignore list for every harness plus a secret scan, a worktree per slice, a file
111
+ lease when two agents would edit the same path, and a pull-request body taken from
112
+ the evidence.
113
+
114
+ ## Install
115
+
116
+ Requires **Node >= 22.20.0**. The current published release is **0.4.0**. Pin it.
117
+ The tool writes a content digest into the files it generates, and an unpinned upgrade
118
+ changes them under you.
119
+
120
+ ```sh
121
+ npm i -D simt-dev@0.4.0
122
+
123
+ # or globally
124
+ npm i -g simt-dev@0.4.0
125
+
126
+ # or once, with no install
127
+ npx -y simt-dev@0.4.0 check
128
+ ```
129
+
130
+ ### From PyPI
131
+
132
+ The wheel carries the same bytes as the npm tarball. It does not fetch them from npm
133
+ at install time.
134
+
135
+ ```sh
136
+ pip install simt-dev
137
+
138
+ # when this machine has no node
139
+ pip install "simt-dev[node]"
140
+ ```
141
+
142
+ `simt` is the command on both channels. Node is resolved in this order, and the first
143
+ one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra, then
144
+ `node` on `PATH`.
145
+
146
+ ### From Homebrew
147
+
148
+ ```sh
149
+ brew install QuazarMedia/homebrew-tap/simt-dev
150
+ ```
151
+
152
+ The formula depends on `node`, so the command works on a machine that has never had
153
+ Node installed.
154
+
155
+ ## What it writes
156
+
157
+ | Path | What |
158
+ | --- | --- |
159
+ | `AGENTS.md` | the projection, between `<!-- simt:begin -->` and `<!-- simt:end -->`. The old `simt-dev:` markers are still read, and a region migrates on its next write |
160
+ | `simt.json` | the manifest: gates, substitutions, budget, shared rules, surfaces |
161
+ | `simt-dev.lock.json` | the digest of the inputs and the digest of the projection |
162
+ | `.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 |
163
+ | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
164
+ | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
165
+
166
+ Text outside the markers is left alone. A regeneration does not revert it.
167
+
168
+ `simt.json` also carries a `federation` block when the repository names external
169
+ code-graph servers, each with the command that starts it. A brief may then ask one of
170
+ them one structural question for a task and cite the answer's source, and the MCP
171
+ `federation_query` tool asks one on demand, naming the server it asked. The question goes
172
+ to the tool and argument the manifest declared, so no foreign tool is reachable that the
173
+ repository did not name. Nothing is started unless the manifest declared it, and a server
174
+ that does not answer costs the packet a sentence, never the packet.
175
+
176
+ These are caches, gitignored, and rebuildable. They are not repository content:
177
+
178
+ | Path | What |
179
+ | --- | --- |
180
+ | `.simt-dev/index.sqlite` | files, symbols, import edges. JSON-lines at `.simt-dev/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
181
+ | `.simt-dev/ledger.jsonl` | one line per gate the dispatcher actually ran, against one git tree |
182
+ | `.simt-dev/bench/runs/` | benchmark runs |
183
+
184
+ `simt shared install --yes` writes a user-level copy of the rules a workspace
185
+ repeats, into the file that harness documents, and records the ids on each
186
+ repository's manifest. The next `sync` drops those rules from the region and names
187
+ them.
188
+
189
+ ## How a rule is chosen
190
+
191
+ Detection reads dependency manifests, build files and CI workflows, and ranks rules
192
+ by path, keyword, name, capability and stack. The ranking is a score. A pull request
193
+ can diff it.
194
+
195
+ A repository whose ecosystem has no profile yet is still adopted: it gets the core
196
+ rules and no gates, until gate templates exist for it. A hook that would run nothing
197
+ is not installed.
198
+
199
+ Every behaviour that is a choice has a numbered record. `simt rules why <id>` is the
200
+ path from a rule you did not expect to the reason it is there.
201
+
202
+ ## Platform
203
+
204
+ **macOS and Linux.** The hooks are POSIX `sh`. There is no Windows build. `npm i` on
205
+ Windows fails with npm's `EBADPLATFORM`, which npm will not let a package explain, so
206
+ the answer is here: **use WSL2**, and the gate works inside it.
207
+
208
+ A Windows checkout without WSL2 can still read the projection. It is plain text. The
209
+ hooks and the CI gate need the POSIX host.
210
+
211
+ ## Licence
212
+
213
+ Apache-2.0. See [LICENSE](LICENSE). Report a vulnerability through
214
+ [SECURITY.md](SECURITY.md).
@@ -0,0 +1,184 @@
1
+ # simt-dev
2
+
3
+ ![simt-dev, the intelligence amplifier for coding agents, and its four claims. One: say less, always — a kernel under 2 KB whose bytes stay stable so the prompt cache survives. Two: answers over exploration — a local code graph and a short task brief. Three: enforce, don't instruct — dual gates, before a tool call and at git time. Four: close the loop — benches and memory. Beneath them, the harnesses it works across and its three channels.](https://raw.githubusercontent.com/QuazarMedia/simt-dev/main/res/59e21e6d-6bf2-4d7d-b6ea-c7349a697d11.jpg)
4
+
5
+ `simt` adopts a repository for the agents that work in it.
6
+
7
+ It reads what the repository actually runs, projects the rules that are not already
8
+ obvious into the files those agents read, and installs only the gates that repository
9
+ can run. Around that projection it keeps the bytes stable, replaces an instruction
10
+ with a check where a check can decide, answers questions about the tree from a local
11
+ index, and records whether a run still applies to the tree on disk.
12
+
13
+ The aim of the whole design is a higher share of tasks resolved, at a lower cost per
14
+ resolved task. Those targets are hypotheses. A change that touches what an agent reads
15
+ ships with a measurement, or its record says the measurement was not run. `simt rules
16
+ why ADR-NNN` prints the record, including whether it is still in force.
17
+
18
+ The default path is deterministic: no model, no network, no runtime dependencies.
19
+ Anything that needs a parser grammar, a local model, or another server is a separate
20
+ package, off until the repository names it, and it proposes rows or text for a person
21
+ to merge. It does not write the projection.
22
+
23
+ ## Today
24
+
25
+ ```sh
26
+ simt init # adopt or scaffold; prints a plan; --yes writes
27
+ simt doctor # what this repo is, and whether its config is healthy
28
+ simt check # projection drift, the manifest, and declared checkers
29
+ simt sync --yes # regenerate the projection
30
+ simt upgrade --yes # move every pin of this tool to this version
31
+
32
+ simt rules why ADR-042 # the decision behind a rule, and what was rejected
33
+ simt skills brief --task # a short brief for one task
34
+ simt tokens # bytes a reader loads at session start
35
+ simt shared plan # rules a workspace repeats, and what carrying them once saves
36
+ simt harness loaders # what each harness loads, and what its cap drops
37
+
38
+ simt hooks install --yes # the git dispatcher, for gates this repo can run
39
+ simt agent-hooks install --yes # the same policy before a tool call
40
+ simt evidence # runs recorded against this tree
41
+ simt index # files, exports and imports, from git blob hashes
42
+ simt plan next # the next tracker row that is ready
43
+
44
+ simt bench report # resolved rate, quality, cost, across arms
45
+ simt compare # every sibling checkout that has adopted
46
+ simt mcp # the read-only surface, over stdio
47
+ ```
48
+
49
+ `init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`
50
+ and `plan done` print a plan and write nothing without `--yes`. None of them commit
51
+ or push. `simt index` writes its cache without asking: the file is gitignored and
52
+ `git ls-files` can rebuild it.
53
+
54
+ `check` runs the checkers a rule names. A marked line leaves the projection as
55
+ `Enforced:` and the checker's name. The file-length line warns past 400 lines and
56
+ fails past 1000. `simt evidence check` warns when a commit message claims a passing
57
+ run this tree does not have, and the commit fails when `gates.evidence` is `block`.
58
+ The commit-msg hook is installed only when that setting is `warn` or `block`.
59
+
60
+ ## Where the plan finishes
61
+
62
+ The work above is the part that runs. The plan still adds the rest of the loop, in
63
+ this order of purpose:
64
+
65
+ - **Gates on the change.** A check selects the tests that cover the diff, and the
66
+ tool's own gate output is shortened without dropping a failure line.
67
+ - **Answers instead of exploration.** A ranked map of the repository, the impact of
68
+ a file or a symbol, the tests that cover a change, and the decisions, rules and
69
+ skills that govern a path. An external code graph can answer for a language it
70
+ covers, and the answer names that source.
71
+ - **A brief for the task in front of the agent.** At most 2 KB, pulled at submit or
72
+ pushed by a hook, built from the map, the tests and the governing records.
73
+ - **A memory that has to earn its place.** A lesson is a candidate when a failing run
74
+ is followed by a fix. It is recalled on a later task that looks like it, and it
75
+ expires. Variant wording of a rule ships only when the bench says it won.
76
+ - **Local models, off unless asked.** Distillation and a critic propose. They do not
77
+ write projected text. With no model configured, nothing opens a socket.
78
+ - **The small doors.** One finding code explained, a safe `doctor` fix, a one-line
79
+ status, an undo journal, a diff of every planned write, shell completions, one
80
+ ignore list for every harness plus a secret scan, a worktree per slice, a file
81
+ lease when two agents would edit the same path, and a pull-request body taken from
82
+ the evidence.
83
+
84
+ ## Install
85
+
86
+ Requires **Node >= 22.20.0**. The current published release is **0.4.0**. Pin it.
87
+ The tool writes a content digest into the files it generates, and an unpinned upgrade
88
+ changes them under you.
89
+
90
+ ```sh
91
+ npm i -D simt-dev@0.4.0
92
+
93
+ # or globally
94
+ npm i -g simt-dev@0.4.0
95
+
96
+ # or once, with no install
97
+ npx -y simt-dev@0.4.0 check
98
+ ```
99
+
100
+ ### From PyPI
101
+
102
+ The wheel carries the same bytes as the npm tarball. It does not fetch them from npm
103
+ at install time.
104
+
105
+ ```sh
106
+ pip install simt-dev
107
+
108
+ # when this machine has no node
109
+ pip install "simt-dev[node]"
110
+ ```
111
+
112
+ `simt` is the command on both channels. Node is resolved in this order, and the first
113
+ one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra, then
114
+ `node` on `PATH`.
115
+
116
+ ### From Homebrew
117
+
118
+ ```sh
119
+ brew install QuazarMedia/homebrew-tap/simt-dev
120
+ ```
121
+
122
+ The formula depends on `node`, so the command works on a machine that has never had
123
+ Node installed.
124
+
125
+ ## What it writes
126
+
127
+ | Path | What |
128
+ | --- | --- |
129
+ | `AGENTS.md` | the projection, between `<!-- simt:begin -->` and `<!-- simt:end -->`. The old `simt-dev:` markers are still read, and a region migrates on its next write |
130
+ | `simt.json` | the manifest: gates, substitutions, budget, shared rules, surfaces |
131
+ | `simt-dev.lock.json` | the digest of the inputs and the digest of the projection |
132
+ | `.cursor/rules/*.mdc`, `.claude/rules/*.md`, `.agents/rules/*.md`, `.github/instructions/*.instructions.md` | one file per rule, and only for a harness that reads that directory |
133
+ | `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
134
+ | `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
135
+
136
+ Text outside the markers is left alone. A regeneration does not revert it.
137
+
138
+ `simt.json` also carries a `federation` block when the repository names external
139
+ code-graph servers, each with the command that starts it. A brief may then ask one of
140
+ them one structural question for a task and cite the answer's source, and the MCP
141
+ `federation_query` tool asks one on demand, naming the server it asked. The question goes
142
+ to the tool and argument the manifest declared, so no foreign tool is reachable that the
143
+ repository did not name. Nothing is started unless the manifest declared it, and a server
144
+ that does not answer costs the packet a sentence, never the packet.
145
+
146
+ These are caches, gitignored, and rebuildable. They are not repository content:
147
+
148
+ | Path | What |
149
+ | --- | --- |
150
+ | `.simt-dev/index.sqlite` | files, symbols, import edges. JSON-lines at `.simt-dev/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
151
+ | `.simt-dev/ledger.jsonl` | one line per gate the dispatcher actually ran, against one git tree |
152
+ | `.simt-dev/bench/runs/` | benchmark runs |
153
+
154
+ `simt shared install --yes` writes a user-level copy of the rules a workspace
155
+ repeats, into the file that harness documents, and records the ids on each
156
+ repository's manifest. The next `sync` drops those rules from the region and names
157
+ them.
158
+
159
+ ## How a rule is chosen
160
+
161
+ Detection reads dependency manifests, build files and CI workflows, and ranks rules
162
+ by path, keyword, name, capability and stack. The ranking is a score. A pull request
163
+ can diff it.
164
+
165
+ A repository whose ecosystem has no profile yet is still adopted: it gets the core
166
+ rules and no gates, until gate templates exist for it. A hook that would run nothing
167
+ is not installed.
168
+
169
+ Every behaviour that is a choice has a numbered record. `simt rules why <id>` is the
170
+ path from a rule you did not expect to the reason it is there.
171
+
172
+ ## Platform
173
+
174
+ **macOS and Linux.** The hooks are POSIX `sh`. There is no Windows build. `npm i` on
175
+ Windows fails with npm's `EBADPLATFORM`, which npm will not let a package explain, so
176
+ the answer is here: **use WSL2**, and the gate works inside it.
177
+
178
+ A Windows checkout without WSL2 can still read the projection. It is plain text. The
179
+ hooks and the CI gate need the POSIX host.
180
+
181
+ ## Licence
182
+
183
+ Apache-2.0. See [LICENSE](LICENSE). Report a vulnerability through
184
+ [SECURITY.md](SECURITY.md).
@@ -1,6 +1,6 @@
1
1
  # ADR-073 — A kernel is a smaller projection the repository asks for, not one it is given
2
2
 
3
- Status: **accepted** · 2026-10-14 · filed as S38 (R07)
3
+ Status: **accepted** · 2026-10-14 · filed as S38 (R07) · ruling 6 narrowed by ADR-084
4
4
  **Affects:** `src/projection/manifest.mjs`, `src/projection/rules.mjs`, `src/measure/context.mjs`,
5
5
  `rules/core.md`, `rules/stacks/*.md`, `test/kernel.test.mjs`
6
6
 
@@ -1,6 +1,6 @@
1
1
  # ADR-077 — The command card leads the region, and is derived from committed evidence only
2
2
 
3
- Status: **accepted** · 2026-10-16 · filed as R10 (plan 0003)
3
+ Status: **accepted** · 2026-10-16 · filed as R10 (plan 0003) · ruling 1 narrowed by ADR-086
4
4
  **Affects:** `src/kernel/card.mjs`, `src/projection/rules.mjs`, `rules/core.md` (indirectly, as
5
5
  the region's first bytes), `test/card.test.mjs`
6
6