feat(#1154): honest verifier — abstain (insufficient_spec) on non-inferable backstop truths (#1738)

* feat(verify-phase): honest verifier — abstain (insufficient_spec) on non-inferable backstop truths (#1154)

Carry the edge-probe's existing `backstop` (non-inferable) tier through the
plan-phase projection as a structured flat-scalar marker instead of a prose
parenthetical, and make verify-phase abstain -> human_needed (never silent-pass)
on a backstop truth it cannot confirm with explicit evidence. Truth-axis mirror
of #644's prohibition judgment-tier (ADR-550 D4).

Engine (deterministic, CI-tested per ADR-550 D5 — never the LLM verdict):
- src/probe-core.cts: truthStatement/truthVerification normalizers, projectTruths
  (conservative serializer), dispositionForUnverifiableTruth (backstop+no-evidence
  -> unverified/flagged/insufficient_spec; backstop+evidence -> green; inferable
  -> green, the over-abstention guard).
- src/roadmap.cts: coerceTruthToString now reads `statement` first so an object-form
  backstop truth is surfaced, not dropped (Hyrum backward-compat for truth-readers).

Workflow/agent/docs: plan-phase emits the structured marker (flat scalar, ADR-550
#1278); verify-phase + gsd-verifier add the abstain arm; new references/honest-verifier.md;
FEATURES/COMMANDS document insufficient_spec; ADR-550 amended (truth-axis D4 mirror).

Decisions adopted (trek-e review): insufficient_spec feeds existing human_needed with a
distinguishable reason (no new VERIFIER_STATUS); changeset Changed; round-trip parity
test; abstain-on-unconfirmed-backstop regression test red-first.

Implementation notes (deviations from the issue's proposed file list, verified live):
- frontmatter.cts needs no change — its flat parser already round-trips object-form truths.
- verify.cts needs no change — it grades artifacts/key_links structurally; truths are
  LLM-graded at the workflow layer, so consumption lives there + the deterministic helper.
- No CJS<->SDK hand-sync — the SDK seam was retired (ADR-0174); src/*.cts is sole source.

Regenerated artifacts: golden-install-parity fixtures, INVENTORY-MANIFEST, size baselines.

* chore(#1154): add changeset (Changed) for honest verifier

User-facing changelog fragment for #1738. Typed `Changed` (not `Added`) per
trek-e review condition 3 — the verify behavior shifts for backstop-bearing specs
(a confident silent `passed` becomes `human_needed`), which is user-visible even
though the schema marker is additive.

* docs(#1154): score-formula also excludes abstained insufficient_spec truths (review nit-1)

trek-e review nit: the verify-phase score sentence said PRESENT_BEHAVIOR_UNVERIFIED
truths were "the only ones excluded" from verified_truths. Post-#1154 an abstained
`insufficient_spec` backstop truth is also excluded (it is not ✓ VERIFIED and routes
to human_needed). Behavior was already correct; this tightens the wording.
Regenerated golden-install-parity fixtures + workflow-size baseline for the touched
verify-phase.md. (Nit-2 — a dedicated insufficient_spec_items frontmatter list — is
intentionally not taken: the current design is ADR-550-D4-conformant, the abstain
cause rides as a distinguishable report reason, and adding it would exceed the
approved scope.)

---------

Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
This commit is contained in:
Rezolv
2026-06-29 00:14:32 -04:00
committed by GitHub
parent ac001be49e
commit 18995380ce
32 changed files with 491 additions and 60 deletions

View File

@@ -32,5 +32,5 @@
"gsd-ui-checker.md": 11088,
"gsd-ui-researcher.md": 19332,
"gsd-user-profiler.md": 8516,
"gsd-verifier.md": 48859
"gsd-verifier.md": 49124
}

View File

@@ -133,6 +133,34 @@ Plans:
assert.ok(roadmap.includes(sharedTruth), 'shared truth listed');
});
test('#1154: surfaces a cross-cutting backstop (object-form) truth by its statement, not dropped', () => {
// An object-form backstop truth `{ statement, verification: backstop }` (the #1154 non-inferable
// marker on must_haves.truths) shared across 2 plans must be coerced by its `statement` — the
// Hyrum backward-compat guard: a truth-reader must tolerate the new object form, never drop it.
const backstopTruth = 'statement: Adjacent touching intervals merge\n verification: backstop';
tmpDir = makePlanProject({
'.planning/ROADMAP.md': `# Roadmap
### Phase 1: Foundation
**Goal:** Set up project
**Plans:** 2 plans
Plans:
- [ ] 01-01-PLAN.md — Set up DB
- [ ] 01-02-PLAN.md — Build API
`,
'.planning/phases/01-foundation/01-01-PLAN.md': PLAN_TEMPLATE(1, [backstopTruth, 'DB schema is correct']),
'.planning/phases/01-foundation/01-02-PLAN.md': PLAN_TEMPLATE(2, [backstopTruth, 'API returns 200']),
});
const result = runGsdTools('roadmap annotate-dependencies 1', tmpDir);
assert.ok(result.success, `Command failed: ${result.error}`);
const out = JSON.parse(result.output);
assert.strictEqual(out.cross_cutting_constraints, 1, 'the shared backstop truth is surfaced, not dropped');
const roadmap = fs.readFileSync(path.join(tmpDir, '.planning', 'ROADMAP.md'), 'utf-8');
assert.ok(roadmap.includes('Adjacent touching intervals merge'), 'surfaced by its statement text, not [object Object]');
});
test('does not surface constraints that appear in only one plan', () => {
tmpDir = makePlanProject({
'.planning/ROADMAP.md': `# Roadmap

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "dbbe694a26265473",
"agents/gsd-ui-researcher.md": "8c7e91c85e7099f5",
"agents/gsd-user-profiler.md": "25d65f6458454764",
"agents/gsd-verifier.md": "2a64590bb09e21e6",
"agents/gsd-verifier.md": "5902e27c7091f4b1",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -86,6 +86,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "9e6076a137f9e156",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "a31a4bf42d82d5e9",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -263,7 +264,7 @@
"gsd-core/workflows/note.md": "3ce09c0aa0a20599",
"gsd-core/workflows/pause-work.md": "3196d681d4dd8c71",
"gsd-core/workflows/plan-milestone-gaps.md": "94b193dfc9ca3681",
"gsd-core/workflows/plan-phase.md": "d99fb8159a2db1a9",
"gsd-core/workflows/plan-phase.md": "fde84f67730f7131",
"gsd-core/workflows/plan-review-convergence.md": "b1623082557cdca5",
"gsd-core/workflows/plant-seed.md": "1fb45cd49f66f572",
"gsd-core/workflows/pr-branch.md": "c8fd9fa250cb39fd",
@@ -297,7 +298,7 @@
"gsd-core/workflows/undo.md": "6ab639d1fc7e0721",
"gsd-core/workflows/update.md": "dc93f366e2156e37",
"gsd-core/workflows/validate-phase.md": "5bac28c71d21c740",
"gsd-core/workflows/verify-phase.md": "1c6a2e1128966675",
"gsd-core/workflows/verify-phase.md": "e7059c04c816e62d",
"gsd-core/workflows/verify-work.md": "dd7f78f947b86976",
"hooks/gsd-check-update-worker.js": "668c24ea284ff623",
"hooks/gsd-check-update.js": "7e42f76b2bcdd764",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "4cf947a98db6410e",
"agents/gsd-ui-researcher.md": "3f8646572e9c3ec1",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "b1108277a4e858e3",
"agents/gsd-verifier.md": "4046b8d4ca23e342",
"commands/gsd-add-tests.md": "3608d0cf4b515103",
"commands/gsd-ai-integration-phase.md": "70843d4904743f7e",
"commands/gsd-audit-fix.md": "1b805946362c4f19",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "fe6b786141eab878",
"gsd-core/workflows/plan-phase.md": "5e3c949ca65cd672",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "231e7c305b40c417",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-phase.md": "7579af6cd757f644",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"hooks/gsd-check-update-worker.js": "e42be7414a05e99d",
"hooks/gsd-check-update.js": "b3333951b2091807",

View File

@@ -33,7 +33,7 @@
"agents/gsd-ui-checker.md": "dd06843892f6b0c8",
"agents/gsd-ui-researcher.md": "85d7d6cc36388435",
"agents/gsd-user-profiler.md": "003276f85792cfda",
"agents/gsd-verifier.md": "0a0c618959bb00d2",
"agents/gsd-verifier.md": "76bcf41aa9fd9b53",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -85,6 +85,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "5c70ef3203b7c9ce",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -262,7 +263,7 @@
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "0be71264eafd16dc",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "bce0904c3d3b7d59",
"gsd-core/workflows/plan-phase.md": "b0373c2198f4acf7",
"gsd-core/workflows/plan-review-convergence.md": "414df04b7ddff73c",
"gsd-core/workflows/plant-seed.md": "936a848f1d6c409e",
"gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5",
@@ -296,7 +297,7 @@
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "0b389258dcc09332",
"gsd-core/workflows/validate-phase.md": "2aa540f2c2479501",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-phase.md": "15a999f82868ad29",
"gsd-core/workflows/verify-work.md": "d2e8f5d5f2b8f050",
"hooks/gsd-check-update-worker.js": "f0c2b5b7169642ba",
"hooks/gsd-check-update.js": "a0e4882e66670e4d",

View File

@@ -37,7 +37,7 @@
"agents/gsd-ui-checker.md": "35a6b14813aa03ff",
"agents/gsd-ui-researcher.md": "878c7d0e82fa861a",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "64cc793b5f0110bc",
"agents/gsd-verifier.md": "0a437cf3ed90693f",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -89,6 +89,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "f5403e1470e46e69",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -266,7 +267,7 @@
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "9c1acf8c30a244fd",
"gsd-core/workflows/plan-milestone-gaps.md": "95ca791b0867fe2d",
"gsd-core/workflows/plan-phase.md": "2716d6636e37ce6a",
"gsd-core/workflows/plan-phase.md": "ab9ed0b5acfe7d8a",
"gsd-core/workflows/plan-review-convergence.md": "2cdba6216184aac4",
"gsd-core/workflows/plant-seed.md": "d0d63f83ae7c939b",
"gsd-core/workflows/pr-branch.md": "15ccec6bd303ea46",
@@ -300,7 +301,7 @@
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "9cad8a8f4baff922",
"gsd-core/workflows/validate-phase.md": "54687a0f2a562fc4",
"gsd-core/workflows/verify-phase.md": "68a74f247fdce962",
"gsd-core/workflows/verify-phase.md": "5caca0023bc88a9a",
"gsd-core/workflows/verify-work.md": "6f482d32e0c8d49a",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "68ee3eb209c9f0d6",
"agents/gsd-ui-researcher.md": "507ed07fc9ba7d33",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "b62b7966b4aafd5b",
"agents/gsd-verifier.md": "b3983159ba46fcbf",
"commands/gsd-add-tests.md": "aa65032141557fb7",
"commands/gsd-ai-integration-phase.md": "373053d7cd887aa9",
"commands/gsd-audit-fix.md": "c21ef925131fade7",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "3b30ccd918b5f703",
"gsd-core/workflows/plan-phase.md": "58d02dbdb533603a",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "6a593863d1b0a287",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-phase.md": "7579af6cd757f644",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"hooks/gsd-check-update-worker.js": "084c3f7109bb4d29",
"hooks/gsd-check-update.js": "23074675b7c31a47",

View File

@@ -67,8 +67,8 @@
"agents/gsd-ui-researcher.toml": "ffe2ca0b232df3df",
"agents/gsd-user-profiler.md": "1bf5033c929181c1",
"agents/gsd-user-profiler.toml": "b9c244bb8fbf8140",
"agents/gsd-verifier.md": "994e2a4f22bc3c8b",
"agents/gsd-verifier.toml": "9743a551e04bc0a3",
"agents/gsd-verifier.md": "3471118de7e985c7",
"agents/gsd-verifier.toml": "68f4dcc6c0311e00",
"config.toml": "a34316b9ac61a620",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
@@ -121,6 +121,7 @@
"gsd-core/references/gates.md": "11fd2bdf27df57a5",
"gsd-core/references/git-integration.md": "94715b69448bb818",
"gsd-core/references/git-planning-commit.md": "5aad099c51135a0f",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -298,7 +299,7 @@
"gsd-core/workflows/note.md": "664da466ab989f9d",
"gsd-core/workflows/pause-work.md": "3c2ee96295959527",
"gsd-core/workflows/plan-milestone-gaps.md": "8ee841bcc7adc836",
"gsd-core/workflows/plan-phase.md": "4bef5b532a009f9b",
"gsd-core/workflows/plan-phase.md": "f9a1846e30603d38",
"gsd-core/workflows/plan-review-convergence.md": "f27818025e279aa4",
"gsd-core/workflows/plant-seed.md": "bfa729ff2ad3441a",
"gsd-core/workflows/pr-branch.md": "3b13915429c0e8d9",
@@ -332,7 +333,7 @@
"gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5",
"gsd-core/workflows/update.md": "4166fd3e3ca72a7b",
"gsd-core/workflows/validate-phase.md": "4e94708c9ca15d70",
"gsd-core/workflows/verify-phase.md": "b81bd1c061c9e6d3",
"gsd-core/workflows/verify-phase.md": "59bb0b12ebb47f5e",
"gsd-core/workflows/verify-work.md": "92fb4e876d75ded5",
"hooks/gsd-check-update.js": "79c846cd8dd54caa",
"hooks/gsd-context-monitor.js": "caa8614524452835",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.agent.md": "4e46f787d6420062",
"agents/gsd-ui-researcher.agent.md": "9dd2acff7b24230e",
"agents/gsd-user-profiler.agent.md": "ae16a248e18dd42b",
"agents/gsd-verifier.agent.md": "ebd2c921c24e2d9b",
"agents/gsd-verifier.agent.md": "6fe2c4f008ebfa22",
"copilot-instructions.md": "1fb04111759f1645",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
@@ -87,6 +87,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "657a93c539c16cab",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "08b1e82f59c18078",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -264,7 +265,7 @@
"gsd-core/workflows/note.md": "4a5ee74cf2fc1f54",
"gsd-core/workflows/pause-work.md": "324e04e675dc7f7f",
"gsd-core/workflows/plan-milestone-gaps.md": "c0eb896eb42e22d4",
"gsd-core/workflows/plan-phase.md": "50042ca359933c51",
"gsd-core/workflows/plan-phase.md": "16ff6a162cbd4c01",
"gsd-core/workflows/plan-review-convergence.md": "c238b5858ceb4e57",
"gsd-core/workflows/plant-seed.md": "56451bdf104983b3",
"gsd-core/workflows/pr-branch.md": "a080aed95785cf32",
@@ -298,7 +299,7 @@
"gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd",
"gsd-core/workflows/update.md": "712ab18a9b7c14f5",
"gsd-core/workflows/validate-phase.md": "f923eac9442b6053",
"gsd-core/workflows/verify-phase.md": "543845af6f701518",
"gsd-core/workflows/verify-phase.md": "eea9b642393b6b90",
"gsd-core/workflows/verify-work.md": "e253fb8e33c68fa4",
"hooks/gsd-session.json": "0a462834f2a28fee",
"scripts/changeset/README.md": "86ff89331dfd94b2",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "66b380ffcdfec7b5",
"agents/gsd-ui-researcher.md": "fe237aa42ccd9ad2",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "5ec35372f0a58d48",
"agents/gsd-verifier.md": "7bacf6ef32186213",
"commands/gsd-add-tests.md": "1f89b16ab2cca426",
"commands/gsd-ai-integration-phase.md": "3ccac39673ffb92c",
"commands/gsd-audit-fix.md": "d88502ffa2151cec",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "9840f521ad6612b5",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "1c1e466c764e3deb",
"gsd-core/workflows/pause-work.md": "0be71264eafd16dc",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "8975739befb097bc",
"gsd-core/workflows/plan-phase.md": "1f40b9c15ebef2ff",
"gsd-core/workflows/plan-review-convergence.md": "783c5171101b26b9",
"gsd-core/workflows/plant-seed.md": "b28224f37faa9b95",
"gsd-core/workflows/pr-branch.md": "1f77535b6b156ad9",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
"gsd-core/workflows/update.md": "a27dcfd2814bf2b1",
"gsd-core/workflows/validate-phase.md": "f513c28c01a44cb7",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-phase.md": "15a999f82868ad29",
"gsd-core/workflows/verify-work.md": "24d323b667d15d01",
"hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f",
"hooks/gsd-cursor-session-start.js": "c6e04ed597ea7020",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "cb122369806c5467",
"agents/gsd-ui-researcher.md": "e1422e3b0f142f74",
"agents/gsd-user-profiler.md": "d6cb5430d841cea6",
"agents/gsd-verifier.md": "6f3d8f7d56b72475",
"agents/gsd-verifier.md": "e52203ef59021e9c",
"commands/gsd/add-tests.toml": "297ba4d4c285fd99",
"commands/gsd/ai-integration-phase.toml": "411ba33b9a7d9e78",
"commands/gsd/audit-fix.toml": "f4a198a455f668a9",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "95199087905ba3e6",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "b2904cffb7ff0127",
"gsd-core/workflows/plan-phase.md": "81c6ef4292e5f9bf",
"gsd-core/workflows/plan-review-convergence.md": "57c284df29121220",
"gsd-core/workflows/plant-seed.md": "339890021123e017",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "993bb0a31edca7f8",
"gsd-core/workflows/update.md": "51c3af33474bdc24",
"gsd-core/workflows/validate-phase.md": "2d998cb78c918d08",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-phase.md": "7579af6cd757f644",
"gsd-core/workflows/verify-work.md": "1265e07f2c74a218",
"hooks/gsd-check-update-worker.js": "7a3eba8c1c166dd2",
"hooks/gsd-check-update.js": "c1c78326299f6eae",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "32b2605c7254f959",
"agents/gsd-ui-researcher.md": "87cf9eebc37c4a37",
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
"agents/gsd-verifier.md": "4decc9b596090ca6",
"agents/gsd-verifier.md": "c1d1448bf31039ec",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -86,6 +86,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "12d23fcbaa7fcf06",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -263,7 +264,7 @@
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "2c3abcaa1fa6d2e2",
"gsd-core/workflows/plan-milestone-gaps.md": "419744c1191354af",
"gsd-core/workflows/plan-phase.md": "7d6cbb6730d852d2",
"gsd-core/workflows/plan-phase.md": "ad2d30c92b495bcb",
"gsd-core/workflows/plan-review-convergence.md": "8ebcd05fcd5a0d15",
"gsd-core/workflows/plant-seed.md": "76379e2aeb18d53b",
"gsd-core/workflows/pr-branch.md": "79f4d93e31af9c49",
@@ -297,7 +298,7 @@
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "472d4905fc8c5ce5",
"gsd-core/workflows/validate-phase.md": "067acd7aeed52c5b",
"gsd-core/workflows/verify-phase.md": "fecef63dcecc4104",
"gsd-core/workflows/verify-phase.md": "4e1d99795e8e9413",
"gsd-core/workflows/verify-work.md": "aa0b4d000b15dbf1",
"hooks/gsd-check-update-worker.js": "80865e926e22623e",
"hooks/gsd-check-update.js": "57433c9f9b224e3e",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "2a6c5551e354414b",
"agents/gsd-ui-researcher.md": "384af56f90784422",
"agents/gsd-user-profiler.md": "b8cb09319c517701",
"agents/gsd-verifier.md": "b16febf0774e2db7",
"agents/gsd-verifier.md": "0cd3672d8ad81dd0",
"command/gsd-add-tests.md": "c314f9a6be312bfa",
"command/gsd-ai-integration-phase.md": "bbab86a540e00db5",
"command/gsd-audit-fix.md": "4106e9dce9b71585",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "fbdf814a3af9c051",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "f8c2842a2217f776",
"gsd-core/workflows/pause-work.md": "8b81699a46ca8e9b",
"gsd-core/workflows/plan-milestone-gaps.md": "1976bf2001969719",
"gsd-core/workflows/plan-phase.md": "2d8eda8f283735d2",
"gsd-core/workflows/plan-phase.md": "38d57cf05c12ab50",
"gsd-core/workflows/plan-review-convergence.md": "88e294a5cc616e90",
"gsd-core/workflows/plant-seed.md": "249d3c6b4d474106",
"gsd-core/workflows/pr-branch.md": "c8827e8a15426bf5",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "7cd2153f8b15e30d",
"gsd-core/workflows/update.md": "5d0a2356dadf2017",
"gsd-core/workflows/validate-phase.md": "7915e3a261f7c9c9",
"gsd-core/workflows/verify-phase.md": "452968b6becb18a1",
"gsd-core/workflows/verify-phase.md": "15a999f82868ad29",
"gsd-core/workflows/verify-work.md": "7cb5144cc74986e7",
"hooks/gsd-check-update-worker.js": "8c48db40d2d74193",
"hooks/gsd-check-update.js": "1c863b30953b47c8",

View File

@@ -69,7 +69,7 @@
"agents/subagents/gsd-ui-researcher.yaml": "15e215874bc2c37d",
"agents/subagents/gsd-user-profiler.md": "c16f94e09e433394",
"agents/subagents/gsd-user-profiler.yaml": "645826a29d079159",
"agents/subagents/gsd-verifier.md": "3345b59f7a3b8de3",
"agents/subagents/gsd-verifier.md": "1536f3fa5a2d4419",
"agents/subagents/gsd-verifier.yaml": "2d2bd6b37626f382",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
@@ -122,6 +122,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -299,7 +300,7 @@
"gsd-core/workflows/note.md": "5a99eb396c744619",
"gsd-core/workflows/pause-work.md": "7bcbdf27ba957c8b",
"gsd-core/workflows/plan-milestone-gaps.md": "02fee851c82e3b25",
"gsd-core/workflows/plan-phase.md": "f210c67e41f89f4a",
"gsd-core/workflows/plan-phase.md": "f40fb8f961a35925",
"gsd-core/workflows/plan-review-convergence.md": "10007f8382864bcd",
"gsd-core/workflows/plant-seed.md": "7b795d7a1b4c9f06",
"gsd-core/workflows/pr-branch.md": "f2a35833fe784a53",
@@ -333,7 +334,7 @@
"gsd-core/workflows/undo.md": "96d2775f008b3a85",
"gsd-core/workflows/update.md": "6369691790864147",
"gsd-core/workflows/validate-phase.md": "50f37b705b6e44fb",
"gsd-core/workflows/verify-phase.md": "968d569ea4ef377f",
"gsd-core/workflows/verify-phase.md": "7579af6cd757f644",
"gsd-core/workflows/verify-work.md": "6f9c666386cb6d7e",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "b98b00e586610657",
"agents/gsd-ui-researcher.md": "7ff5c528bef6af09",
"agents/gsd-user-profiler.md": "d825b4c0a6431f8b",
"agents/gsd-verifier.md": "1e0ff1d8d15a48ab",
"agents/gsd-verifier.md": "47816fa1ba8a9b8b",
"command/gsd-add-tests.md": "b9cd93ed01945f75",
"command/gsd-ai-integration-phase.md": "9d4bc4dcce7f1ee0",
"command/gsd-audit-fix.md": "5615403843d5e491",
@@ -155,6 +155,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "fbdf814a3af9c051",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "b67482409f896a10",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -332,7 +333,7 @@
"gsd-core/workflows/note.md": "0d1374f2a2257858",
"gsd-core/workflows/pause-work.md": "c9f0b8826845dda7",
"gsd-core/workflows/plan-milestone-gaps.md": "5ec459734bf7570c",
"gsd-core/workflows/plan-phase.md": "1aea2bd181a782cf",
"gsd-core/workflows/plan-phase.md": "6db3e766b7703874",
"gsd-core/workflows/plan-review-convergence.md": "4f884d793d72d3fd",
"gsd-core/workflows/plant-seed.md": "507e886d0f70d84c",
"gsd-core/workflows/pr-branch.md": "3abaa18246facdc3",
@@ -366,7 +367,7 @@
"gsd-core/workflows/undo.md": "0bba5e7f6196c894",
"gsd-core/workflows/update.md": "af51041a3172c523",
"gsd-core/workflows/validate-phase.md": "0fc5991f6d7c6c39",
"gsd-core/workflows/verify-phase.md": "d8999a0a1cd7b6de",
"gsd-core/workflows/verify-phase.md": "13a1a43395b5e47b",
"gsd-core/workflows/verify-work.md": "52f6011634cff599",
"hooks/gsd-check-update-worker.js": "5882dbd41918c863",
"hooks/gsd-check-update.js": "5fb0027b7b76986c",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "7a383f6a3fbba34b",
"agents/gsd-ui-researcher.md": "67596ca5ee2f4547",
"agents/gsd-user-profiler.md": "ca3bf75581f211a0",
"agents/gsd-verifier.md": "82b7967e24c2065b",
"agents/gsd-verifier.md": "4bc6c8e197ee56e0",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -86,6 +86,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "bd249d9024c39c0d",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -263,7 +264,7 @@
"gsd-core/workflows/note.md": "42b66686b2c102cb",
"gsd-core/workflows/pause-work.md": "54f1c0a9e79e2c59",
"gsd-core/workflows/plan-milestone-gaps.md": "1b820f4e70acce86",
"gsd-core/workflows/plan-phase.md": "fcc0bfeadf4aa5c4",
"gsd-core/workflows/plan-phase.md": "140b9f4360646c96",
"gsd-core/workflows/plan-review-convergence.md": "b809588bff4f48b5",
"gsd-core/workflows/plant-seed.md": "e3949fcbcf5d375f",
"gsd-core/workflows/pr-branch.md": "95850381230787ed",
@@ -297,7 +298,7 @@
"gsd-core/workflows/undo.md": "791e0bf96d9a057f",
"gsd-core/workflows/update.md": "baae1a977fbeba49",
"gsd-core/workflows/validate-phase.md": "0e153ccb3bdb9dda",
"gsd-core/workflows/verify-phase.md": "33a17f66c8291096",
"gsd-core/workflows/verify-phase.md": "0ef74d5b7f7646f6",
"gsd-core/workflows/verify-work.md": "8a4157d179fce9c4",
"hooks/gsd-check-update-worker.js": "74edb6f6b1010c85",
"hooks/gsd-check-update.js": "81962511d619d038",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "843c1deeaa1cb5e7",
"agents/gsd-ui-researcher.md": "e09f0f7034eaa366",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "1e8a6492303366a0",
"agents/gsd-verifier.md": "3065cc4cf897078d",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -86,6 +86,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "1bd40c3f94d712b1",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -263,7 +264,7 @@
"gsd-core/workflows/note.md": "acc9130fb1e94f0b",
"gsd-core/workflows/pause-work.md": "09a6b8980f7b771a",
"gsd-core/workflows/plan-milestone-gaps.md": "022822b3b6971b75",
"gsd-core/workflows/plan-phase.md": "c3e494c63f5c04c5",
"gsd-core/workflows/plan-phase.md": "9781d27e30242ed8",
"gsd-core/workflows/plan-review-convergence.md": "8fb889570c17db15",
"gsd-core/workflows/plant-seed.md": "dc911406ada4d188",
"gsd-core/workflows/pr-branch.md": "e939128047e02395",
@@ -297,7 +298,7 @@
"gsd-core/workflows/undo.md": "59b8baa54efc4110",
"gsd-core/workflows/update.md": "e259898f86ae7133",
"gsd-core/workflows/validate-phase.md": "70d102b4d5113dd4",
"gsd-core/workflows/verify-phase.md": "ba797ce64e593a10",
"gsd-core/workflows/verify-phase.md": "67eefbd1f6417281",
"gsd-core/workflows/verify-work.md": "1e2a10168f8fdc2b",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",

View File

@@ -34,7 +34,7 @@
"agents/gsd-ui-checker.md": "bd8e9be4c75dcdcf",
"agents/gsd-ui-researcher.md": "f04d24e6459bd23d",
"agents/gsd-user-profiler.md": "622220df0654b6bf",
"agents/gsd-verifier.md": "88eac9841f52dd8c",
"agents/gsd-verifier.md": "e6353ed8a4baaa32",
"gsd-core/CHANGELOG.md": "e141e3fb369ff712",
"gsd-core/VERSION": "562368b20a64be95",
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
@@ -86,6 +86,7 @@
"gsd-core/references/gates.md": "7dc9fd3a3d6217c6",
"gsd-core/references/git-integration.md": "6ec36ea6b868655f",
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
@@ -263,7 +264,7 @@
"gsd-core/workflows/note.md": "1c1e466c764e3deb",
"gsd-core/workflows/pause-work.md": "5ce6a137bd9fc0f8",
"gsd-core/workflows/plan-milestone-gaps.md": "19911e87fd4185f2",
"gsd-core/workflows/plan-phase.md": "98210e414d5d9e0b",
"gsd-core/workflows/plan-phase.md": "55ddbe990fcaa74f",
"gsd-core/workflows/plan-review-convergence.md": "7e01c19b7b9a2aad",
"gsd-core/workflows/plant-seed.md": "9d36ecd08093a494",
"gsd-core/workflows/pr-branch.md": "cc28ab5cd9db16b9",
@@ -297,7 +298,7 @@
"gsd-core/workflows/undo.md": "18dec684fb1076f9",
"gsd-core/workflows/update.md": "cbf978622ad0f577",
"gsd-core/workflows/validate-phase.md": "a36cf2c688c261ac",
"gsd-core/workflows/verify-phase.md": "6adfc47bee438b5d",
"gsd-core/workflows/verify-phase.md": "8a89a915dad5960b",
"gsd-core/workflows/verify-work.md": "7586bdeeeb9ecba6",
"scripts/changeset/README.md": "86ff89331dfd94b2",
"scripts/changeset/cli.cjs": "68f92a344b199271",

View File

@@ -513,3 +513,111 @@ describe('probe-core: projectProhibitions descriptor projection (CHK-02)', () =>
assert.ok(!('check_rule' in projected[0]), 'descriptor-less item gains no check_rule');
});
});
// ─── Honest verifier (#1154): truth-axis abstention — the verify-time MIRROR of #644's
// prohibition judgment-tier (ADR-550 D4), applied to the edge `backstop` truth tier (D7a).
// Per ADR-550 D5 the deterministic, CI-testable surface is the disposition helper + the
// projection ROUND-TRIP — NEVER the LLM verdict (a test asserting the model's judgment is
// vacuous and rejected). The abstain-on-unconfirmed-backstop case is the REGRESSION
// (trek-e review condition 5) that must fail RED on `next` before the fix.
const FM_SCRIPT = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'frontmatter.cjs');
const fm = require(FM_SCRIPT);
// Serialize projected truths into a plan-frontmatter `must_haves.truths` block exactly as
// plan-phase emits it — a backstop truth as a flat-scalar object (ADR-550 #1278: flat scalars,
// NEVER a nested object), a plain inferable truth as a bare string.
function renderTruthsBlock(projected) {
const lines = ['---', 'must_haves:', ' truths:'];
for (const t of projected) {
if (typeof t === 'string') {
lines.push(` - ${t}`);
} else {
lines.push(` - statement: ${t.statement}`);
if (t.verification) lines.push(` verification: ${t.verification}`);
}
}
lines.push('---');
return lines.join('\n');
}
describe('probe-core: truthStatement / truthVerification normalizers (#1154, Hyrum backward-compat)', () => {
test('truthStatement extracts text from a plain-string truth and an object-form truth identically', () => {
assert.equal(pc.truthStatement('Overlapping intervals are merged'), 'Overlapping intervals are merged');
assert.equal(
pc.truthStatement({ statement: 'Adjacent intervals merge', verification: 'backstop' }),
'Adjacent intervals merge',
);
});
test('truthVerification returns the tier for an object-form truth and null for a plain string (no spurious tier)', () => {
assert.equal(pc.truthVerification({ statement: 'Adjacent intervals merge', verification: 'backstop' }), 'backstop');
assert.equal(pc.truthVerification('Overlapping intervals are merged'), null);
assert.equal(pc.truthVerification({ statement: 'x', verification: 'explicit' }), 'explicit');
});
});
describe('probe-core: dispositionForUnverifiableTruth (#1154, ADR-550 D4 truth-axis mirror)', () => {
test('abstain-on-unconfirmed-backstop (condition 5, REGRESSION): a backstop truth with no explicit evidence disposes insufficient_spec/unverified/flagged — never green', () => {
const d = pc.dispositionForUnverifiableTruth(
{ statement: 'Adjacent/touching intervals [1,2],[2,3] merge', verification: 'backstop' },
{ evidence: [] },
);
assert.equal(d.status, 'unverified', 'a backstop truth with no explicit evidence is unverified');
assert.equal(d.flagged, true, 'and flagged — never a silent pass (ADR-550 D4)');
assert.equal(d.tier, 'backstop', 'the backstop tier is echoed unchanged');
assert.equal(
d.reason,
'insufficient_spec',
'carries the distinguishable insufficient_spec reason code so human_needed is not conflated with ordinary manual-UAT',
);
});
test('pass-on-wired-backstop: a backstop truth WITH explicit evidence (a wired held-out/property test) disposes green — abstention is for the unconfirmable only', () => {
const d = pc.dispositionForUnverifiableTruth(
{ statement: 'Adjacent/touching intervals [1,2],[2,3] merge', verification: 'backstop' },
{ evidence: [{ test: 'tests/intervals.property.test.cjs', passed: true }] },
);
assert.equal(d.status, 'green');
assert.equal(d.flagged, false);
assert.equal(d.tier, 'backstop');
});
test('over-abstention guard (AC#3): a plain inferable truth is NEVER routed to abstention', () => {
const d = pc.dispositionForUnverifiableTruth('Overlapping intervals are merged', { evidence: [] });
assert.equal(d.status, 'green', 'a plain inferable truth is graded normally, never abstained');
assert.equal(d.flagged, false);
});
test('over-abstention guard (AC#3): an explicit-tier truth NEVER abstains even with no evidence (only backstop triggers it)', () => {
const d = pc.dispositionForUnverifiableTruth({ statement: 'Symbol X is wired', verification: 'explicit' }, { evidence: [] });
assert.equal(d.status, 'green', 'an explicit (inferable) truth never abstains');
assert.equal(d.flagged, false);
});
});
describe('probe-core: projectTruths (#1154, conservative serializer — Postel) + round-trip parity (condition 4, ADR-550 D5b)', () => {
test('projectTruths emits the flat-scalar backstop marker and collapses inferable truths to plain strings', () => {
const projected = pc.projectTruths([
{ statement: 'Adjacent intervals merge', verification: 'backstop' },
'Overlapping intervals are merged',
{ statement: 'Symbol X is wired', verification: 'explicit' },
]);
assert.deepEqual(projected, [
{ statement: 'Adjacent intervals merge', verification: 'backstop' },
'Overlapping intervals are merged',
'Symbol X is wired',
], 'only a backstop truth carries a structured marker; explicit/inferable truths stay bare strings (no spurious markers)');
});
test('round-trip parity (SPEC backstop edge → must_haves.truths marker → read-back): the marker survives as a structured field, plain truths byte-identically', () => {
const projected = pc.projectTruths([
{ statement: 'Adjacent intervals merge', verification: 'backstop' },
'Overlapping intervals are merged',
]);
const parsed = fm.parseMustHavesBlock(renderTruthsBlock(projected), 'truths');
assert.equal(pc.truthVerification(parsed[0]), 'backstop', 'the backstop marker survives the round-trip as a structured field, not prose (#1110 fragility avoided)');
assert.equal(pc.truthStatement(parsed[0]), 'Adjacent intervals merge');
assert.equal(pc.truthStatement(parsed[1]), 'Overlapping intervals are merged');
assert.equal(pc.truthVerification(parsed[1]), null, 'a plain truth round-trips with no marker (Hyrum byte-identity backward-compat)');
});
});

View File

@@ -52,7 +52,7 @@
"note.md": 6563,
"pause-work.md": 14397,
"plan-milestone-gaps.md": 11765,
"plan-phase.md": 93973,
"plan-phase.md": 94459,
"plan-review-convergence.md": 23468,
"plant-seed.md": 11741,
"pr-branch.md": 15919,
@@ -86,6 +86,6 @@
"undo.md": 10431,
"update.md": 21053,
"validate-phase.md": 10745,
"verify-phase.md": 38228,
"verify-phase.md": 40728,
"verify-work.md": 35212
}