Repository navigation
fix(OMN-20368): a Linear Done needs a PASS receipt bound to every acceptance criterion - #2500
Merged
Merged
Conversation
…eptance criterion; ticked boxes and merged PRs no longer substitute The done-flip guard admitted OMN-20180/20181/20182 on its merged-PR path after dod_verify refused them with NO_ACCEPTANCE_CHECKS: the lane ticked the boxes itself and the contracts bind no criterion. The bound-receipt bar is now the one sufficient condition on every path, receipts taken against a changed contract entry are stale, an edit that ticks an acceptance box needs the same receipt, and the guard fails closed in any cwd, lite mode, mask, or on its own error. The OCC fetch now runs in its own process group with no captured output and is killed at its deadline: a captured-output fetch whose helper outlived git hung the hook past the harness timeout, and the harness let two Done-class writes through unchecked during the live probe. Onex-Lane: done-gate-0c2f Onex-Session: 69b8e79936f1496a92c4e3410b5319f2
…fter a private repository The public-repo hygiene gate reads the local variable name as a private repository name on the lines this change moved. The tree count fell by six; the ratchet is tightened to hold it. Onex-Lane: done-gate-0c2f Onex-Session: 69b8e79936f1496a92c4e3410b5319f2
Onex-Lane: done-gate-0c2f Onex-Session: 69b8e79936f1496a92c4e3410b5319f2
jonahgabriel
force-pushed
the
jonah/omn-20368-done-flip-guard-bound-receipt
branch
from
October 2, 2026 15:35
696280b to
1fc6e2a
Compare
jonahgabriel
pushed a commit
to OmniNode-ai/onex_change_control
that referenced
this pull request
Oct 2, 2026
) * evidence(OMN-20368): author OCC companion for OmniNode-ai/omniclaude#2500 OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 696280bf9c6e63a10479fdaad6419c7275d9d66a. * evidence(OMN-20368): self-bind OCC#12364 + rebind contract_sha256 --------- Co-authored-by: omnimarket-bot <bot@omninode.ai>
jonahgabriel
enabled auto-merge (squash)
October 2, 2026 15:38
Contributor
✅ Hostile Reviewer — PASSEDBlocking findings (critical/error): 0 Findings
Gate semantics (pilot phase)
Powered by omniintelligence.review_pairing.cli_review — node-based adversarial review via HandlerLlmCliSubprocess (OMN-8524) |
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.
Ticket: OMN-20368
Why
On 2026-10-02 OMN-20180, OMN-20181 and OMN-20182 reached Done after dod_verify refused them with NO_ACCEPTANCE_CHECKS. The done-flip guard admitted them on its merged-PR path (
durable_evidence:all_prs_merged): the only acceptance check it applied everywhere was the unchecked-box scan, and the closing lane had ticked the boxes itself. Their contracts (e.g.contracts/OMN-20180.yamlon onex_change_control origin/dev) declare nobinds_ac, so no criterion was ever bound to a check.What changes
binds_ac, each discharged by a PASS receipt. A merged PR, a deploy-readback marker, the close-if-done label and OMN-15712's superseded attachments become further conditions or nothing; none allows on its own.contract_entry_sha256, recomputed with omnibase_core'scompute_contract_entry_sha256), or the legacy whole-filecontract_sha256; a receipt naming neither is refused. A receipt behind a merged PR is judged by its commit and contract hash; the no-PR freshness window still applies to no-PR tickets.descriptionorpatchedit that checks a box not checked before is refused without it; a create with a checked box is refused; when the current description cannot be read, every checked box counts as a tick.main()refuses whendecide()raises. The inventory entry recordslite_mode_exit: falseand no mask gate.Tests
tests/hooks/test_done_flip_guard_requires_bound_receipt.py(28 tests, real git OCC fixture):-k no_acceptance_checks,-k ticked,-k stale,-k bound_pass,-k fail_closed. RED control: 22 of them fail against the origin/dev guard. Existing guard, false-positive and hook-inventory suites updated to the new contract: 147 passed locally.Lab proof
Hook-side change on the operator Mac's
local_macos_claude_hooksprofile; no runtime lane is involved. Live proof on the hot-patched load path: on scratch ticket OMN-20373 (canceled), an in-sessionsave_issuepatch that ticks a box and an in-sessionsave_issue state=Donewere both refused bypre_tool_use_done_flip_guard.shwithac_tick_without_receiptandno_bound_dod_receipt.Not in this PR
Node-side Done writers that call the Linear API directly do not pass through this hook (node_linear_triage
_mark_done, the sync-revert watchdog, the evidence-autoclose closer). The closer already requiresbinds_accoverage; the other two are listed on OMN-20368.Evidence-Ticket: OMN-20368
Evidence-Source: OCC#12364