simt-dev 0.6.0__tar.gz → 0.6.3__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.
- {simt_dev-0.6.0 → simt_dev-0.6.3}/.gitignore +11 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/CHANGELOG.md +71 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/PKG-INFO +45 -16
- {simt_dev-0.6.0 → simt_dev-0.6.3}/README.md +44 -15
- {simt_dev-0.6.0 → simt_dev-0.6.3}/bin/simt.mjs +19 -6
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-098-the-fourth-channel-is-one-file-and-it-needs-no-toolchain.md +1 -1
- simt_dev-0.6.3/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +79 -0
- simt_dev-0.6.3/docs/decisions/ADR-100-a-staged-diff-is-the-last-gate-before-history-and-it-runs-inside-the-tool.md +94 -0
- simt_dev-0.6.3/docs/decisions/ADR-101-a-file-lease-belongs-to-one-session-and-the-pre-edit-hook-refuses-another.md +95 -0
- simt_dev-0.6.3/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +49 -0
- simt_dev-0.6.3/docs/decisions/ADR-103-co-projected-duplicates-merge-down.md +74 -0
- simt_dev-0.6.3/docs/decisions/ADR-104-the-pre-tool-use-policy-reads-the-command-the-way-a-shell-reads-it.md +76 -0
- simt_dev-0.6.3/docs/decisions/ADR-105-the-json-ceiling-shrinks-arrays-and-never-cuts-bytes.md +44 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/README.md +44 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/package.json +1 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/mdc/preview-postflight.mdc +5 -6
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/android.md +7 -8
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/cloudflare-workers.md +1 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/container.md +2 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/jvm.md +1 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/react-native.md +3 -5
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/react-web.md +9 -9
- simt_dev-0.6.3/src/agenthooks/decide.mjs +214 -0
- simt_dev-0.6.3/src/agenthooks/policy.mjs +162 -0
- simt_dev-0.6.3/src/agenthooks/shell.mjs +523 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/argv.mjs +54 -9
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/ci/workflow.mjs +7 -5
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/agenthook.mjs +25 -3
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/ci.mjs +28 -3
- simt_dev-0.6.3/src/commands/completions.mjs +27 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/decide.mjs +14 -1
- simt_dev-0.6.3/src/commands/doctor.mjs +367 -0
- simt_dev-0.6.3/src/commands/explain.mjs +52 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/help.mjs +66 -17
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/hooks.mjs +208 -60
- simt_dev-0.6.3/src/commands/ignore.mjs +152 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/index.mjs +54 -100
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/init.mjs +82 -12
- simt_dev-0.6.3/src/commands/lease.mjs +136 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/lessons.mjs +12 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/mcp.mjs +2 -2
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/pack.mjs +9 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/plan.mjs +13 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/plugin.mjs +16 -1
- simt_dev-0.6.3/src/commands/prbody.mjs +45 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/repoindex.mjs +3 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/rules.mjs +145 -105
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/shared.mjs +36 -5
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/skills.mjs +293 -205
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/skillsinstall.mjs +100 -30
- simt_dev-0.6.3/src/commands/slice.mjs +353 -0
- simt_dev-0.6.3/src/commands/status.mjs +62 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/sync.mjs +110 -15
- simt_dev-0.6.3/src/commands/undo.mjs +106 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/upgrade.mjs +70 -8
- simt_dev-0.6.3/src/completions.mjs +191 -0
- simt_dev-0.6.3/src/diff.mjs +254 -0
- simt_dev-0.6.3/src/explain.mjs +258 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/federation/config.mjs +44 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/graph/load.mjs +14 -5
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/dispatcher.mjs +110 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/gates.mjs +14 -3
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/resolve.mjs +14 -0
- simt_dev-0.6.3/src/ignore.mjs +133 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/persist.mjs +66 -9
- simt_dev-0.6.3/src/journal.mjs +326 -0
- simt_dev-0.6.3/src/lease.mjs +113 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/mcp/server.mjs +15 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/mcp/tools.mjs +296 -256
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/memory/decide.mjs +6 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/memory/lessons.mjs +12 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/output/index.mjs +82 -12
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/package-version.mjs +49 -1
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/packs/manage.mjs +13 -4
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/plan/index.mjs +6 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/plugins.mjs +27 -6
- simt_dev-0.6.3/src/prbody.mjs +251 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/manifest.mjs +13 -2
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/shared.mjs +4 -1
- simt_dev-0.6.3/src/secrets.mjs +231 -0
- simt_dev-0.6.3/src/status.mjs +152 -0
- simt_dev-0.6.0/src/agenthooks/decide.mjs +0 -123
- simt_dev-0.6.0/src/agenthooks/policy.mjs +0 -86
- {simt_dev-0.6.0 → simt_dev-0.6.3}/LICENSE +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-001-push-requires-approval.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-002-refactor-blast-radius.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-003-test-breadth.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-004-hook-owns-format.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-005-file-length.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-006-coverage-bar.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-007-section-skeleton.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-008-verdict-vocabulary.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-009-skill-layout.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-010-runner-invocation.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-011-windows-support.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-012-drop-windows-support.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-014-workspace-is-configuration.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-021-one-surface-per-repo.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-044-compatibility-is-not-evidence.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-046-one-rule-one-copy.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-049-a-ruling-that-a-later-record-moved-says-so-where-it-is-printed.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-050-a-byte-count-is-not-a-region-and-updated-is-not-a-change-of-rules.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-051-a-pointer-is-the-readers-only-route-so-it-is-not-a-convenience.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-060-a-repository-with-nothing-to-run-is-adopted-and-says-so.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-066-a-monorepo-projects-once-per-package.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-067-which-harnesses-read-agents-md-is-a-column.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-069-the-conformance-lint-checks-the-published-specification.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-075-nothing-leaves-the-machine.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-080-the-tools-own-names-are-not-repositories-and-neither-reader-decides-by-shape.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-093-why-names-what-governs-a-file.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-095-gate-output-keeps-the-failures.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-096-impact-names-who-a-change-reaches.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/docs/decisions/ADR-097-the-channels-publish-by-hand-and-the-version-rides-in-as-an-input.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/pyproject.toml +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/python/simt_dev/__init__.py +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/python/simt_dev/cli.py +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/core.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/mdc/intake-questions.mdc +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/mdc/slice-commit.mdc +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/mdc/test-gate.mdc +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/connectiq.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/dart.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/deno.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/dotnet.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/elixir.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/go.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/node.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/python.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/ruby.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/rust.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/swift.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/typescript.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/rules/stacks/uv.md +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/advice/advice.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/agenthooks/prompt.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/agenthooks/render.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/ablate.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/adapters.json +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/grade.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/mine.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/probes.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/report.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/run.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/tasks.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/bench/variants.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/brief/assemble.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/brief/kind.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/brief/packet.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/ci/dependabot.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/bench.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/brief.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/compare.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/distill.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/evidence.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/gate.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/graph.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/harness.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/impact.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/local.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/map.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/review.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/skillscompile.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/tests.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/tokens.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/commands/why.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/compare/discover.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/compare/hooksstate.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/compare/learn.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/compare/row.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/decisions/index.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/distill/distill.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/distill/engine.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/distribute/release.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/federation/client.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/federation/query.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/graph/compile.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/graph/spec.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/graph/speccheck.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/capability.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/shim.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/hooks/where.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/identity.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/compact.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/extract.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/gate.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/govern.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/impact.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/map.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/store.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/index/tests.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/kernel/budget.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/kernel/card.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/kernel/checks.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/kernel/inferability.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/kernel/variants.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/ledger/index.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/local/client.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/local/config.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/locate.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/mcp/prompts.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/mcp/resources.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/mcp/schema.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/measure/context.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/measure/loaderView.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/measure/session.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/monorepo.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/name.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/packs.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/plan/template.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/baselines.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/conflicts.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/disclosure.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/loaders.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/lock.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/markers.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/mdc.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/project.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/rules.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/surfaces.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/projection/targets.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/body.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/eval.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/fingerprint.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/near.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/resolve.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/resolve/source.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/review/critic.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/toolchain.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/toolwords.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/tsconfig.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/upgrade/plan.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/src/workspace.mjs +0 -0
- {simt_dev-0.6.0 → simt_dev-0.6.3}/templates/plan/tracker.json +0 -0
|
@@ -20,3 +20,14 @@ dist/
|
|
|
20
20
|
.simt/gate/
|
|
21
21
|
.simt/distilled/
|
|
22
22
|
.simt/reviews/
|
|
23
|
+
|
|
24
|
+
# Write journal for `simt undo`. Local state, never shared.
|
|
25
|
+
.simt/journal/
|
|
26
|
+
|
|
27
|
+
# Gate state for `simt status --line`. Local state, never shared: it names the
|
|
28
|
+
# commit the last `check` measured, which is meaningless anywhere else.
|
|
29
|
+
.simt/check.json
|
|
30
|
+
|
|
31
|
+
# Worktrees `simt slice start` creates, one branch per row. Local state: the branch
|
|
32
|
+
# records where the work is, and the directory that holds it is not part of any commit.
|
|
33
|
+
.simt/worktrees/
|
|
@@ -6,6 +6,77 @@ All notable changes to this package are recorded here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.6.3] — 2026-10-29
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
`simt explain <CODE>` names what a `check` finding means, the decision behind
|
|
14
|
+
it, how to fix it, and a concrete trigger — one table row per finding code, so
|
|
15
|
+
every code `check` can emit has an entry.
|
|
16
|
+
|
|
17
|
+
`simt doctor --fix` applies only the remedies flagged safe (local, idempotent,
|
|
18
|
+
journaled) and lists the rest; a fixture with three safe and two unsafe findings
|
|
19
|
+
fixes exactly three.
|
|
20
|
+
|
|
21
|
+
`simt status --line` prints the gate state from the last `check` in under
|
|
22
|
+
50 ms from cache — `simt PASS ✓rules ✓hooks 3/3gates` — for shell prompts, tmux
|
|
23
|
+
and agent status lines.
|
|
24
|
+
|
|
25
|
+
Every write records `{path, beforeDigest, afterDigest, beforeBytes}` in
|
|
26
|
+
`.simt/journal/`, and `simt undo` restores the last set when every file in it
|
|
27
|
+
is untouched since.
|
|
28
|
+
|
|
29
|
+
`--diff` on every writer prints a unified diff of the plan next to the report,
|
|
30
|
+
changing nothing about what the run writes.
|
|
31
|
+
|
|
32
|
+
`simt completions <bash|zsh|fish>` prints a completion script generated from the
|
|
33
|
+
command registry, so the three shells complete exactly the commands the binary
|
|
34
|
+
dispatches.
|
|
35
|
+
|
|
36
|
+
One ignore list (`.simtignore`) renders `.cursorignore`, `.aiderignore`,
|
|
37
|
+
`.geminiignore` and Claude `permissions.deny`, and a zero-dependency
|
|
38
|
+
staged-diff secret scan (vendor patterns plus Shannon entropy over added lines
|
|
39
|
+
only) blocks a commit carrying a probable secret without printing the bytes.
|
|
40
|
+
|
|
41
|
+
`simt slice start <id>` isolates the work in a linked worktree on branch
|
|
42
|
+
`slice/<id>` with the brief preloaded and flips the tracker row In progress;
|
|
43
|
+
`simt slice finish <id>` runs the declared gates, commits a Conventional
|
|
44
|
+
subject from the row title, and records the SHA and test command on the row.
|
|
45
|
+
|
|
46
|
+
`simt lease <paths> --session <id>` claims files until a TTL in
|
|
47
|
+
`.simt/leases.json`, and the pre-edit hook denies an edit leased by another
|
|
48
|
+
session (ADR-101).
|
|
49
|
+
|
|
50
|
+
`simt pr-body [--base <ref>]` assembles the pull request body from the evidence
|
|
51
|
+
ledger, the decision records the diff touches, the gate state from the last
|
|
52
|
+
check, and the residual risk in ADR-008 vocabulary. It is also exposed as the
|
|
53
|
+
`pr_body` MCP tool; the two longest tool descriptions were shortened to hold
|
|
54
|
+
the 2 KB `tools/list` budget.
|
|
55
|
+
|
|
56
|
+
## [0.6.2] — 2026-10-27
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
The v0.6.1 tag run failed its own tests step: two decision-corpus lists in
|
|
61
|
+
`test/rules.test.mjs` were not moved with ADR-099 (the partial-supersession
|
|
62
|
+
shapes and the leaking-paths count, both designed to move with the corpus).
|
|
63
|
+
Same product as v0.6.1; this tag exists so the release automation is proven by
|
|
64
|
+
a green run rather than described by a red one.
|
|
65
|
+
|
|
66
|
+
## [0.6.1] — 2026-10-27 (tagged, never published to npm)
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
|
|
70
|
+
The release automation, which the v0.6.0 tag proved broken in two places. The
|
|
71
|
+
tag workflow compared CI-built binaries against locally-built committed
|
|
72
|
+
checksums, but the build is deterministic per host family, not across them —
|
|
73
|
+
the check could never pass, and darwin binaries cannot be finished on ubuntu
|
|
74
|
+
runners for lack of `codesign` anyway. Each target now builds on its native
|
|
75
|
+
runner, the release verifies the served bytes equal the built bytes, and a
|
|
76
|
+
`sync-formula` job re-renders the committed formula from the served bytes
|
|
77
|
+
(ADR-099). The formula description no longer starts with an article, which is
|
|
78
|
+
what failed the Homebrew channel's `brew style` on v0.6.0. No product change.
|
|
79
|
+
|
|
9
80
|
## [0.6.0] — 2026-10-27
|
|
10
81
|
|
|
11
82
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: simt-dev
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.3
|
|
4
4
|
Summary: An intelligence amplifier for AI coding agents: rules and dual gates adopted by one command, plus local retrieval, task briefs, benches and repo memory — deterministic by default, with local-model adapters that propose and never select.
|
|
5
5
|
Project-URL: Homepage, https://github.com/QuazarMedia/simt-dev
|
|
6
6
|
Project-URL: Repository, https://github.com/QuazarMedia/simt-dev
|
|
@@ -56,18 +56,18 @@ to merge. It does not write the projection.
|
|
|
56
56
|
## Install
|
|
57
57
|
|
|
58
58
|
Requires **Node >= 22.20.0** for the npm and PyPI channels; the release binary carries
|
|
59
|
-
its own runtime.
|
|
59
|
+
its own runtime. Pin the release you install. The tool writes a
|
|
60
60
|
content digest into the files it generates, and an unpinned upgrade changes them under
|
|
61
61
|
you.
|
|
62
62
|
|
|
63
63
|
```sh
|
|
64
|
-
npm i -D simt-dev
|
|
64
|
+
npm i -D simt-dev
|
|
65
65
|
|
|
66
66
|
# or globally
|
|
67
|
-
npm i -g simt-dev
|
|
67
|
+
npm i -g simt-dev
|
|
68
68
|
|
|
69
69
|
# or once, with no install
|
|
70
|
-
npx -y simt-dev
|
|
70
|
+
npx -y simt-dev check
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### From PyPI
|
|
@@ -98,7 +98,7 @@ runtime: the command works with no Node installed.
|
|
|
98
98
|
### As a single-file binary
|
|
99
99
|
|
|
100
100
|
Each release carries one executable per platform — macOS arm64 and x64, Linux x64 —
|
|
101
|
-
beside its `.sha256`.
|
|
101
|
+
beside its `.sha256`. Pin the release you download,
|
|
102
102
|
and run this from the repository's top level:
|
|
103
103
|
|
|
104
104
|
```sh
|
|
@@ -115,7 +115,7 @@ published `.sha256` before running anything.
|
|
|
115
115
|
```sh
|
|
116
116
|
# Adopt, inspect, and maintain a repository
|
|
117
117
|
simt init # adopt or scaffold; prints a plan; --yes writes
|
|
118
|
-
simt doctor
|
|
118
|
+
simt doctor [--fix] # stack, facts, evidence, and config health (--fix applies safe remedies, journaled)
|
|
119
119
|
simt check [--frozen] # projection drift, manifest, lock, and declared checkers
|
|
120
120
|
simt sync [--explain] --yes # regenerate the projection
|
|
121
121
|
simt upgrade --yes # move every consumer in the workspace to this SHA
|
|
@@ -133,6 +133,7 @@ simt why [path] # ADRs, rules, skills, gates, and lessons go
|
|
|
133
133
|
simt rules list [--root <path>] # rule catalogue and what applies to a repository
|
|
134
134
|
simt rules show <id> # read one rule body (including rules deferred in kernel mode)
|
|
135
135
|
simt rules why <id|ADR-NNN> [--all] # the decision that settled a rule, and whether it still stands
|
|
136
|
+
simt explain <CODE> [--json] # what a check finding means, why it is reported, and how to fix it
|
|
136
137
|
simt decide "<title>" --yes # scaffold the next ADR with structured simt-affects / simt-supersedes
|
|
137
138
|
simt lessons list # fail-to-fix, revert, review-block, and hook-denial candidates
|
|
138
139
|
simt lessons review <id> --yes # promote a candidate to docs/lessons/NNNN-<slug>.md
|
|
@@ -155,11 +156,20 @@ simt agent-hooks status # what each harness will run, and whether Co
|
|
|
155
156
|
simt agent-hook <event> --harness # evaluate pre-tool-use, post-tool-use, or prompt-submit
|
|
156
157
|
simt evidence # gate and test runs recorded against the current git tree
|
|
157
158
|
simt evidence check <msg-file> # verify a commit message does not claim unrecorded passing runs
|
|
159
|
+
simt pr-body [--base <ref>] # a PR body: the evidence block for this tree, changed
|
|
160
|
+
# decisions, gate state, and residual risk in ADR-008 vocabulary
|
|
158
161
|
|
|
159
162
|
# Plans, context metering, workspace learning, benchmarks, local models, and MCP
|
|
160
163
|
simt plan status # count queued, in-progress, complete, and accepted tracker rows
|
|
161
164
|
simt plan next [<id>] # print the next ready slice section (~1 KB)
|
|
162
165
|
simt plan done <id> [<sha>] --yes # mark a tracker row complete with its commit SHA and test command
|
|
166
|
+
simt status --line # one-line gate state from the last check, for prompts (< 50 ms)
|
|
167
|
+
simt undo --yes # restore the last journaled set of writes, if untouched since
|
|
168
|
+
simt slice start <id> --yes # a worktree on branch slice/<id> with the brief preloaded; row In progress
|
|
169
|
+
simt slice finish <id> --yes # run the pre-commit gates, commit a Conventional subject from the
|
|
170
|
+
# row's title, and record the SHA and --test command on the row
|
|
171
|
+
simt lease [<paths>] --session # claim files for this session (--ttl, default 1h) or list claims;
|
|
172
|
+
# the pre-edit hook refuses another session's edit until the TTL
|
|
163
173
|
simt tokens [--repos] [--session] # measure bytes loaded at session start or split a transcript
|
|
164
174
|
simt harness detect [--user] # detect configured harnesses at repo and user level
|
|
165
175
|
simt harness loaders [--table] # what each harness loads, in what order, and where its cap truncates
|
|
@@ -173,25 +183,37 @@ simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstr
|
|
|
173
183
|
simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
|
|
174
184
|
simt bench probes --yes # 12 deterministic rule-compliance probes
|
|
175
185
|
simt bench variants --yes # evaluate simt-variants slots and lock winners in simt-dev.lock.json
|
|
186
|
+
simt review [--local] # an advisory ADR-008 verdict skeleton over the staged diff
|
|
187
|
+
simt distill <skill|doc> # a budgeted proposal summary with line citations, for a person to merge
|
|
176
188
|
simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
|
|
177
189
|
simt pack lint [dir] [--require-measured] # validate a pack and state its measured ΔR
|
|
178
190
|
simt pack publish [dir] --yes # publish an npm-sourced pack (git packs name the tag-and-push)
|
|
179
|
-
simt mcp [--list] # serve the
|
|
191
|
+
simt mcp [--list] # serve the 15 read-only tools over stdio JSON-RPC
|
|
192
|
+
simt completions <bash|zsh|fish> # a completion script generated from the command registry
|
|
193
|
+
simt ignore [--yes] [--diff] # render the one .simtignore list into .cursorignore,
|
|
194
|
+
# .aiderignore, .geminiignore and Claude's permissions.deny
|
|
180
195
|
```
|
|
181
196
|
|
|
182
197
|
`init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`,
|
|
183
|
-
`skills install`, `plan done`, `lessons review`, `decide`, `
|
|
184
|
-
and the `bench` writers print
|
|
185
|
-
a plan and write nothing without `--yes`. None of them
|
|
198
|
+
`skills install`, `plan done`, `lessons review`, `decide`, `ignore`, `pack new`,
|
|
199
|
+
`pack publish`, `slice start`, `slice finish`, `lease` and the `bench` writers print
|
|
200
|
+
a plan and write nothing without `--yes`. None of them push, and only
|
|
201
|
+
`slice finish` commits — locally, through the pre-commit gates, and only what is
|
|
202
|
+
staged. `simt index`
|
|
186
203
|
writes its cache without asking: the file is gitignored and `git ls-files` can rebuild it.
|
|
187
204
|
|
|
205
|
+
Declare `secret-scan` in `gates.preCommit` to block a commit whose staged diff
|
|
206
|
+
carries a probable secret: the scan runs inside the binary (vendor patterns plus
|
|
207
|
+
Shannon entropy, over added lines only), needs no install, and its report never
|
|
208
|
+
prints the matched bytes.
|
|
209
|
+
|
|
188
210
|
`check` runs the checkers a rule names (`max-file-lines`, `forbid-regex`,
|
|
189
211
|
`forbidden-path-edit`, `required-file`), verifies structured ADR supersessions
|
|
190
212
|
(`prose-partial-supersession`), and flags expired lessons (`LESSON-EXPIRED`). A marked
|
|
191
213
|
rule line leaves the projection as `Enforced:` and the checker's name. The file-length
|
|
192
214
|
line warns past 400 lines and fails past 1000. `simt evidence check` warns when a commit
|
|
193
215
|
message claims a passing run this tree does not have, and the commit fails when
|
|
194
|
-
`gates.evidence` is `block`.
|
|
216
|
+
`gates.evidence` is `block`. Every finding `check` can emit is explained by `simt explain <CODE>` (DRIFT, UNMANAGED, PACK-DIGEST-MISMATCH, ...).
|
|
195
217
|
|
|
196
218
|
## Agent playbook: how and when to use each module
|
|
197
219
|
|
|
@@ -210,6 +232,7 @@ through `simt mcp`.
|
|
|
210
232
|
| Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
|
|
211
233
|
| Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
|
|
212
234
|
| Before committing | `simt check` | `simt evidence` to verify test claims |
|
|
235
|
+
| Opening a pull request | `simt pr-body` | `--base <ref>` to diff against another fork point |
|
|
213
236
|
| Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
|
|
214
237
|
| Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
|
|
215
238
|
| Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
|
|
@@ -342,16 +365,16 @@ returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `s
|
|
|
342
365
|
| **Governance & Provenance** | `simt why [path]`, `simt rules list`, `simt rules show <id>`, `simt rules why <id\|ADR-NNN>`, `simt decide` | `rules_list`, `rules_why` | Before touching governed files (`why`), when reading deferred kernel rules (`rules show`), or when checking/scaffolding ADRs (`rules why`, `decide`) |
|
|
343
366
|
| **Skills & Disclosure** | `simt skills index\|brief\|show\|why\|find\|install\|compile\|eval`, `simt graph lint` | `skills_index`, `skills_find`, `skills_brief`, `skills_show`, `skills_why` | When a task requires domain workflows or reference docs without blowing the session token budget |
|
|
344
367
|
| **Memory & Lessons** | `simt lessons list`, `simt lessons review <id> --yes` | — | After fixing a failing test/gate or hitting a hook denial, to inspect or promote reusable failure-to-fix lessons |
|
|
345
|
-
| **Plans & Trackers** | `simt plan status`, `simt plan next [<id>]`, `simt plan done <id> [<sha>] --yes` | `plan_next`, `plan_done` | When executing a phased implementation or review plan row by row |
|
|
368
|
+
| **Plans & Trackers** | `simt plan status`, `simt plan next [<id>]`, `simt plan done <id> [<sha>] --yes`, `simt slice start\|finish <id>`, `simt lease`, `simt pr-body`, `simt status --line`, `simt undo` | `plan_next`, `plan_done`, `pr_body` | When executing a phased implementation or review plan row by row |
|
|
346
369
|
| **Adoption & Projection** | `simt init`, `simt doctor`, `simt check [--frozen]`, `simt sync`, `simt upgrade`, `simt ci` | `doctor`, `check` | When adopting a repo, diagnosing stack/config health, or verifying zero drift before commit |
|
|
347
370
|
| **Dual Gates & Evidence** | `simt hooks install\|status\|run`, `simt agent-hooks install\|status`, `simt agent-hook`, `simt evidence [check]` | — | When installing git/agent hooks, running gates manually, or verifying test claims before committing |
|
|
348
371
|
| **Context & Harnesses** | `simt tokens [--repos] [--session]`, `simt harness detect\|loaders`, `simt shared plan\|install` | — | When auditing startup token cost across harnesses (`claude`, `codex`, `cursor`, `opencode`, `antigravity`, `copilot`, `deepseek`) or deduplicating workspace rules |
|
|
349
|
-
| **Workspace & Benchmarks** | `simt compare`, `simt bench mine\|run\|report\|ablate\|probes\|variants`, `simt local doctor` | `compare` | When auditing an entire multi-repo estate, measuring rule uplift/cost, or probing local model endpoints |
|
|
372
|
+
| **Workspace & Benchmarks** | `simt compare`, `simt bench mine\|run\|report\|ablate\|probes\|variants`, `simt local doctor`, `simt review [--local]`, `simt distill` | `compare` | When auditing an entire multi-repo estate, measuring rule uplift/cost, or probing local model endpoints |
|
|
350
373
|
|
|
351
374
|
## Where the plan finishes
|
|
352
375
|
|
|
353
|
-
Slices `R01`–`
|
|
354
|
-
|
|
376
|
+
Slices `R01`–`R55` are all complete. The small ergonomics (`R46`–`R55`) shipped
|
|
377
|
+
on top of `0.6.0`:
|
|
355
378
|
|
|
356
379
|
- **The small doors (`R46`–`R55`).** `simt explain <CODE>` for every finding code, safe
|
|
357
380
|
idempotent `simt doctor --fix`, a `< 50 ms` `simt status --line`, a write journal with
|
|
@@ -359,6 +382,12 @@ small ergonomics:
|
|
|
359
382
|
plus a staged-diff secret scan, `simt slice start/finish <ID>` worktrees, file leases
|
|
360
383
|
for parallel agents, and `simt pr-body` assembled from the evidence ledger.
|
|
361
384
|
|
|
385
|
+
The last two rows of review `0002` (`S38` workspace token cost, `S39` estate policy
|
|
386
|
+
as a pack) are closed by ruling in ADR-102: the instrument, the declaration and the
|
|
387
|
+
non-blocking finding shipped, the blocking gate and the registry-carrying pack were
|
|
388
|
+
refused by ruling, and the estate-side move is recorded as whose commit it waits on.
|
|
389
|
+
Everything in plans `0001`–`0003` and reviews `0001`–`0002` is Complete or Accepted.
|
|
390
|
+
|
|
362
391
|
The local-model slices (`R38`–`R40`) shipped as they lab-written: `simt distill` proposes
|
|
363
392
|
budgeted summaries with line citations, `simt review` proposes an advisory ADR-008
|
|
364
393
|
verdict over the staged diff, and `simt brief` carries model/effort advice from bench
|
|
@@ -26,18 +26,18 @@ to merge. It does not write the projection.
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
Requires **Node >= 22.20.0** for the npm and PyPI channels; the release binary carries
|
|
29
|
-
its own runtime.
|
|
29
|
+
its own runtime. Pin the release you install. The tool writes a
|
|
30
30
|
content digest into the files it generates, and an unpinned upgrade changes them under
|
|
31
31
|
you.
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
npm i -D simt-dev
|
|
34
|
+
npm i -D simt-dev
|
|
35
35
|
|
|
36
36
|
# or globally
|
|
37
|
-
npm i -g simt-dev
|
|
37
|
+
npm i -g simt-dev
|
|
38
38
|
|
|
39
39
|
# or once, with no install
|
|
40
|
-
npx -y simt-dev
|
|
40
|
+
npx -y simt-dev check
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
### From PyPI
|
|
@@ -68,7 +68,7 @@ runtime: the command works with no Node installed.
|
|
|
68
68
|
### As a single-file binary
|
|
69
69
|
|
|
70
70
|
Each release carries one executable per platform — macOS arm64 and x64, Linux x64 —
|
|
71
|
-
beside its `.sha256`.
|
|
71
|
+
beside its `.sha256`. Pin the release you download,
|
|
72
72
|
and run this from the repository's top level:
|
|
73
73
|
|
|
74
74
|
```sh
|
|
@@ -85,7 +85,7 @@ published `.sha256` before running anything.
|
|
|
85
85
|
```sh
|
|
86
86
|
# Adopt, inspect, and maintain a repository
|
|
87
87
|
simt init # adopt or scaffold; prints a plan; --yes writes
|
|
88
|
-
simt doctor
|
|
88
|
+
simt doctor [--fix] # stack, facts, evidence, and config health (--fix applies safe remedies, journaled)
|
|
89
89
|
simt check [--frozen] # projection drift, manifest, lock, and declared checkers
|
|
90
90
|
simt sync [--explain] --yes # regenerate the projection
|
|
91
91
|
simt upgrade --yes # move every consumer in the workspace to this SHA
|
|
@@ -103,6 +103,7 @@ simt why [path] # ADRs, rules, skills, gates, and lessons go
|
|
|
103
103
|
simt rules list [--root <path>] # rule catalogue and what applies to a repository
|
|
104
104
|
simt rules show <id> # read one rule body (including rules deferred in kernel mode)
|
|
105
105
|
simt rules why <id|ADR-NNN> [--all] # the decision that settled a rule, and whether it still stands
|
|
106
|
+
simt explain <CODE> [--json] # what a check finding means, why it is reported, and how to fix it
|
|
106
107
|
simt decide "<title>" --yes # scaffold the next ADR with structured simt-affects / simt-supersedes
|
|
107
108
|
simt lessons list # fail-to-fix, revert, review-block, and hook-denial candidates
|
|
108
109
|
simt lessons review <id> --yes # promote a candidate to docs/lessons/NNNN-<slug>.md
|
|
@@ -125,11 +126,20 @@ simt agent-hooks status # what each harness will run, and whether Co
|
|
|
125
126
|
simt agent-hook <event> --harness # evaluate pre-tool-use, post-tool-use, or prompt-submit
|
|
126
127
|
simt evidence # gate and test runs recorded against the current git tree
|
|
127
128
|
simt evidence check <msg-file> # verify a commit message does not claim unrecorded passing runs
|
|
129
|
+
simt pr-body [--base <ref>] # a PR body: the evidence block for this tree, changed
|
|
130
|
+
# decisions, gate state, and residual risk in ADR-008 vocabulary
|
|
128
131
|
|
|
129
132
|
# Plans, context metering, workspace learning, benchmarks, local models, and MCP
|
|
130
133
|
simt plan status # count queued, in-progress, complete, and accepted tracker rows
|
|
131
134
|
simt plan next [<id>] # print the next ready slice section (~1 KB)
|
|
132
135
|
simt plan done <id> [<sha>] --yes # mark a tracker row complete with its commit SHA and test command
|
|
136
|
+
simt status --line # one-line gate state from the last check, for prompts (< 50 ms)
|
|
137
|
+
simt undo --yes # restore the last journaled set of writes, if untouched since
|
|
138
|
+
simt slice start <id> --yes # a worktree on branch slice/<id> with the brief preloaded; row In progress
|
|
139
|
+
simt slice finish <id> --yes # run the pre-commit gates, commit a Conventional subject from the
|
|
140
|
+
# row's title, and record the SHA and --test command on the row
|
|
141
|
+
simt lease [<paths>] --session # claim files for this session (--ttl, default 1h) or list claims;
|
|
142
|
+
# the pre-edit hook refuses another session's edit until the TTL
|
|
133
143
|
simt tokens [--repos] [--session] # measure bytes loaded at session start or split a transcript
|
|
134
144
|
simt harness detect [--user] # detect configured harnesses at repo and user level
|
|
135
145
|
simt harness loaders [--table] # what each harness loads, in what order, and where its cap truncates
|
|
@@ -143,25 +153,37 @@ simt bench report [--compare a b] # resolved rate, quality, cost, CPI, bootstr
|
|
|
143
153
|
simt bench ablate --yes # leave-one-out rule ablation ranked by value per KB
|
|
144
154
|
simt bench probes --yes # 12 deterministic rule-compliance probes
|
|
145
155
|
simt bench variants --yes # evaluate simt-variants slots and lock winners in simt-dev.lock.json
|
|
156
|
+
simt review [--local] # an advisory ADR-008 verdict skeleton over the staged diff
|
|
157
|
+
simt distill <skill|doc> # a budgeted proposal summary with line citations, for a person to merge
|
|
146
158
|
simt pack new <name> --source <spec> # scaffold a versioned pack: pack.json, bench.json, one rule
|
|
147
159
|
simt pack lint [dir] [--require-measured] # validate a pack and state its measured ΔR
|
|
148
160
|
simt pack publish [dir] --yes # publish an npm-sourced pack (git packs name the tag-and-push)
|
|
149
|
-
simt mcp [--list] # serve the
|
|
161
|
+
simt mcp [--list] # serve the 15 read-only tools over stdio JSON-RPC
|
|
162
|
+
simt completions <bash|zsh|fish> # a completion script generated from the command registry
|
|
163
|
+
simt ignore [--yes] [--diff] # render the one .simtignore list into .cursorignore,
|
|
164
|
+
# .aiderignore, .geminiignore and Claude's permissions.deny
|
|
150
165
|
```
|
|
151
166
|
|
|
152
167
|
`init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`,
|
|
153
|
-
`skills install`, `plan done`, `lessons review`, `decide`, `
|
|
154
|
-
and the `bench` writers print
|
|
155
|
-
a plan and write nothing without `--yes`. None of them
|
|
168
|
+
`skills install`, `plan done`, `lessons review`, `decide`, `ignore`, `pack new`,
|
|
169
|
+
`pack publish`, `slice start`, `slice finish`, `lease` and the `bench` writers print
|
|
170
|
+
a plan and write nothing without `--yes`. None of them push, and only
|
|
171
|
+
`slice finish` commits — locally, through the pre-commit gates, and only what is
|
|
172
|
+
staged. `simt index`
|
|
156
173
|
writes its cache without asking: the file is gitignored and `git ls-files` can rebuild it.
|
|
157
174
|
|
|
175
|
+
Declare `secret-scan` in `gates.preCommit` to block a commit whose staged diff
|
|
176
|
+
carries a probable secret: the scan runs inside the binary (vendor patterns plus
|
|
177
|
+
Shannon entropy, over added lines only), needs no install, and its report never
|
|
178
|
+
prints the matched bytes.
|
|
179
|
+
|
|
158
180
|
`check` runs the checkers a rule names (`max-file-lines`, `forbid-regex`,
|
|
159
181
|
`forbidden-path-edit`, `required-file`), verifies structured ADR supersessions
|
|
160
182
|
(`prose-partial-supersession`), and flags expired lessons (`LESSON-EXPIRED`). A marked
|
|
161
183
|
rule line leaves the projection as `Enforced:` and the checker's name. The file-length
|
|
162
184
|
line warns past 400 lines and fails past 1000. `simt evidence check` warns when a commit
|
|
163
185
|
message claims a passing run this tree does not have, and the commit fails when
|
|
164
|
-
`gates.evidence` is `block`.
|
|
186
|
+
`gates.evidence` is `block`. Every finding `check` can emit is explained by `simt explain <CODE>` (DRIFT, UNMANAGED, PACK-DIGEST-MISMATCH, ...).
|
|
165
187
|
|
|
166
188
|
## Agent playbook: how and when to use each module
|
|
167
189
|
|
|
@@ -180,6 +202,7 @@ through `simt mcp`.
|
|
|
180
202
|
| Rule violation or error | `simt lessons list` | `simt rules why <rule-id>` for the decision |
|
|
181
203
|
| Working from a plan | `simt plan next` | `simt plan done <id> <sha> --yes` when finished |
|
|
182
204
|
| Before committing | `simt check` | `simt evidence` to verify test claims |
|
|
205
|
+
| Opening a pull request | `simt pr-body` | `--base <ref>` to diff against another fork point |
|
|
183
206
|
| Repository adoption | `simt init --yes` | `simt doctor` to verify stack detection |
|
|
184
207
|
| Multi-repo workspace | `simt compare` | `simt shared plan` to find deduplication opportunities |
|
|
185
208
|
| Local model available | `simt local doctor` | `simt index --embed` to build vector embeddings |
|
|
@@ -312,16 +335,16 @@ returns a JSON object with `task`, `commands`, `files`, `tests`, `decisions`, `s
|
|
|
312
335
|
| **Governance & Provenance** | `simt why [path]`, `simt rules list`, `simt rules show <id>`, `simt rules why <id\|ADR-NNN>`, `simt decide` | `rules_list`, `rules_why` | Before touching governed files (`why`), when reading deferred kernel rules (`rules show`), or when checking/scaffolding ADRs (`rules why`, `decide`) |
|
|
313
336
|
| **Skills & Disclosure** | `simt skills index\|brief\|show\|why\|find\|install\|compile\|eval`, `simt graph lint` | `skills_index`, `skills_find`, `skills_brief`, `skills_show`, `skills_why` | When a task requires domain workflows or reference docs without blowing the session token budget |
|
|
314
337
|
| **Memory & Lessons** | `simt lessons list`, `simt lessons review <id> --yes` | — | After fixing a failing test/gate or hitting a hook denial, to inspect or promote reusable failure-to-fix lessons |
|
|
315
|
-
| **Plans & Trackers** | `simt plan status`, `simt plan next [<id>]`, `simt plan done <id> [<sha>] --yes` | `plan_next`, `plan_done` | When executing a phased implementation or review plan row by row |
|
|
338
|
+
| **Plans & Trackers** | `simt plan status`, `simt plan next [<id>]`, `simt plan done <id> [<sha>] --yes`, `simt slice start\|finish <id>`, `simt lease`, `simt pr-body`, `simt status --line`, `simt undo` | `plan_next`, `plan_done`, `pr_body` | When executing a phased implementation or review plan row by row |
|
|
316
339
|
| **Adoption & Projection** | `simt init`, `simt doctor`, `simt check [--frozen]`, `simt sync`, `simt upgrade`, `simt ci` | `doctor`, `check` | When adopting a repo, diagnosing stack/config health, or verifying zero drift before commit |
|
|
317
340
|
| **Dual Gates & Evidence** | `simt hooks install\|status\|run`, `simt agent-hooks install\|status`, `simt agent-hook`, `simt evidence [check]` | — | When installing git/agent hooks, running gates manually, or verifying test claims before committing |
|
|
318
341
|
| **Context & Harnesses** | `simt tokens [--repos] [--session]`, `simt harness detect\|loaders`, `simt shared plan\|install` | — | When auditing startup token cost across harnesses (`claude`, `codex`, `cursor`, `opencode`, `antigravity`, `copilot`, `deepseek`) or deduplicating workspace rules |
|
|
319
|
-
| **Workspace & Benchmarks** | `simt compare`, `simt bench mine\|run\|report\|ablate\|probes\|variants`, `simt local doctor` | `compare` | When auditing an entire multi-repo estate, measuring rule uplift/cost, or probing local model endpoints |
|
|
342
|
+
| **Workspace & Benchmarks** | `simt compare`, `simt bench mine\|run\|report\|ablate\|probes\|variants`, `simt local doctor`, `simt review [--local]`, `simt distill` | `compare` | When auditing an entire multi-repo estate, measuring rule uplift/cost, or probing local model endpoints |
|
|
320
343
|
|
|
321
344
|
## Where the plan finishes
|
|
322
345
|
|
|
323
|
-
Slices `R01`–`
|
|
324
|
-
|
|
346
|
+
Slices `R01`–`R55` are all complete. The small ergonomics (`R46`–`R55`) shipped
|
|
347
|
+
on top of `0.6.0`:
|
|
325
348
|
|
|
326
349
|
- **The small doors (`R46`–`R55`).** `simt explain <CODE>` for every finding code, safe
|
|
327
350
|
idempotent `simt doctor --fix`, a `< 50 ms` `simt status --line`, a write journal with
|
|
@@ -329,6 +352,12 @@ small ergonomics:
|
|
|
329
352
|
plus a staged-diff secret scan, `simt slice start/finish <ID>` worktrees, file leases
|
|
330
353
|
for parallel agents, and `simt pr-body` assembled from the evidence ledger.
|
|
331
354
|
|
|
355
|
+
The last two rows of review `0002` (`S38` workspace token cost, `S39` estate policy
|
|
356
|
+
as a pack) are closed by ruling in ADR-102: the instrument, the declaration and the
|
|
357
|
+
non-blocking finding shipped, the blocking gate and the registry-carrying pack were
|
|
358
|
+
refused by ruling, and the estate-side move is recorded as whose commit it waits on.
|
|
359
|
+
Everything in plans `0001`–`0003` and reviews `0001`–`0002` is Complete or Accepted.
|
|
360
|
+
|
|
332
361
|
The local-model slices (`R38`–`R40`) shipped as they lab-written: `simt distill` proposes
|
|
333
362
|
budgeted summaries with line citations, `simt review` proposes an advisory ADR-008
|
|
334
363
|
verdict over the staged diff, and `simt brief` carries model/effort advice from bench
|
|
@@ -4,26 +4,33 @@
|
|
|
4
4
|
// POSIX only (ADR-012). package.json declares os: [darwin, linux], so npm refuses
|
|
5
5
|
// the install elsewhere rather than letting a hook fail obscurely.
|
|
6
6
|
|
|
7
|
-
import { parse } from '../src/argv.mjs';
|
|
7
|
+
import { parse, rawJsonFlag } from '../src/argv.mjs';
|
|
8
8
|
import { EXIT, fail, jsonFailMode, jsonIndentDefault } from '../src/output/index.mjs';
|
|
9
9
|
|
|
10
10
|
try {
|
|
11
11
|
const argv = process.argv.slice(2);
|
|
12
12
|
const parsed = parse(argv);
|
|
13
13
|
if (!parsed.ok) {
|
|
14
|
-
|
|
14
|
+
// The flags do not exist yet, so the JSON mode is read off the raw words:
|
|
15
|
+
// a parse failure under `--json` is a JSON document on stdout, not text on
|
|
16
|
+
// stderr with an empty stdout (Q11, ADR-070 ruling 4).
|
|
17
|
+
jsonFailMode(rawJsonFlag(argv));
|
|
18
|
+
process.exit(fail(parsed.error.message, parsed.error.code));
|
|
15
19
|
}
|
|
16
20
|
const { flags, positional } = parsed.value;
|
|
17
21
|
|
|
22
|
+
// Set before anything can fail: `no command given` under `--json` is a JSON
|
|
23
|
+
// document too, and a failure that prints as text with an empty stdout breaks
|
|
24
|
+
// the same ruling the parse failure above honours (Q11, ADR-070 ruling 4).
|
|
25
|
+
jsonIndentDefault(flags.pretty === true);
|
|
26
|
+
jsonFailMode(flags.json === true);
|
|
27
|
+
|
|
18
28
|
// No arguments at all is a usage error, not a silent help dump: an agent that
|
|
19
29
|
// ran the wrong thing should be told so rather than handed 40 lines of prose.
|
|
20
30
|
if (positional.length === 0 && !flags.help && !flags.version) {
|
|
21
31
|
process.exit(fail('no command given', EXIT.USAGE));
|
|
22
32
|
}
|
|
23
33
|
|
|
24
|
-
jsonIndentDefault(flags.pretty === true);
|
|
25
|
-
jsonFailMode(flags.json === true);
|
|
26
|
-
|
|
27
34
|
// The one command that runs on somebody else's hot path, and therefore the one that
|
|
28
35
|
// does not load the registry. `agent-hook` is called before every tool call an agent
|
|
29
36
|
// makes, so its latency is a product requirement rather than a nicety (plan 0003
|
|
@@ -41,7 +48,13 @@ try {
|
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
const { dispatch } = await import('../src/commands/index.mjs');
|
|
44
|
-
|
|
51
|
+
const code = (await dispatch(argv)) ?? EXIT.OK;
|
|
52
|
+
// Assigned, not forced: a large document on stdout (a `--json --diff` over a
|
|
53
|
+
// skill-sized body exceeds the 64 KiB pipe buffer) is still draining when the
|
|
54
|
+
// command resolves, and `process.exit()` cuts it — exit 0 with half a JSON
|
|
55
|
+
// document on stdout. Letting the loop empty first makes the exit honest
|
|
56
|
+
// (plan 0003 R50; the S10 contract asserts the document parses).
|
|
57
|
+
process.exitCode = code;
|
|
45
58
|
} catch (error) {
|
|
46
59
|
process.exit(fail(error?.message ?? String(error), EXIT.FAIL));
|
|
47
60
|
}
|
|
@@ -5,7 +5,7 @@ simt-supersedes: [{ adr: "ADR-058", ruling: 5 }, { adr: "ADR-058", ruling: 7, ki
|
|
|
5
5
|
|
|
6
6
|
# ADR-098 — The fourth channel is one file, and it needs no toolchain
|
|
7
7
|
|
|
8
|
-
Status: **accepted** · 2026-10-26 · supersedes ADR-058 ruling 5 · narrows ADR-058 ruling 7 and ADR-097 ruling 3 · supersedes ADR-059 ruling 3
|
|
8
|
+
Status: **accepted** · 2026-10-26 · supersedes ADR-058 ruling 5 · narrows ADR-058 ruling 7 and ADR-097 ruling 3 · supersedes ADR-059 ruling 3 · ruling 3's cross-host byte-identicality narrowed by [ADR-099](ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md)
|
|
9
9
|
|
|
10
10
|
Affects: `scripts/build-sea.mjs`, `src/distribute/release.mjs`, `src/locate.mjs`,
|
|
11
11
|
`src/hooks/shim.mjs`, `src/ci/workflow.mjs`, `.github/workflows/publish.yml`,
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
simt-affects: [".github/workflows/publish.yml", "scripts/build-sea.mjs", "scripts/verify-release-asset.mjs", "Formula/simt-dev.rb"]
|
|
3
|
+
simt-supersedes: [{ adr: "ADR-098", ruling: 3, kind: "narrowed" }]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ADR-099 — the release verifies served bytes, and the formula mirrors them
|
|
7
|
+
|
|
8
|
+
Status: **accepted** · 2026-10-27 · narrows ADR-098 ruling 3
|
|
9
|
+
|
|
10
|
+
Affects: `.github/workflows/publish.yml`, `scripts/build-sea.mjs`,
|
|
11
|
+
`scripts/verify-release-asset.mjs`, `Formula/simt-dev.rb`
|
|
12
|
+
|
|
13
|
+
## Context
|
|
14
|
+
|
|
15
|
+
ADR-098 ruling 3 made determinism the release contract in its strongest form: the
|
|
16
|
+
same tree builds byte-identical assets on any host, so the tag workflow rebuilds
|
|
17
|
+
each asset and fails when its checksum is not the one `Formula/simt-dev.rb` in the
|
|
18
|
+
tagged tree promises. The v0.6.0 tag proved the strong form false. The CI-built
|
|
19
|
+
`linux-x64` asset hashed to `809dcda7…` while the same tree built on a darwin host
|
|
20
|
+
hashed to `b55bffc2…` — and the local rebuild is reproducible, so the difference is
|
|
21
|
+
the host, not the tree. The SEA blob is generated by a node running on the build
|
|
22
|
+
host, and a darwin-generated blob and a linux-generated blob of the same tree
|
|
23
|
+
differ. A check comparing CI bytes against locally-built committed checksums can
|
|
24
|
+
therefore never pass, and keeping it means every release fails at tag time for a
|
|
25
|
+
reason no tree change can fix.
|
|
26
|
+
|
|
27
|
+
The same run surfaced the second defect in the arrangement: all three targets built
|
|
28
|
+
on `ubuntu-latest`, but darwin binaries are finished with `codesign`, which exists
|
|
29
|
+
only on macOS. The darwin jobs never ran anywhere before v0.6.0 — v0.5.0 predates
|
|
30
|
+
the binary channel — so the runner assignment was never exercised either.
|
|
31
|
+
|
|
32
|
+
## Ruling
|
|
33
|
+
|
|
34
|
+
1. **Each target builds on its native runner.** `darwin-arm64` and `darwin-x64` on
|
|
35
|
+
`macos-14`, `linux-x64` on `ubuntu-latest`, with `fail-fast: false` so one
|
|
36
|
+
target's failure no longer cancels the others. Determinism is per host family —
|
|
37
|
+
the same tree rebuilt on the same OS family hashes identically — and the matrix
|
|
38
|
+
is what makes that claim checkable instead of aspirational.
|
|
39
|
+
|
|
40
|
+
2. **The release checks upload integrity, not cross-host equality.** After uploading
|
|
41
|
+
each asset, the workflow downloads what GitHub serves for it
|
|
42
|
+
(`scripts/verify-release-asset.mjs`) and fails when the served sha256 is not the
|
|
43
|
+
one the build just wrote. A torn or clobbered upload graduates into a release
|
|
44
|
+
nobody can detect any other way; the tap installing bytes whose checksum refuses
|
|
45
|
+
them is exactly that failure arriving on somebody else's machine.
|
|
46
|
+
|
|
47
|
+
3. **The committed formula is a mirror, refreshed after the release moves it — never
|
|
48
|
+
a prediction.** A `sync-formula` job renders `Formula/simt-dev.rb` from the
|
|
49
|
+
served bytes with `scripts/release-formula.mjs` and commits it to `main` when it
|
|
50
|
+
changed. A re-run that finds the mirror current exits quietly, and a formula
|
|
51
|
+
that already names a newer version is left alone, so an older tag can never
|
|
52
|
+
rewrite a newer mirror. The tap push (`publish-channels.yml`) already renders
|
|
53
|
+
from served bytes, so it was correct by construction throughout; this closes the
|
|
54
|
+
loop for the in-repo copy.
|
|
55
|
+
|
|
56
|
+
## Consequences
|
|
57
|
+
|
|
58
|
+
- **The v0.6.0 equality check is gone, and its premise with it.** Nothing in the
|
|
59
|
+
release compares bytes built on different hosts. The `build-sea.mjs` header no
|
|
60
|
+
longer claims cross-host byte-identicality.
|
|
61
|
+
- **The formula in a tagged tree is the previous release's mirror, and that is
|
|
62
|
+
stated rather than hidden.** Between the tag and `sync-formula`'s commit it names
|
|
63
|
+
the served bytes of the last release, which is what makes it a mirror and not a
|
|
64
|
+
promise.
|
|
65
|
+
- **`verify-release-asset.mjs` is runnable by hand.** It takes `--version` and
|
|
66
|
+
`--target` and answers whether the release serves what a build of this tree
|
|
67
|
+
wrote — the same question the workflow asks, askable from any checkout.
|
|
68
|
+
|
|
69
|
+
## Rejected
|
|
70
|
+
|
|
71
|
+
- **Generating one blob on one host and sharing it across targets.** It would make
|
|
72
|
+
the three assets share a blob while their node bases still differ per target, so
|
|
73
|
+
cross-host equality would still fail at the base — the part this repository does
|
|
74
|
+
not build. Sharing would add artifact plumbing to preserve a comparison the
|
|
75
|
+
release no longer makes.
|
|
76
|
+
- **Committing the formula from the tag before the assets exist.** That restores the
|
|
77
|
+
prediction in a new place: the committed checksums would again be bytes no
|
|
78
|
+
download has served, and the first thing that reads them (the tap) would read a
|
|
79
|
+
promise instead of a record.
|