feat(r110): enforce forced-postrodeo via approve preflight (REQ-QB-110)#7
Open
michaeljboscia wants to merge 1 commit into
Open
feat(r110): enforce forced-postrodeo via approve preflight (REQ-QB-110)#7michaeljboscia wants to merge 1 commit into
michaeljboscia wants to merge 1 commit into
Conversation
REQ-110/111 shipped the components (postrodeo status poster, reconcile --require-postrodeo, nag hook) but closed no enforcement loop — nothing invoked the obligation check, so forced-postrodeo was built but dormant. Wire it where the obligation model says it belongs: the merge sign-off is the "next authoritative action", so approve.sh --kind merge now refuses to post homebox/approved while the PREVIOUS merge in the same repo has no postrodeo_completed. No GitHub ruleset change, no deferred build_completed emitter, no deadlock (clear it with `gr postrodeo`). Hardened over 3 blind Codex rounds (R1 4 defects, R2 1 new, R3 approve): - per-repo scoping (global WORM log must not cross-block/clear repos) - self-skip only on exact prior-head SHA; no trust of caller --pr or a caller-controllable PR head (both bypassed an outstanding obligation) - fail-CLOSED + diagnostic on a corrupt/unparseable WORM log - 7 obligation canaries incl. cross-repo, stale-PR, corrupt-log, lying-gh Doc: quality-bar.md §11 as-built note; the postrodeo/recorded required status check + Strict attestation gate remain DEFERRED (need the build_completed emitter). Audit trail: findings/postrodeo-obligation-audit-codex.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Closes the enforcement gap found while auditing the open actions: REQ-QB-110/111 shipped the components but wired up no enforcement —
reconcile --require-postrodeoexisted, thepostrodeo/recordedstatus poster existed, the nag hook existed, but nothing invoked the obligation check. Forced-postrodeo was built-but-dormant. The memory note that "thepostrodeo/recordedrequired check works today" did not hold against GitHub's per-head-SHA check semantics.How
The obligation model says a completed build blocks the next authoritative action until its retrospective is recorded. In this system that action is the Homebox merge sign-off, so the gate lives there:
approve.sh --kind mergenow runs an obligation preflight — it refuses to posthomebox/approvedwhile the previous merge in the same repo has nopostrodeo_completedevent. Clear it withgr postrodeo <prior-build>.build_completedemitter, no deadlock.postrodeo/recordedrequired status check and the Strict signed-attestation release gate remain DEFERRED (both need the emitter; a bare required check with no emitter would gate every PR pre-merge, not implement the obligation model). Documented in quality-bar.md §11.Verification
findings/postrodeo-obligation-audit-codex.md.--pror a caller-controllable PR head), fail-CLOSED on corrupt WORM, non-object guards.gh-on-PATH regression guard.harness-selftest(REQ-QB-111) passes on the edited scripts.Once this lands and the Homebox pulls it, the next
gr approvewill require the prior merge in the WORM (PR #6 / REQ-110/111) to have a postrodeo. That's the gate working as designed — clear the backlog withgr postrodeobefore approving the next PR.🤖 Generated with Claude Code