fix(quality): record current-tree trust boundary
ci/woodpecker/pr/ci Pipeline failed

This commit is contained in:
2026-07-31 22:41:30 -05:00
parent bd603da4b0
commit ada0cbe60e
12 changed files with 248 additions and 43 deletions
+51 -3
View File
@@ -77,6 +77,23 @@
}
]
},
{
"id": "RM02-CURRENT-TREE-BOUNDARY",
"originalText": "assert that every merged commit passed every required gate, evaluated AGAINST THAT COMMIT'S OWN TREE — not against current main.",
"currentText": "PR CI performs unprivileged, fail-closed current-tree verification only; isolated per-commit replay is deferred to RM-60's protected post-merge/main authority as detection with quarantine/revert, not pre-merge prevention.",
"claimType": "security",
"source": "docs/PRD.md#rm02-req-10-meaning-change-provenance",
"meaningChanges": [
{
"originalText": "assert that every merged commit passed every required gate, evaluated AGAINST THAT COMMIT'S OWN TREE — not against current main.",
"restatement": "PR CI performs unprivileged, fail-closed current-tree verification only; isolated per-commit replay is deferred to a protected post-merge/main authority as detection with quarantine/revert, not pre-merge prevention.",
"reason": "PR-controlled code would otherwise receive and could directly use the namespace capability intended to contain it; the pre-execution trust boundary is absent at the repository layer.",
"finding": "D-25",
"task": "RM-60/RM-59",
"date": "2026-08-01"
}
]
},
{
"id": "QUALITY-TYPECHECK",
"originalText": "The root typecheck rejects a TypeScript type error.",
@@ -194,6 +211,10 @@
"id": "GENERATED-STATE-SCOPE",
"criterionId": "CHECKOUT-PREFLIGHT"
},
{
"id": "EXECUTION-TRUST-BOUNDARY",
"criterionId": "RM02-CURRENT-TREE-BOUNDARY"
},
{
"id": "CRITERION-RESTATEMENT",
"criterionId": "RM02-MEANING-PROVENANCE"
@@ -235,9 +256,11 @@
}
],
"mergeAssertions": {
"mode": "prospective-first-parent-replay",
"trustDependencies": ["RM-25", "RM-59"],
"providerEvidence": "assert retained terminal-success records for prior commits; report absent, expired, or current-running evidence without inference"
"mode": "unprivileged-current-tree-pr-verification",
"deferredReplayOwner": "RM-60",
"trustDependencies": ["RM-25", "RM-59", "RM-60"],
"providerEvidence": "assert retained current-tree terminal-success records for prior commits; report absent, expired, or current-running evidence without inference",
"postMergeResponse": "protected isolated replay is detection, not prevention; quarantine and revert on failure"
},
"gates": [
{
@@ -471,6 +494,31 @@
}
]
}
},
{
"id": "privileged-pr-gate",
"criterionIds": ["RM02-CURRENT-TREE-BOUNDARY"],
"mustFail": true,
"invocation": ["node", "--test", "scripts/gate-wiring.test.mjs"],
"required": {
"exitCode": 1,
"outputPattern": "privileged"
},
"actual": {
"exitCode": 1,
"outputPattern": "privileged"
},
"reasonPattern": "privileged",
"fixture": {
"copyPaths": [".woodpecker/ci.yml", "scripts/gate-wiring.test.mjs", "package.json"],
"replaceFiles": [
{
"path": ".woodpecker/ci.yml",
"find": " gate-verify:\n image: *node_image\n",
"replace": " gate-verify:\n image: *node_image\n privileged: true\n"
}
]
}
}
]
},