Skip to content

feat(r110): enforce forced-postrodeo via approve preflight (REQ-QB-110)#7

Open
michaeljboscia wants to merge 1 commit into
mainfrom
enforce-postrodeo-obligation
Open

feat(r110): enforce forced-postrodeo via approve preflight (REQ-QB-110)#7
michaeljboscia wants to merge 1 commit into
mainfrom
enforce-postrodeo-obligation

Conversation

@michaeljboscia

Copy link
Copy Markdown
Owner

What

Closes the enforcement gap found while auditing the open actions: REQ-QB-110/111 shipped the components but wired up no enforcementreconcile --require-postrodeo existed, the postrodeo/recorded status poster existed, the nag hook existed, but nothing invoked the obligation check. Forced-postrodeo was built-but-dormant. The memory note that "the postrodeo/recorded required 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 merge now runs an obligation preflight — it refuses to post homebox/approved while the previous merge in the same repo has no postrodeo_completed event. Clear it with gr postrodeo <prior-build>.

  • No GitHub ruleset change, no deferred build_completed emitter, no deadlock.
  • The postrodeo/recorded required 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

  • 3 blind Codex structural rounds (trust-boundary code): R1 found 4 defects, R2 found 1 new (in my R1 fix), R3 APPROVE. Trail: findings/postrodeo-obligation-audit-codex.md.
  • Hardening: per-repo scoping, exact-SHA-only self-skip (no trust of caller --pr or a caller-controllable PR head), fail-CLOSED on corrupt WORM, non-object guards.
  • 19/19 canaries pass (1 skip = conftest local-absent) incl. 7 obligation cases: cross-repo collision, stale-PR reuse, corrupt-log, and a lying-gh-on-PATH regression guard.
  • harness-selftest (REQ-QB-111) passes on the edited scripts.

⚠️ First-approval note for the operator

Once this lands and the Homebox pulls it, the next gr approve will 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 with gr postrodeo before approving the next PR.

🤖 Generated with Claude Code

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant