* refactor(#3187): give state field extraction one canonical owner stateFieldValue in state-document.cts becomes the single owner of the #1760 frontmatter-then-body fallback chain. The new whole-repo guard found 14 independent re-derivations where the epic scoped 5, all now routed through it: cmdStateSnapshot (11), cmdStatePrune (2) and smart-entry fmScalar (1). state validate was a gate that could not fail. Every warning it could emit sat behind a phase resolved without the frontmatter tier, so a STATE.md whose phase lives only in frontmatter skipped the drift scan entirely and returned valid:true. It also read unstripped content, letting a frontmatter status: key shadow the body field (#1255 class). Both fixed; output gains a scope field so could-not-look stops being output-identical to looked-and-clean. Verified on the remote runner. * docs(#3187): document the state validate scope field and its reason codes Adds docs/how-to/interpret-state-validate-results.md so a reader can tell nothing-to-report from could-not-look, updates the COMMANDS.md and USER-GUIDE.md entries, corrects the CONTEXT.md glossary overstatement about Current Position sole ownership, and drops the changeset fragment. * fix(#3187): close three drift-guard evasion shapes and test the refuse path The isolated adversarial review found the ladder detector was evadable by ordinary reformatting, not just deliberately: a member or computed operand (fm.key / fm[key]) missed the bare-identifier backreference, a swapped tier order missed a hardcoded number-then-boolean sequence, and a ladder wrapped across lines missed single-line detection. All three now caught, each with its own test plus a proven boundary control. The frontmatter-parse refuse path on the destructive complete-phase route was unreachable and therefore untested. It is now driven by an injected parse failure and asserts STATE.md is byte-identical after the refusal, rather than shipping untested defensive code on a path that rewrites user state. Verified on the remote runner. * fix(#3187): widen the drift guard to the prompt layer and disclose tier-2 changes The code-review spec axis found the guard's scan surface was src/ only, which is Decision 4(d)'s forbidden allowlist one directory wide - and it had a live miss: gsd-core/workflows/smart-entry.md tells an agent to read status from frontmatter or the body, a prose expression of this same chain. The surface now covers the prompt layer. That one site carries a permanent written exemption rather than a ratchet: it is the gsd-tools-is-down fallback, so it cannot call the owner by construction, and a ratchet would imply removable debt that does not exist. Two tier-2 output changes shipped undisclosed and are now named in the changeset and docs: complete-phase's idempotency guard consulting frontmatter, and the workstream inventory resolving frontmatter-only fields. docs/COMMANDS.md gains a state complete-phase entry, which it never had. Also records Amendment 5 on ADR-3180, extracts the duplicated frontmatter-parse block the epic's own thesis forbids, and re-points two assertions from free-form warning prose onto the structured drift object. Verified on the remote runner. * chore(#3187): backfill changeset PR number pr:0 placeholder replaced with the real PR number now that #3283 exists. --------- Co-authored-by: sim <sim@local>
152 lines
4.4 KiB
JSON
152 lines
4.4 KiB
JSON
{
|
|
"_doc": "Baseline of modules currently exceeding the 2-test-file limit. Each entry locks in TODAY's exact test filenames as the allowlisted set (identity ratchet). Adding a NEW test file to a capped module fails (novel). Removing one requires pruning this list (stale, ratchet-down). When a cluster drops to \u2264 2, remove its entry entirely. New entries require justification in PR description.",
|
|
"modules": {
|
|
"config": {
|
|
"files": [
|
|
"config-defaults-runtime-exclusion.test.cjs",
|
|
"config-field-docs.test.cjs",
|
|
"config-get-default.test.cjs",
|
|
"config-schema.property.test.cjs",
|
|
"config.test.cjs"
|
|
],
|
|
"issue": "TBD"
|
|
},
|
|
"graphify": {
|
|
"files": [
|
|
"graphify-auto-update.slow.test.cjs",
|
|
"graphify-command-cutover.test.cjs",
|
|
"graphify-graph-path.test.cjs",
|
|
"graphify-query.test.cjs",
|
|
"graphify-visualization.test.cjs",
|
|
"graphify.test.cjs"
|
|
],
|
|
"issue": "622"
|
|
},
|
|
"init": {
|
|
"files": [
|
|
"init-debug-workflow-contract.test.cjs",
|
|
"init-debug.test.cjs",
|
|
"init-manager.test.cjs",
|
|
"init.test.cjs"
|
|
],
|
|
"issue": "3149"
|
|
},
|
|
"milestone": {
|
|
"files": [
|
|
"milestone-archive.test.cjs",
|
|
"milestone-helper.test.cjs",
|
|
"milestone-prefixed-convention.test.cjs",
|
|
"milestone-summary.test.cjs",
|
|
"milestone-window-drift-guard.test.cjs",
|
|
"milestone-window-single-owner.test.cjs",
|
|
"milestone.test.cjs"
|
|
],
|
|
"issue": "3216"
|
|
},
|
|
"roadmap": {
|
|
"files": [
|
|
"roadmap-mode-field.test.cjs",
|
|
"roadmap-phase-fallback.test.cjs",
|
|
"roadmap.test.cjs"
|
|
],
|
|
"issue": "TBD"
|
|
},
|
|
"runtime-artifact-layout": {
|
|
"files": [
|
|
"runtime-artifact-layout-descriptor-drive.test.cjs",
|
|
"runtime-artifact-layout-install-profiles.test.cjs",
|
|
"runtime-artifact-layout-surface.test.cjs",
|
|
"runtime-artifact-layout-trigger-surface.test.cjs",
|
|
"runtime-artifact-layout.test.cjs"
|
|
],
|
|
"issue": "2871"
|
|
},
|
|
"security": {
|
|
"files": [
|
|
"security-dead-exports.regression.test.cjs",
|
|
"security-prompt-injection.security.test.cjs",
|
|
"security-scan.security.test.cjs",
|
|
"security.test.cjs"
|
|
],
|
|
"issue": "2198"
|
|
},
|
|
"state": {
|
|
"files": [
|
|
"state-acquirestatelock-non-eexist.test.cjs",
|
|
"state-command-cutover.test.cjs",
|
|
"state-field-drift.test.cjs",
|
|
"state-prune.test.cjs",
|
|
"state-rebuild-cli.test.cjs",
|
|
"state-rebuild.test.cjs",
|
|
"state.test.cjs"
|
|
],
|
|
"issue": "180"
|
|
},
|
|
"verify": {
|
|
"files": [
|
|
"verify-health.test.cjs",
|
|
"verify-mvp-uat.test.cjs",
|
|
"verify-npm-publish.test.cjs",
|
|
"verify-test-quality.test.cjs",
|
|
"verify-work-auto-transition.test.cjs",
|
|
"verify.test.cjs"
|
|
],
|
|
"issue": "3767"
|
|
},
|
|
"install": {
|
|
"files": [
|
|
"install-minimal-hooks.test.cjs",
|
|
"install-nested-layout.test.cjs",
|
|
"install-path-detection.test.cjs",
|
|
"install-regressions.test.cjs",
|
|
"install-runtime-artifacts.test.cjs",
|
|
"install-update-marker.test.cjs",
|
|
"install-write-confinement.test.cjs",
|
|
"install.test.cjs"
|
|
],
|
|
"issue": "1679"
|
|
},
|
|
"edge-probe": {
|
|
"files": [
|
|
"edge-probe-docs-fixtures.test.cjs",
|
|
"edge-probe-planner-contract.test.cjs",
|
|
"edge-probe-spec-phase-contract.test.cjs",
|
|
"edge-probe.test.cjs"
|
|
],
|
|
"issue": "550"
|
|
},
|
|
"federated-config": {
|
|
"files": [
|
|
"federated-config.test.cjs",
|
|
"federated-config-loadconfig.test.cjs",
|
|
"federated-config-key-removal.test.cjs"
|
|
],
|
|
"issue": "TBD"
|
|
},
|
|
"host-integration": {
|
|
"files": [
|
|
"host-integration.test.cjs",
|
|
"host-integration-validator-parity.test.cjs",
|
|
"host-integration-descriptors.test.cjs"
|
|
],
|
|
"issue": "1684"
|
|
},
|
|
"prompt-budget": {
|
|
"files": [
|
|
"prompt-budget-cli.test.cjs",
|
|
"prompt-budget-parity.test.cjs",
|
|
"prompt-budget.test.cjs"
|
|
],
|
|
"issue": "2929"
|
|
},
|
|
"audit": {
|
|
"files": [
|
|
"audit-command-cutover.test.cjs",
|
|
"audit-fix-command.test.cjs",
|
|
"fix-2766-audit-uat-archived-and-table-shapes.test.cjs"
|
|
],
|
|
"issue": "2766"
|
|
}
|
|
}
|
|
}
|