simt-dev 0.3.0__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {simt_dev-0.3.0 → simt_dev-0.3.1}/.gitignore +2 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/CHANGELOG.md +63 -0
- simt_dev-0.3.1/PKG-INFO +204 -0
- simt_dev-0.3.1/README.md +174 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-073-a-kernel-is-a-smaller-projection-the-repository-asks-for.md +1 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-077-the-command-card-leads-the-region-and-reads-committed-evidence.md +1 -1
- simt_dev-0.3.1/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md +153 -0
- simt_dev-0.3.1/docs/decisions/ADR-084-a-workspace-carries-its-repeated-rules-once.md +100 -0
- simt_dev-0.3.1/docs/decisions/ADR-085-the-region-ends-with-the-names-it-kept-out.md +72 -0
- simt_dev-0.3.1/docs/decisions/ADR-086-the-stable-prefix-comes-first-and-the-lock-records-both-digests.md +69 -0
- simt_dev-0.3.1/docs/decisions/ADR-087-a-run-is-evidence-for-one-tree.md +67 -0
- simt_dev-0.3.1/docs/decisions/ADR-088-a-marked-line-is-enforced-by-a-checker.md +59 -0
- simt_dev-0.3.1/docs/decisions/ADR-089-the-local-index-is-a-cache-of-git-blobs.md +52 -0
- simt_dev-0.3.1/docs/decisions/ADR-090-an-optional-adapter-is-off-until-named.md +55 -0
- simt_dev-0.3.1/docs/decisions/ADR-091-the-map-ranks-files-a-task-mentions.md +60 -0
- simt_dev-0.3.1/docs/decisions/ADR-092-tests-are-imports-conventions-and-coverage.md +60 -0
- simt_dev-0.3.1/docs/decisions/ADR-093-why-names-what-governs-a-file.md +58 -0
- simt_dev-0.3.1/docs/decisions/ADR-094-a-change-runs-the-tests-that-import-it.md +44 -0
- simt_dev-0.3.1/docs/decisions/ADR-095-gate-output-keeps-the-failures.md +31 -0
- simt_dev-0.3.1/docs/decisions/ADR-096-impact-names-who-a-change-reaches.md +38 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/package.json +1 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/core.md +1 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/argv.mjs +18 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/ci/workflow.mjs +11 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/bench.mjs +13 -1
- simt_dev-0.3.1/src/commands/evidence.mjs +96 -0
- simt_dev-0.3.1/src/commands/gate.mjs +165 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/help.mjs +31 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/hooks.mjs +45 -5
- simt_dev-0.3.1/src/commands/impact.mjs +205 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/index.mjs +35 -0
- simt_dev-0.3.1/src/commands/map.mjs +91 -0
- simt_dev-0.3.1/src/commands/repoindex.mjs +52 -0
- simt_dev-0.3.1/src/commands/shared.mjs +398 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/sync.mjs +72 -3
- simt_dev-0.3.1/src/commands/tests.mjs +192 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/tokens.mjs +30 -1
- simt_dev-0.3.1/src/commands/why.mjs +177 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/decisions/index.mjs +1 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/graph/spec.mjs +1 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/dispatcher.mjs +15 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/shim.mjs +31 -0
- simt_dev-0.3.1/src/index/compact.mjs +228 -0
- simt_dev-0.3.1/src/index/extract.mjs +331 -0
- simt_dev-0.3.1/src/index/gate.mjs +101 -0
- simt_dev-0.3.1/src/index/govern.mjs +222 -0
- simt_dev-0.3.1/src/index/impact.mjs +186 -0
- simt_dev-0.3.1/src/index/map.mjs +393 -0
- simt_dev-0.3.1/src/index/persist.mjs +172 -0
- simt_dev-0.3.1/src/index/store.mjs +301 -0
- simt_dev-0.3.1/src/index/tests.mjs +294 -0
- simt_dev-0.3.1/src/kernel/budget.mjs +100 -0
- simt_dev-0.3.1/src/kernel/checks.mjs +378 -0
- simt_dev-0.3.1/src/ledger/index.mjs +112 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/measure/context.mjs +7 -5
- simt_dev-0.3.1/src/projection/disclosure.mjs +92 -0
- simt_dev-0.3.1/src/projection/lock.mjs +93 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/manifest.mjs +52 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/markers.mjs +56 -17
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/project.mjs +24 -17
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/rules.mjs +378 -44
- simt_dev-0.3.1/src/projection/shared.mjs +428 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/targets.mjs +2 -1
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/toolwords.mjs +2 -0
- simt_dev-0.3.0/PKG-INFO +0 -150
- simt_dev-0.3.0/README.md +0 -120
- {simt_dev-0.3.0 → simt_dev-0.3.1}/LICENSE +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/bin/simt-dev.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-001-push-requires-approval.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-002-refactor-blast-radius.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-003-test-breadth.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-004-hook-owns-format.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-005-file-length.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-006-coverage-bar.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-007-section-skeleton.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-008-verdict-vocabulary.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-009-skill-layout.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-010-runner-invocation.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-011-windows-support.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-012-drop-windows-support.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-014-workspace-is-configuration.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-021-one-surface-per-repo.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/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.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-044-compatibility-is-not-evidence.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-046-one-rule-one-copy.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-049-a-ruling-that-a-later-record-moved-says-so-where-it-is-printed.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/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.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-051-a-pointer-is-the-readers-only-route-so-it-is-not-a-convenience.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-059-the-version-a-repository-runs-is-the-one-it-pinned.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-060-a-repository-with-nothing-to-run-is-adopted-and-says-so.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-061-the-skill-registry-is-workspace-data.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-062-a-fresh-adoption-seeds-the-gates-it-can-run.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-063-the-adoption-escape-hatch-is-opt-in.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-064-the-context-meter-counts-what-the-tool-wrote.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-065-a-pack-is-one-shared-rule-set-pinned-by-digest.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-066-a-monorepo-projects-once-per-package.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-067-which-harnesses-read-agents-md-is-a-column.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-068-the-mcp-revision-list-cites-what-was-read.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-069-the-conformance-lint-checks-the-published-specification.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-070-the-json-payload-carries-its-own-version.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-071-a-rule-that-can-be-narrowed-is-written-narrow.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-072-the-budget-is-a-declaration-beside-the-gates.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-074-a-rule-and-a-decision-are-readable-by-uri.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-075-nothing-leaves-the-machine.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-076-a-change-to-what-agents-read-is-measured.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-078-a-line-the-repository-already-proves-does-not-ship.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-079-the-rules-are-enforced-at-the-tool-call-from-one-policy-table.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-080-the-tools-own-names-are-not-repositories-and-neither-reader-decides-by-shape.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-081-a-tracker-is-read-through-the-repositorys-template.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/docs/decisions/README.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/pyproject.toml +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/python/simt_dev/__init__.py +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/python/simt_dev/cli.py +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/mdc/intake-questions.mdc +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/mdc/preview-postflight.mdc +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/mdc/slice-commit.mdc +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/mdc/test-gate.mdc +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/android.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/cloudflare-workers.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/connectiq.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/container.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/dart.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/deno.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/dotnet.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/elixir.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/go.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/jvm.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/node.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/python.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/react-native.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/react-web.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/ruby.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/rust.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/swift.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/typescript.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/rules/stacks/uv.md +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/agenthooks/decide.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/agenthooks/policy.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/agenthooks/render.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/ablate.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/adapters.json +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/grade.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/mine.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/probes.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/report.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/bench/run.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/ci/dependabot.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/agenthook.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/ci.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/compare.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/graph.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/harness.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/init.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/mcp.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/plan.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/rules.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/skills.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/skillsinstall.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/commands/upgrade.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/compare/discover.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/compare/hooksstate.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/compare/row.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/graph/load.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/graph/speccheck.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/capability.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/gates.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/resolve.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/hooks/where.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/identity.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/kernel/card.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/kernel/inferability.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/locate.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/mcp/resources.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/mcp/schema.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/mcp/server.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/mcp/tools.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/measure/loaderView.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/measure/session.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/monorepo.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/name.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/output/index.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/package-version.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/packs.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/plan/index.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/plan/template.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/baselines.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/conflicts.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/loaders.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/mdc.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/projection/surfaces.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/resolve/eval.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/resolve/fingerprint.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/resolve/near.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/resolve/resolve.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/resolve/source.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/toolchain.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/tsconfig.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/upgrade/plan.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/src/workspace.mjs +0 -0
- {simt_dev-0.3.0 → simt_dev-0.3.1}/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,68 @@ All notable changes to this package are recorded here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.1] — 2026-10-18
|
|
10
|
+
|
|
11
|
+
### Who a change reaches
|
|
12
|
+
|
|
13
|
+
`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).
|
|
14
|
+
|
|
15
|
+
### A gate report keeps the failures and counts the passes
|
|
16
|
+
|
|
17
|
+
`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).
|
|
18
|
+
|
|
19
|
+
### A change runs the tests that import it
|
|
20
|
+
|
|
21
|
+
`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).
|
|
22
|
+
|
|
23
|
+
### what governs a file is the decision, rule, skill, gate or lesson that names it
|
|
24
|
+
|
|
25
|
+
`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).
|
|
26
|
+
|
|
27
|
+
### The tests of a file are its importers, its conventional neighbour, and its coverage
|
|
28
|
+
|
|
29
|
+
`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).
|
|
30
|
+
|
|
31
|
+
### The map ranks the files a task is likely to touch
|
|
32
|
+
|
|
33
|
+
`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).
|
|
34
|
+
|
|
35
|
+
### The index names the exports and the imports
|
|
36
|
+
|
|
37
|
+
`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).
|
|
38
|
+
|
|
39
|
+
### The local index is a cache of git blobs
|
|
40
|
+
|
|
41
|
+
`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).
|
|
42
|
+
|
|
43
|
+
### A marked line is enforced by a checker
|
|
44
|
+
|
|
45
|
+
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).
|
|
46
|
+
|
|
47
|
+
### A run is evidence for one tree
|
|
48
|
+
|
|
49
|
+
`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).
|
|
50
|
+
|
|
51
|
+
### A workspace carries its repeated rules once
|
|
52
|
+
|
|
53
|
+
`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).
|
|
54
|
+
|
|
55
|
+
### The region ends with the names of what it kept out
|
|
56
|
+
|
|
57
|
+
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).
|
|
58
|
+
|
|
59
|
+
### The stable prefix comes first
|
|
60
|
+
|
|
61
|
+
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).
|
|
62
|
+
|
|
63
|
+
### Kernel mode packs to the budget the repository declared
|
|
64
|
+
|
|
65
|
+
`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).
|
|
66
|
+
|
|
67
|
+
### Vulnerability reports
|
|
68
|
+
|
|
69
|
+
`SECURITY.md` names the two places a report goes: a GitHub issue on this repository, or `security@simt.space`.
|
|
70
|
+
|
|
9
71
|
## [0.3.0] — 2026-10-17
|
|
10
72
|
|
|
11
73
|
### The rules and the decisions are readable as MCP resources
|
|
@@ -563,6 +625,7 @@ never ran `simt hooks install` again will find nothing until the dependency is r
|
|
|
563
625
|
and `simt hooks install --yes` is re-run. That is a real upgrade step and it is called out
|
|
564
626
|
here rather than discovered.
|
|
565
627
|
|
|
628
|
+
[0.3.1]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.1
|
|
566
629
|
[0.3.0]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.3.0
|
|
567
630
|
[0.2.2]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.2.2
|
|
568
631
|
[0.2.1]: https://github.com/QuazarMedia/simt-dev/releases/tag/v0.2.1
|
simt_dev-0.3.1/PKG-INFO
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simt-dev
|
|
3
|
+
Version: 0.3.1
|
|
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` adopts a repository for the agents that work in it.
|
|
34
|
+
|
|
35
|
+
It reads what the repository actually runs, projects the rules that are not already
|
|
36
|
+
obvious into the files those agents read, and installs only the gates that repository
|
|
37
|
+
can run. Around that projection it keeps the bytes stable, replaces an instruction
|
|
38
|
+
with a check where a check can decide, answers questions about the tree from a local
|
|
39
|
+
index, and records whether a run still applies to the tree on disk.
|
|
40
|
+
|
|
41
|
+
The aim of the whole design is a higher share of tasks resolved, at a lower cost per
|
|
42
|
+
resolved task. Those targets are hypotheses. A change that touches what an agent reads
|
|
43
|
+
ships with a measurement, or its record says the measurement was not run. `simt rules
|
|
44
|
+
why ADR-NNN` prints the record, including whether it is still in force.
|
|
45
|
+
|
|
46
|
+
The default path is deterministic: no model, no network, no runtime dependencies.
|
|
47
|
+
Anything that needs a parser grammar, a local model, or another server is a separate
|
|
48
|
+
package, off until the repository names it, and it proposes rows or text for a person
|
|
49
|
+
to merge. It does not write the projection.
|
|
50
|
+
|
|
51
|
+
## Today
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
simt init # adopt or scaffold; prints a plan; --yes writes
|
|
55
|
+
simt doctor # what this repo is, and whether its config is healthy
|
|
56
|
+
simt check # projection drift, the manifest, and declared checkers
|
|
57
|
+
simt sync --yes # regenerate the projection
|
|
58
|
+
simt upgrade --yes # move every pin of this tool to this version
|
|
59
|
+
|
|
60
|
+
simt rules why ADR-042 # the decision behind a rule, and what was rejected
|
|
61
|
+
simt skills brief --task # a short brief for one task
|
|
62
|
+
simt tokens # bytes a reader loads at session start
|
|
63
|
+
simt shared plan # rules a workspace repeats, and what carrying them once saves
|
|
64
|
+
simt harness loaders # what each harness loads, and what its cap drops
|
|
65
|
+
|
|
66
|
+
simt hooks install --yes # the git dispatcher, for gates this repo can run
|
|
67
|
+
simt agent-hooks install --yes # the same policy before a tool call
|
|
68
|
+
simt evidence # runs recorded against this tree
|
|
69
|
+
simt index # files, exports and imports, from git blob hashes
|
|
70
|
+
simt plan next # the next tracker row that is ready
|
|
71
|
+
|
|
72
|
+
simt bench report # resolved rate, quality, cost, across arms
|
|
73
|
+
simt compare # every sibling checkout that has adopted
|
|
74
|
+
simt mcp # the read-only surface, over stdio
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`
|
|
78
|
+
and `plan done` print a plan and write nothing without `--yes`. None of them commit
|
|
79
|
+
or push. `simt index` writes its cache without asking: the file is gitignored and
|
|
80
|
+
`git ls-files` can rebuild it.
|
|
81
|
+
|
|
82
|
+
`check` runs the checkers a rule names. A marked line leaves the projection as
|
|
83
|
+
`Enforced:` and the checker's name. The file-length line warns past 400 lines and
|
|
84
|
+
fails past 1000. `simt evidence check` warns when a commit message claims a passing
|
|
85
|
+
run this tree does not have, and the commit fails when `gates.evidence` is `block`.
|
|
86
|
+
The commit-msg hook is installed only when that setting is `warn` or `block`.
|
|
87
|
+
|
|
88
|
+
## Where the plan finishes
|
|
89
|
+
|
|
90
|
+
The work above is the part that runs. The plan still adds the rest of the loop, in
|
|
91
|
+
this order of purpose:
|
|
92
|
+
|
|
93
|
+
- **Gates on the change.** A check selects the tests that cover the diff, and the
|
|
94
|
+
tool's own gate output is shortened without dropping a failure line.
|
|
95
|
+
- **Answers instead of exploration.** A ranked map of the repository, the impact of
|
|
96
|
+
a file or a symbol, the tests that cover a change, and the decisions, rules and
|
|
97
|
+
skills that govern a path. An external code graph can answer for a language it
|
|
98
|
+
covers, and the answer names that source.
|
|
99
|
+
- **A brief for the task in front of the agent.** At most 2 KB, pulled at submit or
|
|
100
|
+
pushed by a hook, built from the map, the tests and the governing records.
|
|
101
|
+
- **A memory that has to earn its place.** A lesson is a candidate when a failing run
|
|
102
|
+
is followed by a fix. It is recalled on a later task that looks like it, and it
|
|
103
|
+
expires. Variant wording of a rule ships only when the bench says it won.
|
|
104
|
+
- **Local models, off unless asked.** Distillation and a critic propose. They do not
|
|
105
|
+
write projected text. With no model configured, nothing opens a socket.
|
|
106
|
+
- **The small doors.** One finding code explained, a safe `doctor` fix, a one-line
|
|
107
|
+
status, an undo journal, a diff of every planned write, shell completions, one
|
|
108
|
+
ignore list for every harness plus a secret scan, a worktree per slice, a file
|
|
109
|
+
lease when two agents would edit the same path, and a pull-request body taken from
|
|
110
|
+
the evidence.
|
|
111
|
+
|
|
112
|
+
## Install
|
|
113
|
+
|
|
114
|
+
Requires **Node >= 22.20.0**. The current published release is **0.3.1**. Pin it.
|
|
115
|
+
The tool writes a content digest into the files it generates, and an unpinned upgrade
|
|
116
|
+
changes them under you.
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
npm i -D simt-dev@0.3.1
|
|
120
|
+
|
|
121
|
+
# or globally
|
|
122
|
+
npm i -g simt-dev@0.3.1
|
|
123
|
+
|
|
124
|
+
# or once, with no install
|
|
125
|
+
npx -y simt-dev@0.3.1 check
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### From PyPI
|
|
129
|
+
|
|
130
|
+
The wheel carries the same bytes as the npm tarball. It does not fetch them from npm
|
|
131
|
+
at install time.
|
|
132
|
+
|
|
133
|
+
```sh
|
|
134
|
+
pip install simt-dev
|
|
135
|
+
|
|
136
|
+
# when this machine has no node
|
|
137
|
+
pip install "simt-dev[node]"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`simt` is the command on both channels. Node is resolved in this order, and the first
|
|
141
|
+
one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra, then
|
|
142
|
+
`node` on `PATH`.
|
|
143
|
+
|
|
144
|
+
### From Homebrew
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
brew install QuazarMedia/homebrew-tap/simt-dev
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The formula depends on `node`, so the command works on a machine that has never had
|
|
151
|
+
Node installed.
|
|
152
|
+
|
|
153
|
+
## What it writes
|
|
154
|
+
|
|
155
|
+
| Path | What |
|
|
156
|
+
| --- | --- |
|
|
157
|
+
| `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 |
|
|
158
|
+
| `simt.json` | the manifest: gates, substitutions, budget, shared rules, surfaces |
|
|
159
|
+
| `simt-dev.lock.json` | the digest of the inputs and the digest of the projection |
|
|
160
|
+
| `.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 |
|
|
161
|
+
| `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
|
|
162
|
+
| `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
|
|
163
|
+
|
|
164
|
+
Text outside the markers is left alone. A regeneration does not revert it.
|
|
165
|
+
|
|
166
|
+
These are caches, gitignored, and rebuildable. They are not repository content:
|
|
167
|
+
|
|
168
|
+
| Path | What |
|
|
169
|
+
| --- | --- |
|
|
170
|
+
| `.simt-dev/index.sqlite` | files, symbols, import edges. JSON-lines at `.simt-dev/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
|
|
171
|
+
| `.simt-dev/ledger.jsonl` | one line per gate the dispatcher actually ran, against one git tree |
|
|
172
|
+
| `.simt-dev/bench/runs/` | benchmark runs |
|
|
173
|
+
|
|
174
|
+
`simt shared install --yes` writes a user-level copy of the rules a workspace
|
|
175
|
+
repeats, into the file that harness documents, and records the ids on each
|
|
176
|
+
repository's manifest. The next `sync` drops those rules from the region and names
|
|
177
|
+
them.
|
|
178
|
+
|
|
179
|
+
## How a rule is chosen
|
|
180
|
+
|
|
181
|
+
Detection reads dependency manifests, build files and CI workflows, and ranks rules
|
|
182
|
+
by path, keyword, name, capability and stack. The ranking is a score. A pull request
|
|
183
|
+
can diff it.
|
|
184
|
+
|
|
185
|
+
A repository whose ecosystem has no profile yet is still adopted: it gets the core
|
|
186
|
+
rules and no gates, until gate templates exist for it. A hook that would run nothing
|
|
187
|
+
is not installed.
|
|
188
|
+
|
|
189
|
+
Every behaviour that is a choice has a numbered record. `simt rules why <id>` is the
|
|
190
|
+
path from a rule you did not expect to the reason it is there.
|
|
191
|
+
|
|
192
|
+
## Platform
|
|
193
|
+
|
|
194
|
+
**macOS and Linux.** The hooks are POSIX `sh`. There is no Windows build. `npm i` on
|
|
195
|
+
Windows fails with npm's `EBADPLATFORM`, which npm will not let a package explain, so
|
|
196
|
+
the answer is here: **use WSL2**, and the gate works inside it.
|
|
197
|
+
|
|
198
|
+
A Windows checkout without WSL2 can still read the projection. It is plain text. The
|
|
199
|
+
hooks and the CI gate need the POSIX host.
|
|
200
|
+
|
|
201
|
+
## Licence
|
|
202
|
+
|
|
203
|
+
Apache-2.0. See [LICENSE](LICENSE). Report a vulnerability through
|
|
204
|
+
[SECURITY.md](SECURITY.md).
|
simt_dev-0.3.1/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# simt-dev
|
|
2
|
+
|
|
3
|
+
`simt` adopts a repository for the agents that work in it.
|
|
4
|
+
|
|
5
|
+
It reads what the repository actually runs, projects the rules that are not already
|
|
6
|
+
obvious into the files those agents read, and installs only the gates that repository
|
|
7
|
+
can run. Around that projection it keeps the bytes stable, replaces an instruction
|
|
8
|
+
with a check where a check can decide, answers questions about the tree from a local
|
|
9
|
+
index, and records whether a run still applies to the tree on disk.
|
|
10
|
+
|
|
11
|
+
The aim of the whole design is a higher share of tasks resolved, at a lower cost per
|
|
12
|
+
resolved task. Those targets are hypotheses. A change that touches what an agent reads
|
|
13
|
+
ships with a measurement, or its record says the measurement was not run. `simt rules
|
|
14
|
+
why ADR-NNN` prints the record, including whether it is still in force.
|
|
15
|
+
|
|
16
|
+
The default path is deterministic: no model, no network, no runtime dependencies.
|
|
17
|
+
Anything that needs a parser grammar, a local model, or another server is a separate
|
|
18
|
+
package, off until the repository names it, and it proposes rows or text for a person
|
|
19
|
+
to merge. It does not write the projection.
|
|
20
|
+
|
|
21
|
+
## Today
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
simt init # adopt or scaffold; prints a plan; --yes writes
|
|
25
|
+
simt doctor # what this repo is, and whether its config is healthy
|
|
26
|
+
simt check # projection drift, the manifest, and declared checkers
|
|
27
|
+
simt sync --yes # regenerate the projection
|
|
28
|
+
simt upgrade --yes # move every pin of this tool to this version
|
|
29
|
+
|
|
30
|
+
simt rules why ADR-042 # the decision behind a rule, and what was rejected
|
|
31
|
+
simt skills brief --task # a short brief for one task
|
|
32
|
+
simt tokens # bytes a reader loads at session start
|
|
33
|
+
simt shared plan # rules a workspace repeats, and what carrying them once saves
|
|
34
|
+
simt harness loaders # what each harness loads, and what its cap drops
|
|
35
|
+
|
|
36
|
+
simt hooks install --yes # the git dispatcher, for gates this repo can run
|
|
37
|
+
simt agent-hooks install --yes # the same policy before a tool call
|
|
38
|
+
simt evidence # runs recorded against this tree
|
|
39
|
+
simt index # files, exports and imports, from git blob hashes
|
|
40
|
+
simt plan next # the next tracker row that is ready
|
|
41
|
+
|
|
42
|
+
simt bench report # resolved rate, quality, cost, across arms
|
|
43
|
+
simt compare # every sibling checkout that has adopted
|
|
44
|
+
simt mcp # the read-only surface, over stdio
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`init`, `sync`, `upgrade`, `hooks install`, `agent-hooks install`, `shared install`
|
|
48
|
+
and `plan done` print a plan and write nothing without `--yes`. None of them commit
|
|
49
|
+
or push. `simt index` writes its cache without asking: the file is gitignored and
|
|
50
|
+
`git ls-files` can rebuild it.
|
|
51
|
+
|
|
52
|
+
`check` runs the checkers a rule names. A marked line leaves the projection as
|
|
53
|
+
`Enforced:` and the checker's name. The file-length line warns past 400 lines and
|
|
54
|
+
fails past 1000. `simt evidence check` warns when a commit message claims a passing
|
|
55
|
+
run this tree does not have, and the commit fails when `gates.evidence` is `block`.
|
|
56
|
+
The commit-msg hook is installed only when that setting is `warn` or `block`.
|
|
57
|
+
|
|
58
|
+
## Where the plan finishes
|
|
59
|
+
|
|
60
|
+
The work above is the part that runs. The plan still adds the rest of the loop, in
|
|
61
|
+
this order of purpose:
|
|
62
|
+
|
|
63
|
+
- **Gates on the change.** A check selects the tests that cover the diff, and the
|
|
64
|
+
tool's own gate output is shortened without dropping a failure line.
|
|
65
|
+
- **Answers instead of exploration.** A ranked map of the repository, the impact of
|
|
66
|
+
a file or a symbol, the tests that cover a change, and the decisions, rules and
|
|
67
|
+
skills that govern a path. An external code graph can answer for a language it
|
|
68
|
+
covers, and the answer names that source.
|
|
69
|
+
- **A brief for the task in front of the agent.** At most 2 KB, pulled at submit or
|
|
70
|
+
pushed by a hook, built from the map, the tests and the governing records.
|
|
71
|
+
- **A memory that has to earn its place.** A lesson is a candidate when a failing run
|
|
72
|
+
is followed by a fix. It is recalled on a later task that looks like it, and it
|
|
73
|
+
expires. Variant wording of a rule ships only when the bench says it won.
|
|
74
|
+
- **Local models, off unless asked.** Distillation and a critic propose. They do not
|
|
75
|
+
write projected text. With no model configured, nothing opens a socket.
|
|
76
|
+
- **The small doors.** One finding code explained, a safe `doctor` fix, a one-line
|
|
77
|
+
status, an undo journal, a diff of every planned write, shell completions, one
|
|
78
|
+
ignore list for every harness plus a secret scan, a worktree per slice, a file
|
|
79
|
+
lease when two agents would edit the same path, and a pull-request body taken from
|
|
80
|
+
the evidence.
|
|
81
|
+
|
|
82
|
+
## Install
|
|
83
|
+
|
|
84
|
+
Requires **Node >= 22.20.0**. The current published release is **0.3.1**. Pin it.
|
|
85
|
+
The tool writes a content digest into the files it generates, and an unpinned upgrade
|
|
86
|
+
changes them under you.
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
npm i -D simt-dev@0.3.1
|
|
90
|
+
|
|
91
|
+
# or globally
|
|
92
|
+
npm i -g simt-dev@0.3.1
|
|
93
|
+
|
|
94
|
+
# or once, with no install
|
|
95
|
+
npx -y simt-dev@0.3.1 check
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### From PyPI
|
|
99
|
+
|
|
100
|
+
The wheel carries the same bytes as the npm tarball. It does not fetch them from npm
|
|
101
|
+
at install time.
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
pip install simt-dev
|
|
105
|
+
|
|
106
|
+
# when this machine has no node
|
|
107
|
+
pip install "simt-dev[node]"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`simt` is the command on both channels. Node is resolved in this order, and the first
|
|
111
|
+
one that answers wins: `SIMT_DEV_NODE`, the node bundled with the `node` extra, then
|
|
112
|
+
`node` on `PATH`.
|
|
113
|
+
|
|
114
|
+
### From Homebrew
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
brew install QuazarMedia/homebrew-tap/simt-dev
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The formula depends on `node`, so the command works on a machine that has never had
|
|
121
|
+
Node installed.
|
|
122
|
+
|
|
123
|
+
## What it writes
|
|
124
|
+
|
|
125
|
+
| Path | What |
|
|
126
|
+
| --- | --- |
|
|
127
|
+
| `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 |
|
|
128
|
+
| `simt.json` | the manifest: gates, substitutions, budget, shared rules, surfaces |
|
|
129
|
+
| `simt-dev.lock.json` | the digest of the inputs and the digest of the projection |
|
|
130
|
+
| `.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 |
|
|
131
|
+
| `.editorconfig`, `.gitattributes` | baseline regions, placed first so a later setting still wins |
|
|
132
|
+
| `.simt-hooks/` and `core.hooksPath` | the shared dispatcher. It fails closed |
|
|
133
|
+
|
|
134
|
+
Text outside the markers is left alone. A regeneration does not revert it.
|
|
135
|
+
|
|
136
|
+
These are caches, gitignored, and rebuildable. They are not repository content:
|
|
137
|
+
|
|
138
|
+
| Path | What |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `.simt-dev/index.sqlite` | files, symbols, import edges. JSON-lines at `.simt-dev/index.jsonl` when this Node cannot open `node:sqlite` with FTS5 |
|
|
141
|
+
| `.simt-dev/ledger.jsonl` | one line per gate the dispatcher actually ran, against one git tree |
|
|
142
|
+
| `.simt-dev/bench/runs/` | benchmark runs |
|
|
143
|
+
|
|
144
|
+
`simt shared install --yes` writes a user-level copy of the rules a workspace
|
|
145
|
+
repeats, into the file that harness documents, and records the ids on each
|
|
146
|
+
repository's manifest. The next `sync` drops those rules from the region and names
|
|
147
|
+
them.
|
|
148
|
+
|
|
149
|
+
## How a rule is chosen
|
|
150
|
+
|
|
151
|
+
Detection reads dependency manifests, build files and CI workflows, and ranks rules
|
|
152
|
+
by path, keyword, name, capability and stack. The ranking is a score. A pull request
|
|
153
|
+
can diff it.
|
|
154
|
+
|
|
155
|
+
A repository whose ecosystem has no profile yet is still adopted: it gets the core
|
|
156
|
+
rules and no gates, until gate templates exist for it. A hook that would run nothing
|
|
157
|
+
is not installed.
|
|
158
|
+
|
|
159
|
+
Every behaviour that is a choice has a numbered record. `simt rules why <id>` is the
|
|
160
|
+
path from a rule you did not expect to the reason it is there.
|
|
161
|
+
|
|
162
|
+
## Platform
|
|
163
|
+
|
|
164
|
+
**macOS and Linux.** The hooks are POSIX `sh`. There is no Windows build. `npm i` on
|
|
165
|
+
Windows fails with npm's `EBADPLATFORM`, which npm will not let a package explain, so
|
|
166
|
+
the answer is here: **use WSL2**, and the gate works inside it.
|
|
167
|
+
|
|
168
|
+
A Windows checkout without WSL2 can still read the projection. It is plain text. The
|
|
169
|
+
hooks and the CI gate need the POSIX host.
|
|
170
|
+
|
|
171
|
+
## Licence
|
|
172
|
+
|
|
173
|
+
Apache-2.0. See [LICENSE](LICENSE). Report a vulnerability through
|
|
174
|
+
[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
|
|
simt_dev-0.3.1/docs/decisions/ADR-083-a-budget-is-met-by-cutting-the-kernel-and-hard-is-the-floor.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# ADR-083 — A budget is met by cutting the kernel, and the hard constraints are the floor
|
|
2
|
+
|
|
3
|
+
Status: **accepted** · 2026-10-17 · filed as R08 (plan 0003) · ruling 7 narrowed by ADR-084
|
|
4
|
+
|
|
5
|
+
**Affects:** `src/kernel/budget.mjs`, `src/projection/rules.mjs`, `src/projection/manifest.mjs`,
|
|
6
|
+
`src/measure/context.mjs`, `src/projection/project.mjs`, `src/commands/sync.mjs`,
|
|
7
|
+
`test/kernel.test.mjs`, `test/tokens.test.mjs`, `test/surfaces.test.mjs`
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
ADR-072 shipped the number: `budget.bytes` at the top level of the manifest, 30 000 bytes by
|
|
12
|
+
default, reported by `simt tokens` and raised by `check`, both non-blocking. It recorded what had
|
|
13
|
+
not landed and why — the packing needed a kernel, and the kernel was R07.
|
|
14
|
+
|
|
15
|
+
ADR-073 shipped the kernel. A repository declares `mode: kernel`, every rule declares its class
|
|
16
|
+
in its own frontmatter, and the mode packs `hard` and `command` while naming everything else in
|
|
17
|
+
the region with the command that fetches it. R08's accept criterion — the budget is never
|
|
18
|
+
exceeded — is now reachable, and this record is the part that reaches it.
|
|
19
|
+
|
|
20
|
+
Three facts about the number made the shape of this a decision rather than a loop.
|
|
21
|
+
|
|
22
|
+
The first is that the budget is one number and the meter bills more than the region. A generated
|
|
23
|
+
rule file is billed whole, a managed skill by its name and description, the region by the span
|
|
24
|
+
between its markers. A repository whose rules live in per-rule files has paid for those files
|
|
25
|
+
whether or not the region fits; packing the region against the whole declared number ships a
|
|
26
|
+
projection that fits on its own and is over the line the moment its rule files are written. On a
|
|
27
|
+
fixture with a Cursor surface, three `.mdc` files billed 6,552 B beside a 15,725 B region.
|
|
28
|
+
|
|
29
|
+
The second is the region's own span. It is the one number that moves when the projection is
|
|
30
|
+
packed, so a ceiling derived from it would make `sync` rewrite the file it had just written and
|
|
31
|
+
then report drift on a clean tree.
|
|
32
|
+
|
|
33
|
+
The third is what ADR-072 already ruled and R08's text has not caught up with: the key is
|
|
34
|
+
`budget.bytes`, not `projection.budget.bytes`. The plan is not edited. `projection` is a
|
|
35
|
+
generated key, `upgrade` replaces it wholesale, and a budget written there would disappear on a
|
|
36
|
+
green gate.
|
|
37
|
+
|
|
38
|
+
## Rulings
|
|
39
|
+
|
|
40
|
+
1. **One reader for the declared number.** `declaredBudget(manifest)` in `manifest.mjs` is the
|
|
41
|
+
only place `budget.bytes` is interpreted, and both the packer and `measureRoot` call it. A
|
|
42
|
+
finite non-negative value is taken as declared, including `0` — "this repository wants an
|
|
43
|
+
empty projection" is a decision somebody can make — and anything else (a string, `NaN`, a
|
|
44
|
+
negative) falls back to the review figure, because the one reading that cannot silently
|
|
45
|
+
produce compliance is the one where a typo is not a ceiling.
|
|
46
|
+
|
|
47
|
+
2. **Nothing is cut in `full` mode.** ADR-072's finding already tells the reader "nothing was cut:
|
|
48
|
+
the projection is still in full mode", and a full projection that quietly lost a rule would
|
|
49
|
+
make the tool lie about itself in its own words. `desiredRegion` returns `budget: null` there,
|
|
50
|
+
not an empty cut list, so a reader of the field cannot conclude a cut happened when the mode
|
|
51
|
+
made none possible.
|
|
52
|
+
|
|
53
|
+
3. **`hard` is the floor.** A priority class exists to say what a reader loses by not having the
|
|
54
|
+
line, and a byte count is not a reader. The packer skips `hard` instead of cutting it, and the
|
|
55
|
+
leftover is a distinct fact — `floorHeld` — reported as such: the notes say the kernel is still
|
|
56
|
+
over after every rule outside the hard class went, and that a hard constraint is not cut to
|
|
57
|
+
reach a byte count. The levers that remain are the repository's own, which is exactly what
|
|
58
|
+
ADR-072's kernel wording already tells the reader. One case gets its own sentence: when the
|
|
59
|
+
reserve alone reaches the declared budget the ceiling is zero or less, which is arithmetically
|
|
60
|
+
true and unreadable — it does not say that the files loading beside the region already spent
|
|
61
|
+
the whole budget — so the notes say that, because a reader left to infer it from a subtraction
|
|
62
|
+
is a reader who demotes a hard rule to fix a number they set too low.
|
|
63
|
+
|
|
64
|
+
4. **The ceiling is the declared budget minus a reserve, and the region's own span is in
|
|
65
|
+
neither term.** The reserve is the larger of what the meter already bills outside the region
|
|
66
|
+
(what is installed) and what this projection is about to write as rule files (what a
|
|
67
|
+
repository that has not run `sync` yet will pay). Both are lower bounds; the larger is taken
|
|
68
|
+
because the failure each would otherwise cause is the one that must not happen — under-
|
|
69
|
+
reserving reports compliance for a projection that is over. The region's span is excluded
|
|
70
|
+
deliberately, per the second fact above. A folded single-surface repository reserves nothing,
|
|
71
|
+
which is correct rather than untested: `opencode` reads `AGENTS.md` and writes no rule files,
|
|
72
|
+
so there is nothing beside the region to pay for.
|
|
73
|
+
|
|
74
|
+
5. **The cut order is the region's own order reversed, and it is fixed before any cost is
|
|
75
|
+
computed.** Class, then rule id — the comparator the deferred section already uses, least
|
|
76
|
+
valuable first. Which class a reader can best afford to lose is declared by the rules
|
|
77
|
+
themselves (ADR-073 ruling 3); what is left here is arithmetic, so the order is handed in and
|
|
78
|
+
the module that packs does not second-guess it.
|
|
79
|
+
|
|
80
|
+
6. **A cut costs what the document then weighs, not the rule's own length.** Three things move
|
|
81
|
+
when a rule leaves: the provenance header drops a source, the deferred section gains a line
|
|
82
|
+
naming what left, and both move again as the cut list grows. So each attempt re-renders the
|
|
83
|
+
region and weighs it — `costs(cut)` returning `Buffer.byteLength(compose(...))`, markers and
|
|
84
|
+
provenance header included, one byte conservative because the file's trailing newline falls
|
|
85
|
+
outside the meter's span and conservative is the only direction a ceiling can afford. The loop
|
|
86
|
+
stops the moment it fits, so a budget never costs a rule it did not have to. This is the
|
|
87
|
+
command card's `CARD_LIMIT_BYTES` idiom (ADR-077) applied to the region instead of the card.
|
|
88
|
+
|
|
89
|
+
7. **One list, two reasons.** Class-deferred and budget-cut rules share the region's existing
|
|
90
|
+
`## Deferred rules` section, and each line says which it was: `deferred in kernel mode` or
|
|
91
|
+
`cut to fit the declared budget of N bytes`, both naming `simt rules show <id>`. A second
|
|
92
|
+
heading would spend region bytes on a distinction the reader acts on identically, and a cut
|
|
93
|
+
line that did not say why would be indistinguishable from a kernel decision nobody made.
|
|
94
|
+
|
|
95
|
+
8. **`BUDGET-CUT` is a finding, non-blocking in both commands, and carries the numbers a reader
|
|
96
|
+
needs to judge it.** The detail gives `before → after`, the declared budget, the reserve when
|
|
97
|
+
it is not zero, and every cut rule by id and class; the remedy is a decision
|
|
98
|
+
(`raise budget.bytes to <before + reserve>`, the budget that would have admitted the region
|
|
99
|
+
as it stood — `before` alone would leave the cut in place, because the ceiling it was cut
|
|
100
|
+
against is the budget less the reserve), not a place to go and look. Non-blocking for ADR-072's
|
|
101
|
+
reason: the cut is the tool doing what the repository asked, and a gate that failed here would
|
|
102
|
+
fail a repository for shipping a smaller projection. `sync` prints the same two facts as notes
|
|
103
|
+
so the cut is never silent from either command.
|
|
104
|
+
|
|
105
|
+
9. **`simt tokens` keeps no second opinion.** ADR-064 kept the meter to one measurement, and the
|
|
106
|
+
packer's arithmetic is not substituted for it anywhere: the meter reports the bytes it finds
|
|
107
|
+
against the declared line, and the end-to-end test judges the cut with the meter's number
|
|
108
|
+
rather than the packer's. A packer that reports compliance for a projection the meter says is
|
|
109
|
+
over budget is the failure this arrangement is arranged against, so the test asserts the
|
|
110
|
+
meter's number even where the packer's own numbers are already visible in the same object.
|
|
111
|
+
|
|
112
|
+
## Consequences
|
|
113
|
+
|
|
114
|
+
A repository that declares `mode: kernel` and a budget its rules do not fit gets a smaller
|
|
115
|
+
projection, a list of what left and why, and a note from both `sync` and `check`. The accept
|
|
116
|
+
criterion is checkable end to end rather than asserted: a fixture declares a budget a thousand
|
|
117
|
+
bytes under its own projection, syncs, and `simt tokens` reports `over: false` with the declared
|
|
118
|
+
line intact — and a second fixture, whose rule files are billed beside the region, is cut further
|
|
119
|
+
than the region alone would have needed, which is the only way the reserve can be seen to work.
|
|
120
|
+
|
|
121
|
+
The costs are accepted rather than avoided. In kernel mode a projection is now measured
|
|
122
|
+
(`measureRoot`) and its rule targets rendered a second time (`ruleTargets`) on every
|
|
123
|
+
`desiredRegion`, where previously the region's bytes were composed once. `measureRoot` is reached
|
|
124
|
+
through `await import` inside `budgetReserve` because `measure/context.mjs` already imports
|
|
125
|
+
`readLimitFindings` from `projection/project.mjs`; a static import from `rules.mjs` would close a
|
|
126
|
+
three-module loop that has to survive being loaded in any order.
|
|
127
|
+
|
|
128
|
+
Determinism is structural and partly argued. `packToBudget` takes its cost function as an
|
|
129
|
+
argument and reads no clock, no network and no PATH, so the cut set is a function of the rules,
|
|
130
|
+
the classes, the ids and the declared number; the test that renders one repository twice catches
|
|
131
|
+
the failure a test can catch, which is state leaking between calls. Two machines is the claim
|
|
132
|
+
R08 actually makes and no test in this repository can execute it — the argument is the one ADR-073
|
|
133
|
+
ruling 7 already makes.
|
|
134
|
+
|
|
135
|
+
What has not landed, and is not this slice's to land: R02's evaluation, which is still what would
|
|
136
|
+
justify `kernel` as a default rather than a repository's own choice; and the cross-machine half
|
|
137
|
+
of the accept criterion, which is argued from the code's inputs rather than demonstrated.
|
|
138
|
+
|
|
139
|
+
## Rejected
|
|
140
|
+
|
|
141
|
+
- **Cutting in `full` mode.** The mode is a promise about what a reader gets, and the number in
|
|
142
|
+
ADR-072's finding says nothing was cut; making that sentence untrue to save bytes is the tool
|
|
143
|
+
misreporting itself.
|
|
144
|
+
- **Cutting `hard` to reach the line.** It would remove the one class whose claim is that its
|
|
145
|
+
absence is a defect, and report the result as compliance.
|
|
146
|
+
- **A second `## Cut` section beside `## Deferred rules`.** Two headings for one reader-facing
|
|
147
|
+
fact, and the second one spends bytes to be distinguished from the first.
|
|
148
|
+
- **Subtracting each rule's own length instead of re-rendering.** The provenance header and the
|
|
149
|
+
deferred line both change when a rule leaves, so the arithmetic would either overshoot or stop
|
|
150
|
+
short — and it would be a second definition of the region's size next to the meter's.
|
|
151
|
+
- **A binary search or two-pass packer.** The cost function is called once per candidate and the
|
|
152
|
+
candidate list is the length of the kernel; a cleverer search would add a failure mode to a
|
|
153
|
+
loop whose whole value is that it is the same computation every time.
|