Skip to content

fix(OMN-15722): raise starved guard-job timeout budgets in OCC ci.yml - #6173

Merged
jonahgabriel merged 12 commits into
devfrom
jonah/omn-15722-occ-guard-timeout-budget
Aug 9, 2026
Merged

jonahgabriel merged 12 commits into
devfrom
jonah/omn-15722-occ-guard-timeout-budget

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Aug 7, 2026 •

Copy link
Copy Markdown
Contributor

Root cause

A job that hits its timeout-minutes wall is recorded conclusion=cancelled, not failure. OCC's sole required umbrella context CI Summary is a fail-closed needs: aggregator that compares each member's result against "success", so a guard that passed on its merits and simply ran past a too-small budget reddens the one required context. On this PR's run 31222755192, inside that single run and for the same repo and SHA, Checkout code ranged 6s to 1358s (22m38s) and setup-uv ranged 93s to 571s (9m31s) across the jobs that reached it, while the ten budgeted gates' own steps took at most 53s. Checkout alone has been observed at 22m38s, so every dev budget (5, 10, 20, 25) sat below an already-observed single-phase latency, and a budget sized to a job's own worst total is the same defect one contention spike later. This PR therefore sets a uniform 45m floor rather than bespoke per-job numbers.

What changed

timeout-minutes only, on every ci-summary needs: member that declares one (ten of them; the other eighteen declare none). origin/dev value → new value:

  • no-noncanonical-lifecycle-classes: 10 → 45
  • validate-prod-promotion-grants: 5 → 45
  • check-platform-leads-review-tripwire: 5 → 45
  • check-bot-authored-authz-guard: 5 → 45
  • precommit-parity-gate: 10 → 45
  • predicate-parity: 10 → 45
  • contract-corpus-ratchets: 20 → 45
  • yamlfmt-contamination-ratchet: 20 → 45
  • supersession-binding-ratchet: 20 → 45
  • contract-shape-v1: 25 → 45

One inline comment on validate-prod-promotion-grants is rewritten to carry the rationale; it also corrects a false figure — gh api orgs/OmniNode-ai/actions/runners reports 64 runners labelled omnibase-ci, not the 48 the old comment claimed.

contract-shape-v1 was added in the latest revision: it was cancelled at 25m50s on this PR's own run 31222755192 with the cancelled step being Checkout code, the identical cause, and earlier revisions of this PR missed it.

Self-test

pull_request workflows evaluate from the PR's own merge ref, so this PR's runs execute the raised budgets and demonstrate the fix on themselves.

Not a gate weakening

Every job still runs and still must reach conclusion=success; none gained continue-on-error; and ci-summary's job block — its needs: list and its fail-closed != "success" comparisons — is byte-identical to origin/dev (133 lines, sha256 26e130ba973ebcc0e34c4193cdec09b3a60510b4d0d84d185a0cd3c2223c93a1 on both sides). A larger budget changes only how long a guard may take before being killed.

PRs this unblocks

#6122, #6144, #6149, #6155, #6161

Scope disclosure

The ci.yml change alone was un-mergeable: run 1 at head 2df62fc62 failed occ-preflight / eligibility with reason missing_contract for OMN-15722. This PR therefore also carries contracts/OMN-15722.yaml and three PASS receipts under drift/dod_receipts/OMN-15722/. That is scope beyond the timeout bump, present out of necessity.

Durable fix, out of scope here

The gates themselves are fast — at most 53s of own-work on run 31222755192; the cost is the preamble — actions/checkout at fetch-depth: 0 plus setup-uv provisioning. Reducing that is the durable fix; it is not attempted here and belongs in its own ticket.

Evidence-Ticket: OMN-15722
Evidence-Source: OCC#6174

Summary by CodeRabbit

  • Improvements

    • CI validation jobs now allow up to 45 minutes, reducing failures caused by long-running checks.
    • Validation continues to fail safely when required checks, timeout settings, or status protections are missing.
    • Added verification records confirming timeout coverage, fail-closed safeguards, and pull request consistency.
  • Documentation

    • Added contract and audit evidence documenting the updated CI requirements and their successful verification.

Five guard jobs carry timeout-minutes budgets below the observed latency of
the self-hosted omnibase-ci runner fleet under concurrent load. When a job
hits its own timeout wall GitHub records conclusion=cancelled, and CI Summary
(the sole required umbrella context on onex_change_control dev) compares each
needs.<job>.result against "success" fail-closed - so a guard that passed gets
scored as a violation and turns the required context red.

Raise the three 5-minute guards and the two 10-minute jobs to 20 minutes:
  - validate-prod-promotion-grants         5  -> 20
  - check-platform-leads-review-tripwire   5  -> 20
  - check-bot-authored-authz-guard         5  -> 20
  - predicate-parity                      10  -> 20
  - no-noncanonical-lifecycle-classes     10  -> 20

Not a gate weakening: every guard still runs, still must reach
conclusion=success, and CI Summary's fail-closed != "success" comparison is
untouched. Only the wall-clock budget moved.

Evidence-Ticket: OMN-15722
@coderabbitai

coderabbitai Bot commented Aug 7, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The pull request raises ten CI guard-job timeouts to 45 minutes. It adds an OMN-15722 contract and receipts that verify timeout values, fail-closed gating, absent top-level concurrency, and PR 6173 binding.

Changes

CI guard timeout budgets

Layer / File(s) Summary
Timeout budgets and contract
.github/workflows/ci.yml, contracts/OMN-15722.yaml
Ten guard jobs now use 45-minute timeouts. The contract records timeout, fail-closed gating, concurrency, and CI evidence checks.
Guard behavior validation
drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml, drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml
The receipts validate all ten timeout budgets, required dependencies, fail-closed predicates, and the absence of top-level concurrency.
Pull request binding validation
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml, drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml, contracts/OMN-15722.yaml, drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml
The receipts verify PR 6173 binding and replace the initial file-count check with corrected self-inclusive counts of seven files.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested labels: ci:ready

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary change: raising timeout budgets for starved guard jobs in OCC CI.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jonah/omn-15722-occ-guard-timeout-budget

Comment @coderabbitai help to get the list of available commands.

@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

OCC autobind did not mint a companion for this PR: no changed-file candidate could be proven RED against the merge base, and emitting a PR-existence probe instead would be non-falsifiable evidence (OMN-15247). Hand-authored evidence is required.

…d timeout fix

The first push carried no contracts/OMN-15722.yaml, so both of the two
content-gating required contexts on this PR failed with the same single root
cause: validator_occ_merge_eligibility reported
reason=missing_contract / missing_contracts=["OMN-15722"] on
`occ-preflight / eligibility` (job 93010633789) and on `verify / verify`
step 21 "Run OCC Eligibility" (job 93010633875). Note step 7
"Resolve Evidence-Source" was SKIPPED in that same job, confirming the
in-repo Evidence-Source exemption - the missing contract was the only blocker.

Contract declares three dod_evidence items, all probed live and receipted with
real command output (no fabricated receipts):

  dod-occ-guard-timeout-budgets-raised  - substantive (L1): parses ci.yml and
    asserts all five named guard jobs declare timeout-minutes 20.
  dod-occ-guards-still-fail-closed      - substantive (L1): asserts all five
    guards remain in ci-summary's needs list, carry no continue-on-error, still
    have their literal fail-closed `result }}" != "success"` comparison in
    ci.yml, and that ci.yml still declares no top-level concurrency block.
    Falsifiability proven by negative control - rewriting the predicate-parity
    comparison to an equality form makes the same probe exit 1 with
    unguarded=['predicate-parity'].
  occ-self-bind-pr-6173                 - binding stamp only (L0), companion
    PR identity for receipt-gate binding.

Local verification: all three probes exit 0 / stdout "true"; the eligibility
validator now returns eligible=true reason=eligible
("OCC evidence is present, PASS, hash-bound, and PR-bound") with all three
receipt ids resolved. Full pre-commit over contract + receipts + ci.yml passes,
including Receipt Honesty Gate, Receipt Hardening Gate, Contract Substance
Floor, DoD-authoring hygiene, Canonical contract shape v1, and the
Evidence-Commit SHA Existence Gate.

Evidence-Ticket: OMN-15722
…eceipts

All three OMN-15722 receipts asserted no_source_change: true. Per
omnibase_core model_dod_receipt.py that field is RUNTIME_OPS-only and
asserts the change produced NO repo diff and NO PR. This change has a
5-line ci.yml diff and IS PR #6173, so the assertion was materially false.

These receipts carry evidence_class: None and pr_number: 6173, so the
field does not apply to them at all -- removed rather than set to false.
Its default is False, which is the truthful value. All three re-validate
against ModelDodReceipt with no_source_change=False.

Note: the model validator enforces only the RUNTIME_OPS -> True
direction, not the inverse, so a non-RUNTIME_OPS receipt asserting
no_source_change: true alongside a pr_number validates cleanly and no CI
gate would have caught this. Model gap, flagged not fixed here.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml`:
- Line 13: Add the missing raw-byte contract_sha256 binding to both
drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml (line
13) and
drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
(line 10). After the contract is final, regenerate both contract_sha256 and
existing contract_entry_sha256 values using
omnibase_core.validation.validator_receipt_gate.
- Around line 1-5: Rename both receipt files at
drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml and
drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
to timestamped filenames matching
drift/dod_receipts/<TICKET>/<ITEM_ID>/<run_timestamp>.yaml, preserving their
contents. Update scripts/auto_scaffold_contract.py so newly generated receipts
use timestamped filenames while remaining discoverable by
scripts/check_dod_compliance.py.

In `@drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml`:
- Line 12: Update the commit_sha field in the receipt metadata to the commit
that adds or updates this receipt in onex_change_control, replacing the current
CI-only commit hash while preserving the expected receipt-authoring commit
reference.
- Around line 1-2: Rename the receipt file from command.yaml to the
timestamp-based 2026-08-07T22:29:26Z.yaml path, preserving its contents. Update
auto_scaffold_contract.py so newly generated receipts use the timestamp-based
filename instead of command.yaml; leave compliance lookup behavior unchanged.
- Line 9: Rename the receipt file currently named command.yaml to the
timestamped canonical filename 2026-08-07T22:29:26Z.yaml, preserving its
ModelDodReceipt contents and contract_entry_sha256 value.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a3bb60cd-55dc-4268-a272-5cf92c8d4e5a

📥 Commits

Reviewing files that changed from the base of the PR and between 0da939e and 1d2ed82.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • contracts/OMN-15722.yaml
  • drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
  • drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml

Comment on lines +1 to +5
---
schema_version: 1.0.0
ticket_id: OMN-15722
evidence_item_id: dod-occ-guards-still-fail-closed
check_type: command

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

fd -a 'auto_scaffold_contract.py|check_receipt_hardening.py|validator_receipt_gate.py' . |
  xargs -r rg -n -C 3 'command\.yaml|run_timestamp|dod_receipts|receipt.*path'

Repository: OmniNode-ai/onex_change_control

Length of output: 50387


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- target receipts ---'
for f in \
  drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml \
  drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
do
  if [ -f "$f" ]; then
    echo "### $f"
    cat -n "$f"
  else
    echo "MISSING: $f"
  fi
done

printf '%s\n' '--- resolver and path rules ---'
rg -n -C 5 --glob '*.py' --glob '*.yaml' --glob '*.md' \
  'validator_receipt_gate|command\.yaml|run_timestamp|receipt.*path|dod_receipts/.+ITEM_ID|ModelDodReceipt' \
  scripts tests drift docs .github 2>/dev/null | head -n 500

Repository: OmniNode-ai/onex_change_control

Length of output: 45290


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- candidate receipt-gate files ---'
fd -a -t f . | rg '(^|/)(validator_receipt_gate|.*receipt.*gate|check_dod_compliance|auto_scaffold_contract)\.(py|yaml|yml|md)$'

printf '%s\n' '--- receipt discovery implementations ---'
rg -n -C 8 --glob '*.py' \
  'rglob|glob|iterdir|command\.yaml|run_timestamp.*yaml|canonical_dir|receipt.*path|receipt.*file' \
  scripts src tests | rg -v 'tests/test_check_receipt_hardening.py|tests/test_auto_scaffold_contract.py' | head -n 600

printf '%s\n' '--- actual receipt filename shapes ---'
git ls-files 'drift/dod_receipts/**/*.yaml' |
  awk -F/ '{print $NF}' |
  sort | uniq -c | sort -k2,2

Repository: OmniNode-ai/onex_change_control

Length of output: 46873


Use timestamped receipt filenames.

The required canonical path is drift/dod_receipts/<TICKET>/<ITEM_ID>/<run_timestamp>.yaml. Both receipts use command.yaml. scripts/check_dod_compliance.py scans any *.yaml file under the ticket, so command.yaml remains discoverable. Update both receipts and scripts/auto_scaffold_contract.py together.

📍 Affects 2 files
  • drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml#L1-L5 (this comment)
  • drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml#L1-L5
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml`
around lines 1 - 5, Rename both receipt files at
drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml and
drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
to timestamped filenames matching
drift/dod_receipts/<TICKET>/<ITEM_ID>/<run_timestamp>.yaml, preserving their
contents. Update scripts/auto_scaffold_contract.py so newly generated receipts
use timestamped filenames while remaining discoverable by
scripts/check_dod_compliance.py.

Sources: Coding guidelines, Learnings

not in src]; conc=[k for k in w if str(k)=='concurrency']; sys.exit('gate weakened missing=%s soft=%s
unguarded=%s concurrency=%s' % (missing, soft, unguarded, conc)) if (missing or soft or unguarded or
conc) else print('true')"
contract_entry_sha256: sha256:f5ffbaaee8557bc072b007b70f25805e386bf5b76fa8d23234e080d9bdae26df

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add the required whole-contract SHA-256 binding.

Both receipts contain contract_entry_sha256, but neither contains contract_sha256 for the raw bytes of contracts/OMN-15722.yaml. Regenerate both bindings with omnibase_core.validation.validator_receipt_gate after the contract is final.

  • drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml#L13-L13: add the raw-byte contract_sha256.
  • drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml#L10-L10: add the raw-byte contract_sha256.

As per coding guidelines, bind both contract_sha256 and contract_entry_sha256 using omnibase_core.validation.validator_receipt_gate.

📍 Affects 2 files
  • drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml#L13-L13 (this comment)
  • drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml#L10-L10
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml`
at line 13, Add the missing raw-byte contract_sha256 binding to both
drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml (line
13) and
drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
(line 10). After the contract is final, regenerate both contract_sha256 and
existing contract_entry_sha256 values using
omnibase_core.validation.validator_receipt_gate.

Source: Coding guidelines

Comment on lines +1 to +2
---
schema_version: 1.0.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n 'command\.yaml|run_timestamp|drift/dod_receipts' .

Repository: OmniNode-ai/onex_change_control

Length of output: 50388


🏁 Script executed:

#!/bin/bash
set -euo pipefail

target='drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'

printf '%s\n' '--- target file ---'
cat -n "$target"

printf '%s\n' '--- nearby receipt paths ---'
find drift/dod_receipts/OMN-15722 -maxdepth 3 -type f -print 2>/dev/null | sort

printf '%s\n' '--- relevant validators, schemas, and scaffolds ---'
rg -n -i --glob '!drift/dod_receipts/**' \
  'ModelDodReceipt|dod_receipt|receipt.*(path|filename|lookup)|run_timestamp|command\.yaml' \
  .github scripts src tests tools 2>/dev/null | head -n 1200

printf '%s\n' '--- guideline and schema references ---'
rg -n -i 'drift/dod_receipts/.+run_timestamp|omnibase_core\.ModelDodReceipt|DoD receipts' \
  . --glob '!drift/dod_receipts/**' | head -n 500

Repository: OmniNode-ai/onex_change_control

Length of output: 50387


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- compliance lookup and migration rules ---'
sed -n '260,365p' scripts/check_dod_compliance.py
sed -n '225,335p' src/onex_change_control/handlers/handler_dod_sweep.py

printf '%s\n' '--- receipt hardening path rules ---'
sed -n '950,995p' scripts/validation/check_receipt_hardening.py
sed -n '1525,1580p' scripts/validation/check_receipt_hardening.py

printf '%s\n' '--- scaffold implementation ---'
sed -n '1,35p' scripts/auto_scaffold_contract.py
sed -n '200,242p' scripts/auto_scaffold_contract.py

printf '%s\n' '--- workflow receipt discovery ---'
sed -n '710,750p' .github/workflows/call-receipt-gate.yml
sed -n '1015,1060p' .github/workflows/ci.yml
sed -n '1038,1060p' .github/workflows/ci.yml

printf '%s\n' '--- exact target references ---'
rg -n -F 'OMN-15722/occ-self-bind-pr-6173' . --glob '!drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'

Repository: OmniNode-ai/onex_change_control

Length of output: 19654


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- repository receipt-location contract ---'
sed -n '1,220p' docs/RECEIPT_LOCATIONS.md 2>/dev/null || true
sed -n '1,70p' scripts/check_dod_compliance.py
sed -n '1,85p' src/onex_change_control/handlers/handler_dod_sweep.py

printf '%s\n' '--- focused behavioral verifier ---'
python3 - <<'PY'
from pathlib import Path
import re

root = Path(".")
target = root / "drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml"
text = target.read_text(encoding="utf-8")
run_timestamp = re.search(r"^run_timestamp:\s*['\"]?([^'\"]+)['\"]?\s*$", text, re.MULTILINE)
print("target_exists:", target.is_file())
print("target_filename:", target.name)
print("run_timestamp:", run_timestamp.group(1) if run_timestamp else None)
print("guideline_shape_match:",
      bool(re.fullmatch(
          r"drift/dod_receipts/[^/]+/[^/]+/[^/]+\.yaml",
          target.as_posix(),
      )) and target.name != "command.yaml")

ticket_dir = root / "drift/dod_receipts/OMN-15722"
yaml_files = sorted(p.relative_to(ticket_dir).as_posix()
                    for p in ticket_dir.rglob("*.yaml"))
print("canonical_directory_yaml_files:", yaml_files)
print("canonical_directory_discovery_would_find_target:",
      "occ-self-bind-pr-6173/command.yaml" in yaml_files)

scaffold = (root / "scripts/auto_scaffold_contract.py").read_text(encoding="utf-8")
print("scaffold_hardcodes_command_yaml:",
      'receipt_path = receipt_subdir / f"{check_type}.yaml"' in scaffold)
print("scaffold_mentions_timestamp_filename:",
      "run_timestamp" in scaffold and "receipt_path" in scaffold)

compliance = (root / "scripts/check_dod_compliance.py").read_text(encoding="utf-8")
print("compliance_uses_recursive_yaml_discovery:",
      "canonical_dir.rglob(\"*.yaml\")" in compliance)
print("compliance_resolves_command_yaml_literal:",
      "command.yaml" in compliance)
PY

Repository: OmniNode-ai/onex_change_control

Length of output: 11754


Use the timestamp-based receipt path.

Rename this file to drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/2026-08-07T22:29:26Z.yaml. The compliance lookup already scans all YAML files under the ticket directory, so no lookup change is needed. Update scripts/auto_scaffold_contract.py because it still generates command.yaml.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml` around lines
1 - 2, Rename the receipt file from command.yaml to the timestamp-based
2026-08-07T22:29:26Z.yaml path, preserving its contents. Update
auto_scaffold_contract.py so newly generated receipts use the timestamp-based
filename instead of command.yaml; leave compliance lookup behavior unchanged.

Sources: Coding guidelines, Learnings

check_value: gh pr view 6173 --repo OmniNode-ai/onex_change_control --json number,state,headRefName --jq
'if (.number == 6173 and .state == "OPEN" and .headRefName == "jonah/omn-15722-occ-guard-timeout-budget")
then "true" else error("unexpected OCC self-bind PR state") end'
contract_entry_sha256: sha256:5e2ac23c4b89f0be86852c89e1cb52cc108faf159d4b8802741237b66c0c55f2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
receipt='drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
contract='contracts/OMN-15722.yaml'

test -f "$receipt"
test -f "$contract"
rg -n -C 6 'occ-self-bind-pr-6173|contract_entry_sha256' "$receipt" "$contract"
LC_ALL=C shasum -a 256 "$contract"
rg -n 'validator_receipt_gate|check_receipt_hardening' .

Repository: OmniNode-ai/onex_change_control

Length of output: 3350


🏁 Script executed:

#!/bin/bash
set -euo pipefail
receipt='drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
contract='contracts/OMN-15722.yaml'

printf '%s\n' '--- receipt ---'
cat -n "$receipt"
printf '%s\n' '--- contract entry ---'
sed -n '1,90p' "$contract"
printf '%s\n' '--- receipt gate references ---'
rg -n -C 4 'validator_receipt_gate|check_receipt_hardening|contract_entry_sha256|canonical.?json|ModelDodReceipt' . --glob '!drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
printf '%s\n' '--- hashes ---'
python3 - <<'PY'
import hashlib
from pathlib import Path
p = Path('contracts/OMN-15722.yaml')
print('raw_contract_sha256:', hashlib.sha256(p.read_bytes()).hexdigest())
PY

Repository: OmniNode-ai/onex_change_control

Length of output: 50388


🏁 Script executed:

#!/bin/bash
set -euo pipefail
receipt='drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
contract='contracts/OMN-15722.yaml'

printf '%s\n' '--- target receipt ---'
cat -n "$receipt"
printf '%s\n' '--- target contract section ---'
sed -n '1,75p' "$contract"
printf '%s\n' '--- targeted gate and hash references ---'
rg -n -C 5 'validator_receipt_gate|check_receipt_hardening|contract_entry_sha256|canonical.?json|ModelDodReceipt' \
  scripts tests .github contracts drift 2>/dev/null | head -n 1200
printf '%s\n' '--- candidate implementation files ---'
git ls-files | rg -i '(receipt|contract|dod|canonical)' | head -n 1200
printf '%s\n' '--- hashes ---'
python3 - <<'PY'
import hashlib
from pathlib import Path
p = Path('contracts/OMN-15722.yaml')
print('raw_contract_sha256:', hashlib.sha256(p.read_bytes()).hexdigest())
PY

Repository: OmniNode-ai/onex_change_control

Length of output: 50388


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf '%s\n' '--- hash implementation references ---'
rg -n -C 8 'def compute_contract_entry_sha256|compute_contract_entry_sha256\(' . --glob '*.py' --glob '*.md' --glob '*.yaml' | head -n 1000 || true
printf '%s\n' '--- hash-focused tests ---'
sed -n '45,85p' tests/test_check_receipt_hardening.py
sed -n '349,475p' tests/test_check_receipt_hardening.py
printf '%s\n' '--- dependency declarations ---'
rg -n -C 3 'omnibase-core|omnibase_core' pyproject.toml uv.lock requirements* 2>/dev/null | head -n 300 || true
printf '%s\n' '--- validator file candidates ---'
git ls-files | rg 'validator_receipt_gate|receipt_gate|check_receipt_hardening' || true

Repository: OmniNode-ai/onex_change_control

Length of output: 18999


🌐 Web query:

omnibase-core 0.46.7 validator_receipt_gate compute_contract_entry_sha256 HEADER_FIELDS

💡 Result:

In omnibase-core v0.46.7, the components you referenced relate to the framework's validation and contract management systems: validator_receipt_gate: This is a module within omnibase_core (located at src/omnibase_core/validation/validator_receipt_gate.py) [1]. It implements the "Enforcement by Receipt" mechanism, which verifies that pull requests cite Linear tickets with passing ModelDodReceipt artifacts [2]. It was previously known as receipt_gate.py [1]. compute_contract_entry_sha256: This appears to be a internal functional reference used for contract hashing. In the context of ONEX (OmniNode eXecution) architecture, SHA-256 is used as a cryptographic hash mode for contract data, often managed through dispatchers that maintain consistency across state digests and entry points [3]. While Starknet-related codebases contain similarly named hashing functions for contract classes (e.g., compute_compiled_class_hash) [4][5], within omnibase_core, such hashing logic is typically used to ensure architectural invariants and proof-of-work/receipt integrity [6][3]. HEADER_FIELDS: This refers to a configuration or constant set, such as harness.VOLATILE_HEADER_FIELDS, used to define metadata that should be ignored during parity checks or gate validation [7]. Specifically, it is used to prevent CI gates (like the dispatch-parity-gate) from failing due to non-functional metadata drift—such as version numbers or timestamps—ensuring that only significant changes in the dispatch corpus trigger a failure [7].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
url='https://raw.githubusercontent.com/OmniNode-ai/omnibase_core/v0.46.7/src/omnibase_core/validation/validator_receipt_gate.py'
curl -fsSL "$url" | sed -n '1,260p'

Repository: OmniNode-ai/onex_change_control

Length of output: 12298


🏁 Script executed:

#!/bin/bash
set -euo pipefail
url='https://raw.githubusercontent.com/OmniNode-ai/omnibase_core/v0.46.7/src/omnibase_core/validation/validator_receipt_gate.py'
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
curl -fsSL "$url" > "$tmp"
rg -n -C 24 'HEADER_FIELDS|compute_contract_entry_sha256|ContractEntryNotFoundError' "$tmp" | head -n 500

Repository: OmniNode-ai/onex_change_control

Length of output: 8238


🏁 Script executed:

#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import hashlib
import json
from pathlib import Path
import yaml

receipt_path = Path('drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml')
contract_path = Path('contracts/OMN-15722.yaml')
receipt = yaml.safe_load(receipt_path.read_text())
contract = yaml.safe_load(contract_path.read_text())
item_id = receipt['evidence_item_id']
entry = next(
    item for item in contract['dod_evidence']
    if isinstance(item, dict) and item.get('id') == item_id
)
canonical = {
    'header': {
        'ticket_id': contract.get('ticket_id'),
        'schema_version': contract.get('schema_version'),
    },
    'entry': entry,
}
blob = json.dumps(canonical, sort_keys=True, separators=(',', ':'), ensure_ascii=False)
expected = 'sha256:' + hashlib.sha256(blob.encode('utf-8')).hexdigest()
actual = receipt['contract_entry_sha256']
print('evidence_item_id:', item_id)
print('canonical_json:', blob)
print('expected_contract_entry_sha256:', expected)
print('receipt_contract_entry_sha256:', actual)
print('matches:', actual == expected)
PY

Repository: OmniNode-ai/onex_change_control

Length of output: 286


🏁 Script executed:

#!/bin/bash
set -euo pipefail
if command -v ruby >/dev/null 2>&1; then
  ruby -e 'require "yaml"; puts Psych::VERSION'
else
  echo 'ruby unavailable'
fi
if command -v yq >/dev/null 2>&1; then
  yq --version
else
  echo 'yq unavailable'
fi

Repository: OmniNode-ai/onex_change_control

Length of output: 190


🏁 Script executed:

#!/bin/bash
set -euo pipefail
ruby <<'RB'
require 'yaml'
require 'json'
require 'digest'

receipt_path = 'drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
contract_path = 'contracts/OMN-15722.yaml'
receipt = YAML.safe_load(File.read(receipt_path))
contract = YAML.safe_load(File.read(contract_path))
item_id = receipt.fetch('evidence_item_id')
entry = contract.fetch('dod_evidence').find { |item| item.is_a?(Hash) && item['id'] == item_id }
abort "entry not found: #{item_id}" unless entry

canonical = {
  'header' => {
    'ticket_id' => contract['ticket_id'],
    'schema_version' => contract['schema_version']
  },
  'entry' => entry
}
sort_json = lambda do |value|
  case value
  when Hash
    value.keys.sort.each_with_object({}) { |key, out| out[key] = sort_json.call(value[key]) }
  when Array
    value.map { |item| sort_json.call(item) }
  else
    value
  end
end
blob = JSON.generate(sort_json.call(canonical))
expected = "sha256:#{Digest::SHA256.hexdigest(blob)}"
actual = receipt.fetch('contract_entry_sha256')
puts "evidence_item_id: #{item_id}"
puts "canonical_json: #{blob}"
puts "expected_contract_entry_sha256: #{expected}"
puts "receipt_contract_entry_sha256: #{actual}"
puts "matches: #{actual == expected}"
RB

Repository: OmniNode-ai/onex_change_control

Length of output: 1154


🏁 Script executed:

#!/bin/bash
set -euo pipefail
ruby <<'RB'
require 'yaml'
receipt_path = 'drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml'
receipt = YAML.safe_load(File.read(receipt_path))
expected_name = "#{receipt.fetch('run_timestamp')}.yaml"
actual_name = File.basename(receipt_path)
required = %w[schema_version ticket_id evidence_item_id check_type check_value status run_timestamp commit_sha runner verifier probe_command probe_stdout]
missing = required.reject { |key| receipt.key?(key) }
puts "actual_filename: #{actual_name}"
puts "expected_filename_from_run_timestamp: #{expected_name}"
puts "filename_matches_timestamp_rule: #{actual_name == expected_name}"
puts "missing_model_dod_receipt_fields: #{missing.inspect}"
RB

Repository: OmniNode-ai/onex_change_control

Length of output: 339


Store the receipt at the timestamped canonical path.

Rename command.yaml to 2026-08-07T22:29:26Z.yaml. The receipt fields use the ModelDodReceipt shape, and its contract hash matches the final contract.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml` at line 9,
Rename the receipt file currently named command.yaml to the timestamped
canonical filename 2026-08-07T22:29:26Z.yaml, preserving its ModelDodReceipt
contents and contract_entry_sha256 value.

Source: Learnings

Comment thread drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml Outdated
…9m02s measured)

The 20m budget left that job ~58s of headroom against its measured 19m02s
runtime on PR #6173 run 31222755192 — a re-starve one contention spike away,
which is the exact defect this PR exists to remove.

Profile of the 19m02s (steps API, head 2df62fc):
  Checkout code                                 11m48s
  Run ./.github/actions/setup-uv                 5m30s
  Validate prod-promotion-grants trust anchor        2s

The work is 2 seconds; the runtime is fleet latency. Within that one run,
Checkout code for the same repo/SHA ranged 74s (omninode-runner-63) to 708s
(omninode-runner-21) — a ~9.6x contention spread — so the budget must cover the
latency tail, not the job's work. 45m is ~2.4x the worst observation.

Other four guards unchanged at 20. Contract probe updated from a flat ==20
assertion to a per-job expected-budget map so it stays falsifiable, and the
contract summary corrected (it claimed all five go to 20).
The prior stamps carried run_timestamp 2026-08-07T22:29:26Z / commit_sha
2df62fc, which predated both the 45m widening and the contract edit — the
receipts attested a tree that no longer existed.

All three probes were re-run against the working tree at d772fb8; none of
these values is carried over:

  dod-occ-guard-timeout-budgets-raised  exit 0, stdout 'true'
  dod-occ-guards-still-fail-closed      exit 0, stdout 'true'
  occ-self-bind-pr-6173                 exit 0, stdout 'true'

Receipt 1's probe changed with the contract: a flat 'all five == 20' assertion
would now fail, so it became a per-job expected-budget map (45/20/20/20/20).
Its contract_entry_sha256 is recomputed to
sha256:4c1ae3b62a7def4f0ca209d9921d974c6c74a4927cb8dc5fa3d4e32a99adeec8;
entries 2 and 3 are parse-identical so their hashes are unchanged.

Both substantive probes re-verified falsifiable at this head by negative
control — reverting 45->20 exits 1 with [('validate-prod-promotion-grants', 20,
45)], and flipping the predicate-parity comparison to == exits 1 with
unguarded=['predicate-parity'].
@jonahgabriel
jonahgabriel enabled auto-merge (squash) August 7, 2026 23:48
…ummary needs members

contract-shape-v1 (budget 25) was cancelled at 25m50s on this PR's own run
31222755192, cancelled step Checkout code (1358s) - the same starvation the
five already-raised guards hit. Inside that one run, for the same repo and
SHA, checkout ranged 6s-1358s and setup-uv 93s-571s, so the runner preamble
alone has been observed above 30m and every per-job budget under that is
provably insufficient. Sets 45 uniformly across all ten ci-summary needs
members that declare a timeout-minutes. Also corrects the inline fleet-size
comment: live gh api orgs/OmniNode-ai/actions/runners reports 64 runners
labelled omnibase-ci, not 48.
The prior wording said the runner preamble had been observed above 30m; that
number was a cross-job sum of the worst checkout (1358s, contract-shape-v1)
and the worst setup-uv (571s, a different job), not a single observed
preamble. Replaced with the two exact single-phase observations plus the
worst own-work step among the ten budgeted gates (53s). No budget changes.
@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

OCC autobind stood down for OmniNode-ai/onex_change_control#6173 (OMN-15722): this PR (hand_authored) already carries evidence for that ticket, so no competing companion was minted (OMN-15247 defer-on-contention).

onexbot-occ-writer Bot pushed a commit that referenced this pull request Aug 8, 2026
… check

occ-self-bind-pr-6173 uses `gh pr view`, which lexes to bare `gh` in command
position (not `gh api`) and is INADMISSIBLE (NOT_EXECUTED) under the OMN-15309
evidence_admissibility predicate. Contract Compliance Check on this PR's own
run (31228584791, job 93027660648) collapsed the whole dod_evidence
supersession chain to 0/3 PASS -> BLOCK, reddening the required check.

Append-only fix: occ-self-bind-pr-6173-admissible supersedes it with
`gh api repos/OWNER/REPO/pulls/6173/files` asserting the changed-file count
(5), with printed stdout so the run is distinguishable from a probe that
never executed (Receipt Hardening Gate, OMN-13060/OMN-15710). Verified
ADMISSIBLE by direct execution of classify_evidence over the exact
check_value, and the check itself run green (count=5) and red (count=4,
exit 1) before being recorded. Nothing above the new entries in
contracts/OMN-15722.yaml is edited; every prior dod_evidence item keeps its
bytes and OMN-13888 per-entry hash.

Local run of scripts/ci/run_contract_compliance_check.py against this head
confirms PASS (1/4 PASS, 3 WARN, 0 BLOCK).
…-> 7)

occ-self-bind-pr-6173-admissible asserted PR #6173's changed-file count
== 5, but adding its own receipt file to the diff made the live count 6
the moment it was committed -- confirmed red on Contract Compliance
Check (job 93048702548, run 31236076328): live count=6, assertion
expected 5, exit 1.

Appends occ-self-bind-pr-6173-admissible-v2, a self-inclusive correction:
its own receipt file is the 7th changed path, so it asserts count == 7,
the number that includes the file recording its own PASS.
jonahgabriel added a commit that referenced this pull request Aug 8, 2026
…starvation false-fails (#6230)

* fix(OMN-15765): raise check-bot-authored-authz-guard timeout to stop starvation false-fails

check-bot-authored-authz-guard was firing red on 12/17 open D-cluster PRs,
including 5 human-authored (occ#6172/#6175/#6176/#6182/#6188). Pulled the
failing job logs for occ#6176 and occ#6182: both die inside
actions/checkout@v7 (fetch-depth: 0) / the setup-uv composite with
conclusion=cancelled at the job's timeout-minutes: 5 wall, never reaching the
guard's own decision-logic step. CI Summary's fail-closed != success
comparison then scores that cancellation as an authz REJECT.

This is CI-scheduling starvation, not a matcher defect -- the identity/path
matcher (evaluate() in check_bot_authored_authz_guard.py) is already
unit-tested correct in both directions and is unchanged here. Corroborated by
OMN-15722/PR #6173, which raised nine sibling ci-summary jobs on the same
preamble-latency evidence (checkout observed up to 22m38s in one run).

Raises only check-bot-authored-authz-guard's timeout-minutes 5 -> 45
(matching OMN-15722's floor) and adds a regression test
(test_bot_authored_authz_guard_timeout_omn15765.py) pinning the floor,
proven red-before (fails at 5) / green-after (passes at 45).

OMN-15765

* evidence(OMN-15765): DoD receipts for authz-guard timeout fix

Adds PASS receipts for both dod_evidence items in contracts/OMN-15765.yaml
(dod-authz-guard-timeout-raised, dod-authz-guard-matcher-unchanged-both-dirs),
required for occ-preflight eligibility on this PR.

OMN-15765

* fix(OMN-15765): reword ci.yml comment to clear the runner-label naming gate

The prior comment's wording ("contended self-hosted omnibase-ci fleet")
literally embedded the two centralized runner-selector labels outside the
fromJSON(vars.OMNI_TRUSTED_CI_RUNS_ON_JSON || ...) form, which trips
omni-standards-compliance.yml's hard-coded-runner-label scan (CI Naming
Convention). Reworded to describe the same fact without repeating the
literal label strings. No behavior change.

OMN-15765
…ard-timeout-budget

# Conflicts:
#	.github/workflows/ci.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/ci.yml (1)

20-22: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove the top-level concurrency block.

contracts/OMN-15722.yaml requires ci.yml to have no top-level concurrency key. This block makes dod-occ-guards-still-fail-closed fail and invalidates its recorded PASS result. The PR objective also states that top-level concurrency remains absent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 20 - 22, Remove the top-level
concurrency block from ci.yml, including its group and cancel-in-progress
settings, so the workflow has no top-level concurrency key and preserves the
required CI guard behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml`:
- Line 32: Rename the receipt at
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml#L32-L32
to
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/2026-08-08T02:58:10Z.yaml,
and rename
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml#L19-L19
to
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/2026-08-08T05:20:00Z.yaml.
Update omnibase_core.validation.validator_receipt_gate receipt resolution to
derive the timestamped filenames from run_timestamp rather than command.yaml.

---

Outside diff comments:
In @.github/workflows/ci.yml:
- Around line 20-22: Remove the top-level concurrency block from ci.yml,
including its group and cancel-in-progress settings, so the workflow has no
top-level concurrency key and preserves the required CI guard behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: faa99d21-6ebe-4bbb-b07c-c4b34f9d3565

📥 Commits

Reviewing files that changed from the base of the PR and between 1d2ed82 and a84d64e.

📒 Files selected for processing (7)
  • .github/workflows/ci.yml
  • contracts/OMN-15722.yaml
  • drift/dod_receipts/OMN-15722/dod-occ-guard-timeout-budgets-raised/command.yaml
  • drift/dod_receipts/OMN-15722/dod-occ-guards-still-fail-closed/command.yaml
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173/command.yaml

echo "count=$n"; test "$n" = "5"
contract_entry_sha256: "sha256:96c8024ba4887774e9f4b2d8bd8a43dfb4e86a2aa64c053fc734c3f0920f6526"
status: PASS
run_timestamp: "2026-08-08T02:58:10Z"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Use the required timestamp receipt paths.

These receipts use command.yaml. The required path format is drift/dod_receipts/<TICKET>/<ITEM_ID>/<run_timestamp>.yaml.

  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml#L32-L32: store this receipt under its 2026-08-08T02:58:10Z timestamp filename.
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml#L19-L19: store this receipt under its 2026-08-08T05:20:00Z timestamp filename.

Update omnibase_core.validation.validator_receipt_gate receipt resolution in the same change if it still derives command.yaml paths. As per coding guidelines, “Store DoD receipts only at drift/dod_receipts/<TICKET>/<ITEM_ID>/<run_timestamp>.yaml.”

📍 Affects 2 files
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml#L32-L32 (this comment)
  • drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml#L19-L19
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml`
at line 32, Rename the receipt at
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/command.yaml#L32-L32
to
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible/2026-08-08T02:58:10Z.yaml,
and rename
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/command.yaml#L19-L19
to
drift/dod_receipts/OMN-15722/occ-self-bind-pr-6173-admissible-v2/2026-08-08T05:20:00Z.yaml.
Update omnibase_core.validation.validator_receipt_gate receipt resolution to
derive the timestamped filenames from run_timestamp rather than command.yaml.

Source: Coding guidelines

@jonahgabriel jonahgabriel added the ci:ready Full CI runs on this PR (OMN-15731 label-gated CI pilot) label Aug 9, 2026
@jonahgabriel
jonahgabriel merged commit 6e9e1d6 into dev Aug 9, 2026
105 of 107 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-15722-occ-guard-timeout-budget branch August 9, 2026 05:41
jonahgabriel added a commit that referenced this pull request Aug 9, 2026
* evidence: OCC companion pass 1 for #6173

* evidence: OCC companion self-bind for #6174

* fix(OMN-15722): format OCC autobind contract

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>
jonahgabriel added a commit that referenced this pull request Aug 9, 2026
…4994a03a479ac90f__v1__run31292255084-1.yaml) (#6240)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/2cea83b3d664a5a3a919d4e14994a03a479ac90f__v1__run31292255084-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31292255084-1

* evidence(OMN-15763): OCC companion for omnimarket PR #2027 (#6239)

* evidence(OMN-15763): OCC companion for omnimarket PR #2027

Falsifiable deploy-gate evidence (OMN-14505 sense) for the seam registry +
canonical seam-projection serialization PR: three live GitHub-content
probes against the PR head commit (canonical.py's canonical_sha256,
node_seam_match_compute's HandlerSeamMatch, and seams.v1.yaml's
schema_version header), plus the standard self-bind check. All three
probes verified locally against the PR head SHA
6bbd87de3c0173956969f5a0b159c8631e4b929e before committing.

Rebuilt on origin/dev (onex_change_control's live default branch — main
now accepts only promotion/hotfix PRs, discovered live via
main-target-guard on the first attempt against main). Net-new-file-only.

OMN-15763

* fix(OMN-15763): buffer check_value producers to avoid Rule E SIGPIPE false-RED

OMN-15411 Rule E (contract corpus ratchet) caught 3 new sigpipe-fragile
instances: gh api <contents> --jq .content | base64 -d | grep -q ... is a
measured SIGPIPE-fragile shape (141/0/141/0/141 across 5 runs against real
inputs) — grep -q exits at the first match and closes its stdin, base64 -d
is killed by SIGPIPE, and dod_verify's bash -o pipefail turns that 141 into
a false RED on evidence that is actually present.

Rewrote all three live-content probes to the buffered-read form:
body="$(<producer>)" && printf '%s' "$body" | grep -qF 'MARKER'. Verified
locally: sigpipe_fragile_violation() returns None for all three (was
non-None before), all three still execute correctly under
bash -o pipefail -c against the live GitHub API, and
validate_pr_deploy_required.has_deploy_evidence() still returns True
(the buffered form still classifies as a falsifiable live-surface probe).
Also re-pinned all three refs to the omnimarket PR's final head commit
f1741be0163ab757738bb9ddbf7d2d67aca6aa49 (was 6bbd87de, superseded by the
CodeRabbit-fix commit).

OMN-15763

* evidence(OMN-15763): PASS receipts for all four dod_evidence items

occ-preflight/verify hard-required receipts under
drift/dod_receipts/OMN-15763/<item_id>/command.yaml for every item -- an
OCC PR's in-tree contract carries its own receipts (the "in-repo trap").
All four probes run for real against the omnimarket PR #2027 head commit
f1741be0163ab757738bb9ddbf7d2d67aca6aa49 and this OCC PR's own state
(#6239). contract_sha256 + contract_entry_sha256 computed via
omnibase_core.validation.validator_receipt_gate against the landed
contract (commit 5f647f0). Verified
locally end-to-end: uv run python -m
omnibase_core.validation.validator_occ_merge_eligibility against this
tree returns eligible=true, reason=eligible, zero missing_or_nonpass_receipts.

probe_stdout required a non-empty value (ModelDodReceipt: "receipts with
empty stdout are indistinguishable from probes that never ran") -- the
contract's check_value stays the buffered grep -qF form (Rule E safe,
quiet by design), while each receipt's own probe_command is the
non-quiet grep -F variant that captures the actual matched line as
real evidence.

OMN-15763

* evidence(OMN-14888): OCC observation append (b8a1eb65a20f32e0e00efd473aaf7b69f3cad6f9__v1__run31058937953-1.yaml) (#6144)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/b8a1eb65a20f32e0e00efd473aaf7b69f3cad6f9__v1__run31058937953-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31058937953-1

* evidence(OMN-14888): self-bind OCC observation PR 6144

* evidence(OMN-14888): make OCC self-bind 6144 append-stable

* fix(OMN-14888): repair self-bind assertion in occ-self-bind-pr-6144

Rewrite the dod_evidence check to bind PR #6144 to immutable facts
(PR number, base repo, exact head ref) and accept state open OR
closed+merged, so the check stays true after this PR merges instead
of asserting .state == "open" forever.

* fix(OMN-14888): regenerate occ-self-bind-pr-6144 receipt for repaired check_value

Bind contract_entry_sha256 to the updated dod_evidence entry hash so
the OCC merge-eligibility gate's per-entry binding check passes.

* fix(OMN-14888): supersede occ-self-bind-pr-6134 with merged-terminal-state binding

PR #6134 merged to dev (2026-08-09T03:14:53Z, ea53c31) while this PR
was in flight. Its self-bind entry asserts .state == "open" forever,
which now fails closed. Append-only supersession per the
occ-self-bind-pr-5855-superseded / occ-self-bind-pr-6149-superseded
precedent — bind to the merged-terminal state instead; the superseded
entry stays verbatim for audit.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (7bd1c1a9c39823834fe4e38dabc785887ecf524c__v1__run31054912492-1.yaml) (#6132)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2021/7bd1c1a9c39823834fe4e38dabc785887ecf524c__v1__run31054912492-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31054912492-1

* evidence(OMN-14888): self-bind OCC observation PR 6132

* evidence(OMN-14888): make OCC self-bind 6132 append-stable

* fix(OMN-14888): regenerate occ-self-bind-pr-6132 receipt for entry-hash match

The contract entry's check_value was rewritten to accept open OR
closed+merged terminal state (self-bind fix), which changed its
recomputed contract_entry_sha256. Regenerated the receipt with a
fresh live probe against PR #6132 and the matching entry hash so
occ-preflight eligibility passes instead of failing on
contract_hash_mismatch.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* fix(OMN-15722): raise starved guard-job timeout budgets in OCC ci.yml (#6173)

* fix(OMN-15722): raise starved guard-job timeout budgets in OCC ci.yml

Five guard jobs carry timeout-minutes budgets below the observed latency of
the self-hosted omnibase-ci runner fleet under concurrent load. When a job
hits its own timeout wall GitHub records conclusion=cancelled, and CI Summary
(the sole required umbrella context on onex_change_control dev) compares each
needs.<job>.result against "success" fail-closed - so a guard that passed gets
scored as a violation and turns the required context red.

Raise the three 5-minute guards and the two 10-minute jobs to 20 minutes:
  - validate-prod-promotion-grants         5  -> 20
  - check-platform-leads-review-tripwire   5  -> 20
  - check-bot-authored-authz-guard         5  -> 20
  - predicate-parity                      10  -> 20
  - no-noncanonical-lifecycle-classes     10  -> 20

Not a gate weakening: every guard still runs, still must reach
conclusion=success, and CI Summary's fail-closed != "success" comparison is
untouched. Only the wall-clock budget moved.

Evidence-Ticket: OMN-15722

* evidence(OMN-15722): add OCC ticket contract + PASS receipts for guard timeout fix

The first push carried no contracts/OMN-15722.yaml, so both of the two
content-gating required contexts on this PR failed with the same single root
cause: validator_occ_merge_eligibility reported
reason=missing_contract / missing_contracts=["OMN-15722"] on
`occ-preflight / eligibility` (job 93010633789) and on `verify / verify`
step 21 "Run OCC Eligibility" (job 93010633875). Note step 7
"Resolve Evidence-Source" was SKIPPED in that same job, confirming the
in-repo Evidence-Source exemption - the missing contract was the only blocker.

Contract declares three dod_evidence items, all probed live and receipted with
real command output (no fabricated receipts):

  dod-occ-guard-timeout-budgets-raised  - substantive (L1): parses ci.yml and
    asserts all five named guard jobs declare timeout-minutes 20.
  dod-occ-guards-still-fail-closed      - substantive (L1): asserts all five
    guards remain in ci-summary's needs list, carry no continue-on-error, still
    have their literal fail-closed `result }}" != "success"` comparison in
    ci.yml, and that ci.yml still declares no top-level concurrency block.
    Falsifiability proven by negative control - rewriting the predicate-parity
    comparison to an equality form makes the same probe exit 1 with
    unguarded=['predicate-parity'].
  occ-self-bind-pr-6173                 - binding stamp only (L0), companion
    PR identity for receipt-gate binding.

Local verification: all three probes exit 0 / stdout "true"; the eligibility
validator now returns eligible=true reason=eligible
("OCC evidence is present, PASS, hash-bound, and PR-bound") with all three
receipt ids resolved. Full pre-commit over contract + receipts + ci.yml passes,
including Receipt Honesty Gate, Receipt Hardening Gate, Contract Substance
Floor, DoD-authoring hygiene, Canonical contract shape v1, and the
Evidence-Commit SHA Existence Gate.

Evidence-Ticket: OMN-15722

* evidence(OMN-15722): remove false no_source_change attestation from receipts

All three OMN-15722 receipts asserted no_source_change: true. Per
omnibase_core model_dod_receipt.py that field is RUNTIME_OPS-only and
asserts the change produced NO repo diff and NO PR. This change has a
5-line ci.yml diff and IS PR #6173, so the assertion was materially false.

These receipts carry evidence_class: None and pr_number: 6173, so the
field does not apply to them at all -- removed rather than set to false.
Its default is False, which is the truthful value. All three re-validate
against ModelDodReceipt with no_source_change=False.

Note: the model validator enforces only the RUNTIME_OPS -> True
direction, not the inverse, so a non-RUNTIME_OPS receipt asserting
no_source_change: true alongside a pr_number validates cleanly and no CI
gate would have caught this. Model gap, flagged not fixed here.

* fix(OMN-15722): widen validate-prod-promotion-grants budget to 45m (19m02s measured)

The 20m budget left that job ~58s of headroom against its measured 19m02s
runtime on PR #6173 run 31222755192 — a re-starve one contention spike away,
which is the exact defect this PR exists to remove.

Profile of the 19m02s (steps API, head 2df62fc):
  Checkout code                                 11m48s
  Run ./.github/actions/setup-uv                 5m30s
  Validate prod-promotion-grants trust anchor        2s

The work is 2 seconds; the runtime is fleet latency. Within that one run,
Checkout code for the same repo/SHA ranged 74s (omninode-runner-63) to 708s
(omninode-runner-21) — a ~9.6x contention spread — so the budget must cover the
latency tail, not the job's work. 45m is ~2.4x the worst observation.

Other four guards unchanged at 20. Contract probe updated from a flat ==20
assertion to a per-job expected-budget map so it stays falsifiable, and the
contract summary corrected (it claimed all five go to 20).

* evidence(OMN-15722): re-stamp all three receipts at head d772fb8

The prior stamps carried run_timestamp 2026-08-07T22:29:26Z / commit_sha
2df62fc, which predated both the 45m widening and the contract edit — the
receipts attested a tree that no longer existed.

All three probes were re-run against the working tree at d772fb8; none of
these values is carried over:

  dod-occ-guard-timeout-budgets-raised  exit 0, stdout 'true'
  dod-occ-guards-still-fail-closed      exit 0, stdout 'true'
  occ-self-bind-pr-6173                 exit 0, stdout 'true'

Receipt 1's probe changed with the contract: a flat 'all five == 20' assertion
would now fail, so it became a per-job expected-budget map (45/20/20/20/20).
Its contract_entry_sha256 is recomputed to
sha256:4c1ae3b62a7def4f0ca209d9921d974c6c74a4927cb8dc5fa3d4e32a99adeec8;
entries 2 and 3 are parse-identical so their hashes are unchanged.

Both substantive probes re-verified falsifiable at this head by negative
control — reverting 45->20 exits 1 with [('validate-prod-promotion-grants', 20,
45)], and flipping the predicate-parity comparison to == exits 1 with
unguarded=['predicate-parity'].

* fix(OMN-15722): uniform 45m timeout floor across all 10 budgeted ci-summary needs members

contract-shape-v1 (budget 25) was cancelled at 25m50s on this PR's own run
31222755192, cancelled step Checkout code (1358s) - the same starvation the
five already-raised guards hit. Inside that one run, for the same repo and
SHA, checkout ranged 6s-1358s and setup-uv 93s-571s, so the runner preamble
alone has been observed above 30m and every per-job budget under that is
provably insufficient. Sets 45 uniformly across all ten ci-summary needs
members that declare a timeout-minutes. Also corrects the inline fleet-size
comment: live gh api orgs/OmniNode-ai/actions/runners reports 64 runners
labelled omnibase-ci, not 48.

* evidence(OMN-15722): re-stamp all three receipts at the uniform-45m head

* docs(OMN-15722): tighten the latency claim to single-phase observations

The prior wording said the runner preamble had been observed above 30m; that
number was a cross-job sum of the worst checkout (1358s, contract-shape-v1)
and the worst setup-uv (571s, a different job), not a single observed
preamble. Replaced with the two exact single-phase observations plus the
worst own-work step among the ten budgeted gates (53s). No budget changes.

* evidence(OMN-15722): re-stamp all three receipts at 63be7d6

* evidence(OMN-15722): admissible self-bind supersedes gh-pr-view INERT check

occ-self-bind-pr-6173 uses `gh pr view`, which lexes to bare `gh` in command
position (not `gh api`) and is INADMISSIBLE (NOT_EXECUTED) under the OMN-15309
evidence_admissibility predicate. Contract Compliance Check on this PR's own
run (31228584791, job 93027660648) collapsed the whole dod_evidence
supersession chain to 0/3 PASS -> BLOCK, reddening the required check.

Append-only fix: occ-self-bind-pr-6173-admissible supersedes it with
`gh api repos/OWNER/REPO/pulls/6173/files` asserting the changed-file count
(5), with printed stdout so the run is distinguishable from a probe that
never executed (Receipt Hardening Gate, OMN-13060/OMN-15710). Verified
ADMISSIBLE by direct execution of classify_evidence over the exact
check_value, and the check itself run green (count=5) and red (count=4,
exit 1) before being recorded. Nothing above the new entries in
contracts/OMN-15722.yaml is edited; every prior dod_evidence item keeps its
bytes and OMN-13888 per-entry hash.

Local run of scripts/ci/run_contract_compliance_check.py against this head
confirms PASS (1/4 PASS, 3 WARN, 0 BLOCK).

* evidence(OMN-15722): correct stale self-bind file-count assertion (5 -> 7)

occ-self-bind-pr-6173-admissible asserted PR #6173's changed-file count
== 5, but adding its own receipt file to the diff made the live count 6
the moment it was committed -- confirmed red on Contract Compliance
Check (job 93048702548, run 31236076328): live count=6, assertion
expected 5, exit 1.

Appends occ-self-bind-pr-6173-admissible-v2, a self-inclusive correction:
its own receipt file is the 7th changed path, so it asserts count == 7,
the number that includes the file recording its own PASS.

* evidence(OMN-15722): OCC companion for #6173 (#6174)

* evidence: OCC companion pass 1 for #6173

* evidence: OCC companion self-bind for #6174

* fix(OMN-15722): format OCC autobind contract

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml) (#6149)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31061495853-1

* evidence(OMN-14888): self-bind OCC observation PR 6149

* evidence(OMN-14888): make OCC self-bind 6149 append-stable

* fix(OMN-14888): repair PR #6149 self-bind to append-only-stable predicate

The occ-self-bind-pr-6149 dod_evidence entry asserted .state == "open",
which goes false the instant this PR merges — a self-bind that breaks
append-only immutability on merge. Rebind to immutable facts (PR number,
base repo, head branch) with state accepted as open OR closed+merged,
keeping the check falsifiable for a wrong PR number/branch.

* fix(OMN-14888): supersede stale occ-self-bind-pr-6134 open-state assertion

PR #6134 merged (2026-08-09T03:14:53Z, merge commit ea53c31...) while its
merged dod_evidence entry occ-self-bind-pr-6134 still asserts .state ==
"open" -- the same class OMN-15374's occ-self-bind-pr-5855-superseded fixed
(OCC #6084 precedent). Append a net-new superseding entry bound to the
merged-terminal state; the original entry stays untouched (append-only).

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15763): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2028 (#6242)

* evidence(OMN-15763): author OCC companion for OmniNode-ai/omnimarket#2028

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 512b272bb26aba643093872519c8c46c142b0de2.

* evidence(OMN-15763): self-bind OCC#6242 + rebind contract_sha256

* fix(OMN-15763): backfill missing dod-occ-evidence-admissibility-validator contract entry

The OCC Companion Author automation emitted this receipt on PR #2028's
companion (dod-occ-evidence-admissibility-validator, node_pr_lifecycle_fix_effect
self-check) without adding the matching dod_evidence contract entry, tripping
the receipt-hardening append-only gate. Backfills the entry (source: generated,
matching the shape of the other autobind entries) and computes the real
contract_entry_sha256 via compute_contract_entry_sha256 (was a "PENDING"
placeholder) — verified locally against scripts/validation/check_receipt_hardening.py.

OMN-15763

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml) (#6138)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2023/cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31057101391-1

* evidence(OMN-14888): self-bind OCC observation PR 6138

* evidence(OMN-14888): make OCC self-bind 6138 append-stable

* fix(OMN-14888): regenerate occ-self-bind-pr-6138 receipt for self-bind fix

The self-bind entry's check_value was rewritten to bind to immutable
facts (PR#/head ref/base repo, state open OR closed+merged) so the
assertion survives merge, matching the #6132/#6144 precedent. This
changes contract_entry_sha256, so the receipt is regenerated with the
recomputed hash and a fresh live probe readback.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml) (#6152)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2024/38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31062523818-1

* evidence(OMN-14888): self-bind OCC observation PR 6152

* evidence(OMN-14888): make OCC self-bind 6152 append-stable

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml) (#6164)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2025/d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31142195987-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15757, OMN-15778): OCC companion for OmniNode-ai/omninode_infra#833 (#6246)

* evidence: OCC companion pass 1 for OmniNode-ai/omninode_infra#833

* evidence: OCC companion self-bind for #6246

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-15336): bind infra PR 2676 vendor migration (#6167)

* evidence(OMN-15336): bind infra PR 2676 vendor migration

* evidence(OMN-15336): self-bind OCC PR 6167

* evidence(OMN-15336): refresh registry RLS heads

* fix(OMN-15336): supersede market PR 2021 evidence append-only

* evidence(OMN-15336): rebind infra PR 2676 current head

* chore(OMN-15336): retrigger OCC gates

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2029 (#6247)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2029

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5.

* evidence(OMN-15777): self-bind OCC#6247 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2030 (#6248)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2030

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 271a7abe276bc6a5663599a6e7736c8faab843f7.

* evidence(OMN-15777): self-bind OCC#6248 + rebind contract_sha256

* fix(OMN-15777): revert unintended mutation of merged receipt (append-only repair)

The occ-evidence-source-autobind commit for PR #2030 (57e1628) rebound
drift/dod_receipts/OMN-15777/dod-occ-evidence-admissibility-validator/command.yaml
in place -- but that receipt already merged as part of OCC#6247 (PR #2029's
companion) and is immutable per the append-only doctrine. PR #2030 already
carries its own dedicated, net-new evidence entries
(dod-OmniNode-ai-omnimarket-pr-2030, dod-OmniNode-ai-omnimarket-pr-2030-ci,
occ-self-bind-pr-6248) that bind it to commit 271a7abe; the shared validator
receipt did not need to be re-pointed at PR #2030 to satisfy that binding.

Reverts the file to its merged-on-dev content. No supersession file is
needed -- this is not a correction to the receipt's claim (still true and
still bound to PR #2029/commit f9cc9dcc), it is an unforced touch that
should never have modified it.

Implements OMN-15777

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15780): OCC Evidence-Source autobind for OmniNode-ai/omninode_infra#834 (#6250)

* evidence(OMN-15780): author OCC companion for OmniNode-ai/omninode_infra#834

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 1fdeb0c9c9367d70e43ef88b128203cf567c4aed.

* evidence(OMN-15780): self-bind OCC#6250 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append (023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml) (#6155)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31063872175-1

* evidence(OMN-14888): self-bind OCC observation PR 6155

* evidence(OMN-14888): make OCC self-bind 6155 append-stable

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5__v1__run31303503673-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31303503673-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/c11400fe9483b9face2601c391f0a73add5d52cf__v1__run31304580306-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31304580306-1

* fix(OMN-14888): repair occ-self-bind-pr-6155 receipt after dev-merge

Conflict resolution against dev landing on PR #6155 rewrote the
occ-self-bind-pr-6155 dod_evidence entry's check_value to accept the
terminal closed+merged PR state (matching the occ-self-bind-pr-6134 /
occ-self-bind-pr-6149 established pattern) instead of a bare
.state == "open" assertion that would fail closed the moment this PR
merges. That byte change moved the per-entry contract hash, so the
paired receipt is regenerated here with the recomputed
contract_entry_sha256 and a fresh live probe_stdout.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml) (#6237)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31291311120-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>
Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: omnimarket-bot <bot@omninode.ai>
jonahgabriel added a commit that referenced this pull request Aug 9, 2026
…19c8c46c142b0de2__v1__run31297664660-1.yaml) (#6243)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2028/512b272bb26aba643093872519c8c46c142b0de2__v1__run31297664660-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31297664660-1

* evidence(OMN-15722): OCC companion for #6173 (#6174)

* evidence: OCC companion pass 1 for #6173

* evidence: OCC companion self-bind for #6174

* fix(OMN-15722): format OCC autobind contract

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml) (#6149)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31061495853-1

* evidence(OMN-14888): self-bind OCC observation PR 6149

* evidence(OMN-14888): make OCC self-bind 6149 append-stable

* fix(OMN-14888): repair PR #6149 self-bind to append-only-stable predicate

The occ-self-bind-pr-6149 dod_evidence entry asserted .state == "open",
which goes false the instant this PR merges — a self-bind that breaks
append-only immutability on merge. Rebind to immutable facts (PR number,
base repo, head branch) with state accepted as open OR closed+merged,
keeping the check falsifiable for a wrong PR number/branch.

* fix(OMN-14888): supersede stale occ-self-bind-pr-6134 open-state assertion

PR #6134 merged (2026-08-09T03:14:53Z, merge commit ea53c31...) while its
merged dod_evidence entry occ-self-bind-pr-6134 still asserts .state ==
"open" -- the same class OMN-15374's occ-self-bind-pr-5855-superseded fixed
(OCC #6084 precedent). Append a net-new superseding entry bound to the
merged-terminal state; the original entry stays untouched (append-only).

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15763): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2028 (#6242)

* evidence(OMN-15763): author OCC companion for OmniNode-ai/omnimarket#2028

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 512b272bb26aba643093872519c8c46c142b0de2.

* evidence(OMN-15763): self-bind OCC#6242 + rebind contract_sha256

* fix(OMN-15763): backfill missing dod-occ-evidence-admissibility-validator contract entry

The OCC Companion Author automation emitted this receipt on PR #2028's
companion (dod-occ-evidence-admissibility-validator, node_pr_lifecycle_fix_effect
self-check) without adding the matching dod_evidence contract entry, tripping
the receipt-hardening append-only gate. Backfills the entry (source: generated,
matching the shape of the other autobind entries) and computes the real
contract_entry_sha256 via compute_contract_entry_sha256 (was a "PENDING"
placeholder) — verified locally against scripts/validation/check_receipt_hardening.py.

OMN-15763

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml) (#6138)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2023/cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31057101391-1

* evidence(OMN-14888): self-bind OCC observation PR 6138

* evidence(OMN-14888): make OCC self-bind 6138 append-stable

* fix(OMN-14888): regenerate occ-self-bind-pr-6138 receipt for self-bind fix

The self-bind entry's check_value was rewritten to bind to immutable
facts (PR#/head ref/base repo, state open OR closed+merged) so the
assertion survives merge, matching the #6132/#6144 precedent. This
changes contract_entry_sha256, so the receipt is regenerated with the
recomputed hash and a fresh live probe readback.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml) (#6152)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2024/38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31062523818-1

* evidence(OMN-14888): self-bind OCC observation PR 6152

* evidence(OMN-14888): make OCC self-bind 6152 append-stable

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml) (#6164)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2025/d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31142195987-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15757, OMN-15778): OCC companion for OmniNode-ai/omninode_infra#833 (#6246)

* evidence: OCC companion pass 1 for OmniNode-ai/omninode_infra#833

* evidence: OCC companion self-bind for #6246

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-15336): bind infra PR 2676 vendor migration (#6167)

* evidence(OMN-15336): bind infra PR 2676 vendor migration

* evidence(OMN-15336): self-bind OCC PR 6167

* evidence(OMN-15336): refresh registry RLS heads

* fix(OMN-15336): supersede market PR 2021 evidence append-only

* evidence(OMN-15336): rebind infra PR 2676 current head

* chore(OMN-15336): retrigger OCC gates

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2029 (#6247)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2029

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5.

* evidence(OMN-15777): self-bind OCC#6247 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2030 (#6248)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2030

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 271a7abe276bc6a5663599a6e7736c8faab843f7.

* evidence(OMN-15777): self-bind OCC#6248 + rebind contract_sha256

* fix(OMN-15777): revert unintended mutation of merged receipt (append-only repair)

The occ-evidence-source-autobind commit for PR #2030 (57e1628) rebound
drift/dod_receipts/OMN-15777/dod-occ-evidence-admissibility-validator/command.yaml
in place -- but that receipt already merged as part of OCC#6247 (PR #2029's
companion) and is immutable per the append-only doctrine. PR #2030 already
carries its own dedicated, net-new evidence entries
(dod-OmniNode-ai-omnimarket-pr-2030, dod-OmniNode-ai-omnimarket-pr-2030-ci,
occ-self-bind-pr-6248) that bind it to commit 271a7abe; the shared validator
receipt did not need to be re-pointed at PR #2030 to satisfy that binding.

Reverts the file to its merged-on-dev content. No supersession file is
needed -- this is not a correction to the receipt's claim (still true and
still bound to PR #2029/commit f9cc9dcc), it is an unforced touch that
should never have modified it.

Implements OMN-15777

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15780): OCC Evidence-Source autobind for OmniNode-ai/omninode_infra#834 (#6250)

* evidence(OMN-15780): author OCC companion for OmniNode-ai/omninode_infra#834

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 1fdeb0c9c9367d70e43ef88b128203cf567c4aed.

* evidence(OMN-15780): self-bind OCC#6250 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append (023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml) (#6155)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31063872175-1

* evidence(OMN-14888): self-bind OCC observation PR 6155

* evidence(OMN-14888): make OCC self-bind 6155 append-stable

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5__v1__run31303503673-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31303503673-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/c11400fe9483b9face2601c391f0a73add5d52cf__v1__run31304580306-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31304580306-1

* fix(OMN-14888): repair occ-self-bind-pr-6155 receipt after dev-merge

Conflict resolution against dev landing on PR #6155 rewrote the
occ-self-bind-pr-6155 dod_evidence entry's check_value to accept the
terminal closed+merged PR state (matching the occ-self-bind-pr-6134 /
occ-self-bind-pr-6149 established pattern) instead of a bare
.state == "open" assertion that would fail closed the moment this PR
merges. That byte change moved the per-entry contract hash, so the
paired receipt is regenerated here with the recomputed
contract_entry_sha256 and a fresh live probe_stdout.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml) (#6237)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31291311120-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (2cea83b3d664a5a3a919d4e14994a03a479ac90f__v1__run31292255084-1.yaml) (#6240)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/2cea83b3d664a5a3a919d4e14994a03a479ac90f__v1__run31292255084-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31292255084-1

* evidence(OMN-15763): OCC companion for omnimarket PR #2027 (#6239)

* evidence(OMN-15763): OCC companion for omnimarket PR #2027

Falsifiable deploy-gate evidence (OMN-14505 sense) for the seam registry +
canonical seam-projection serialization PR: three live GitHub-content
probes against the PR head commit (canonical.py's canonical_sha256,
node_seam_match_compute's HandlerSeamMatch, and seams.v1.yaml's
schema_version header), plus the standard self-bind check. All three
probes verified locally against the PR head SHA
6bbd87de3c0173956969f5a0b159c8631e4b929e before committing.

Rebuilt on origin/dev (onex_change_control's live default branch — main
now accepts only promotion/hotfix PRs, discovered live via
main-target-guard on the first attempt against main). Net-new-file-only.

OMN-15763

* fix(OMN-15763): buffer check_value producers to avoid Rule E SIGPIPE false-RED

OMN-15411 Rule E (contract corpus ratchet) caught 3 new sigpipe-fragile
instances: gh api <contents> --jq .content | base64 -d | grep -q ... is a
measured SIGPIPE-fragile shape (141/0/141/0/141 across 5 runs against real
inputs) — grep -q exits at the first match and closes its stdin, base64 -d
is killed by SIGPIPE, and dod_verify's bash -o pipefail turns that 141 into
a false RED on evidence that is actually present.

Rewrote all three live-content probes to the buffered-read form:
body="$(<producer>)" && printf '%s' "$body" | grep -qF 'MARKER'. Verified
locally: sigpipe_fragile_violation() returns None for all three (was
non-None before), all three still execute correctly under
bash -o pipefail -c against the live GitHub API, and
validate_pr_deploy_required.has_deploy_evidence() still returns True
(the buffered form still classifies as a falsifiable live-surface probe).
Also re-pinned all three refs to the omnimarket PR's final head commit
f1741be0163ab757738bb9ddbf7d2d67aca6aa49 (was 6bbd87de, superseded by the
CodeRabbit-fix commit).

OMN-15763

* evidence(OMN-15763): PASS receipts for all four dod_evidence items

occ-preflight/verify hard-required receipts under
drift/dod_receipts/OMN-15763/<item_id>/command.yaml for every item -- an
OCC PR's in-tree contract carries its own receipts (the "in-repo trap").
All four probes run for real against the omnimarket PR #2027 head commit
f1741be0163ab757738bb9ddbf7d2d67aca6aa49 and this OCC PR's own state
(#6239). contract_sha256 + contract_entry_sha256 computed via
omnibase_core.validation.validator_receipt_gate against the landed
contract (commit 5f647f0). Verified
locally end-to-end: uv run python -m
omnibase_core.validation.validator_occ_merge_eligibility against this
tree returns eligible=true, reason=eligible, zero missing_or_nonpass_receipts.

probe_stdout required a non-empty value (ModelDodReceipt: "receipts with
empty stdout are indistinguishable from probes that never ran") -- the
contract's check_value stays the buffered grep -qF form (Rule E safe,
quiet by design), while each receipt's own probe_command is the
non-quiet grep -F variant that captures the actual matched line as
real evidence.

OMN-15763

* evidence(OMN-14888): OCC observation append (b8a1eb65a20f32e0e00efd473aaf7b69f3cad6f9__v1__run31058937953-1.yaml) (#6144)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/b8a1eb65a20f32e0e00efd473aaf7b69f3cad6f9__v1__run31058937953-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31058937953-1

* evidence(OMN-14888): self-bind OCC observation PR 6144

* evidence(OMN-14888): make OCC self-bind 6144 append-stable

* fix(OMN-14888): repair self-bind assertion in occ-self-bind-pr-6144

Rewrite the dod_evidence check to bind PR #6144 to immutable facts
(PR number, base repo, exact head ref) and accept state open OR
closed+merged, so the check stays true after this PR merges instead
of asserting .state == "open" forever.

* fix(OMN-14888): regenerate occ-self-bind-pr-6144 receipt for repaired check_value

Bind contract_entry_sha256 to the updated dod_evidence entry hash so
the OCC merge-eligibility gate's per-entry binding check passes.

* fix(OMN-14888): supersede occ-self-bind-pr-6134 with merged-terminal-state binding

PR #6134 merged to dev (2026-08-09T03:14:53Z, ea53c31) while this PR
was in flight. Its self-bind entry asserts .state == "open" forever,
which now fails closed. Append-only supersession per the
occ-self-bind-pr-5855-superseded / occ-self-bind-pr-6149-superseded
precedent — bind to the merged-terminal state instead; the superseded
entry stays verbatim for audit.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (7bd1c1a9c39823834fe4e38dabc785887ecf524c__v1__run31054912492-1.yaml) (#6132)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2021/7bd1c1a9c39823834fe4e38dabc785887ecf524c__v1__run31054912492-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31054912492-1

* evidence(OMN-14888): self-bind OCC observation PR 6132

* evidence(OMN-14888): make OCC self-bind 6132 append-stable

* fix(OMN-14888): regenerate occ-self-bind-pr-6132 receipt for entry-hash match

The contract entry's check_value was rewritten to accept open OR
closed+merged terminal state (self-bind fix), which changed its
recomputed contract_entry_sha256. Regenerated the receipt with a
fresh live probe against PR #6132 and the matching entry hash so
occ-preflight eligibility passes instead of failing on
contract_hash_mismatch.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* fix(OMN-15722): raise starved guard-job timeout budgets in OCC ci.yml (#6173)

* fix(OMN-15722): raise starved guard-job timeout budgets in OCC ci.yml

Five guard jobs carry timeout-minutes budgets below the observed latency of
the self-hosted omnibase-ci runner fleet under concurrent load. When a job
hits its own timeout wall GitHub records conclusion=cancelled, and CI Summary
(the sole required umbrella context on onex_change_control dev) compares each
needs.<job>.result against "success" fail-closed - so a guard that passed gets
scored as a violation and turns the required context red.

Raise the three 5-minute guards and the two 10-minute jobs to 20 minutes:
  - validate-prod-promotion-grants         5  -> 20
  - check-platform-leads-review-tripwire   5  -> 20
  - check-bot-authored-authz-guard         5  -> 20
  - predicate-parity                      10  -> 20
  - no-noncanonical-lifecycle-classes     10  -> 20

Not a gate weakening: every guard still runs, still must reach
conclusion=success, and CI Summary's fail-closed != "success" comparison is
untouched. Only the wall-clock budget moved.

Evidence-Ticket: OMN-15722

* evidence(OMN-15722): add OCC ticket contract + PASS receipts for guard timeout fix

The first push carried no contracts/OMN-15722.yaml, so both of the two
content-gating required contexts on this PR failed with the same single root
cause: validator_occ_merge_eligibility reported
reason=missing_contract / missing_contracts=["OMN-15722"] on
`occ-preflight / eligibility` (job 93010633789) and on `verify / verify`
step 21 "Run OCC Eligibility" (job 93010633875). Note step 7
"Resolve Evidence-Source" was SKIPPED in that same job, confirming the
in-repo Evidence-Source exemption - the missing contract was the only blocker.

Contract declares three dod_evidence items, all probed live and receipted with
real command output (no fabricated receipts):

  dod-occ-guard-timeout-budgets-raised  - substantive (L1): parses ci.yml and
    asserts all five named guard jobs declare timeout-minutes 20.
  dod-occ-guards-still-fail-closed      - substantive (L1): asserts all five
    guards remain in ci-summary's needs list, carry no continue-on-error, still
    have their literal fail-closed `result }}" != "success"` comparison in
    ci.yml, and that ci.yml still declares no top-level concurrency block.
    Falsifiability proven by negative control - rewriting the predicate-parity
    comparison to an equality form makes the same probe exit 1 with
    unguarded=['predicate-parity'].
  occ-self-bind-pr-6173                 - binding stamp only (L0), companion
    PR identity for receipt-gate binding.

Local verification: all three probes exit 0 / stdout "true"; the eligibility
validator now returns eligible=true reason=eligible
("OCC evidence is present, PASS, hash-bound, and PR-bound") with all three
receipt ids resolved. Full pre-commit over contract + receipts + ci.yml passes,
including Receipt Honesty Gate, Receipt Hardening Gate, Contract Substance
Floor, DoD-authoring hygiene, Canonical contract shape v1, and the
Evidence-Commit SHA Existence Gate.

Evidence-Ticket: OMN-15722

* evidence(OMN-15722): remove false no_source_change attestation from receipts

All three OMN-15722 receipts asserted no_source_change: true. Per
omnibase_core model_dod_receipt.py that field is RUNTIME_OPS-only and
asserts the change produced NO repo diff and NO PR. This change has a
5-line ci.yml diff and IS PR #6173, so the assertion was materially false.

These receipts carry evidence_class: None and pr_number: 6173, so the
field does not apply to them at all -- removed rather than set to false.
Its default is False, which is the truthful value. All three re-validate
against ModelDodReceipt with no_source_change=False.

Note: the model validator enforces only the RUNTIME_OPS -> True
direction, not the inverse, so a non-RUNTIME_OPS receipt asserting
no_source_change: true alongside a pr_number validates cleanly and no CI
gate would have caught this. Model gap, flagged not fixed here.

* fix(OMN-15722): widen validate-prod-promotion-grants budget to 45m (19m02s measured)

The 20m budget left that job ~58s of headroom against its measured 19m02s
runtime on PR #6173 run 31222755192 — a re-starve one contention spike away,
which is the exact defect this PR exists to remove.

Profile of the 19m02s (steps API, head 2df62fc):
  Checkout code                                 11m48s
  Run ./.github/actions/setup-uv                 5m30s
  Validate prod-promotion-grants trust anchor        2s

The work is 2 seconds; the runtime is fleet latency. Within that one run,
Checkout code for the same repo/SHA ranged 74s (omninode-runner-63) to 708s
(omninode-runner-21) — a ~9.6x contention spread — so the budget must cover the
latency tail, not the job's work. 45m is ~2.4x the worst observation.

Other four guards unchanged at 20. Contract probe updated from a flat ==20
assertion to a per-job expected-budget map so it stays falsifiable, and the
contract summary corrected (it claimed all five go to 20).

* evidence(OMN-15722): re-stamp all three receipts at head d772fb8

The prior stamps carried run_timestamp 2026-08-07T22:29:26Z / commit_sha
2df62fc, which predated both the 45m widening and the contract edit — the
receipts attested a tree that no longer existed.

All three probes were re-run against the working tree at d772fb8; none of
these values is carried over:

  dod-occ-guard-timeout-budgets-raised  exit 0, stdout 'true'
  dod-occ-guards-still-fail-closed      exit 0, stdout 'true'
  occ-self-bind-pr-6173                 exit 0, stdout 'true'

Receipt 1's probe changed with the contract: a flat 'all five == 20' assertion
would now fail, so it became a per-job expected-budget map (45/20/20/20/20).
Its contract_entry_sha256 is recomputed to
sha256:4c1ae3b62a7def4f0ca209d9921d974c6c74a4927cb8dc5fa3d4e32a99adeec8;
entries 2 and 3 are parse-identical so their hashes are unchanged.

Both substantive probes re-verified falsifiable at this head by negative
control — reverting 45->20 exits 1 with [('validate-prod-promotion-grants', 20,
45)], and flipping the predicate-parity comparison to == exits 1 with
unguarded=['predicate-parity'].

* fix(OMN-15722): uniform 45m timeout floor across all 10 budgeted ci-summary needs members

contract-shape-v1 (budget 25) was cancelled at 25m50s on this PR's own run
31222755192, cancelled step Checkout code (1358s) - the same starvation the
five already-raised guards hit. Inside that one run, for the same repo and
SHA, checkout ranged 6s-1358s and setup-uv 93s-571s, so the runner preamble
alone has been observed above 30m and every per-job budget under that is
provably insufficient. Sets 45 uniformly across all ten ci-summary needs
members that declare a timeout-minutes. Also corrects the inline fleet-size
comment: live gh api orgs/OmniNode-ai/actions/runners reports 64 runners
labelled omnibase-ci, not 48.

* evidence(OMN-15722): re-stamp all three receipts at the uniform-45m head

* docs(OMN-15722): tighten the latency claim to single-phase observations

The prior wording said the runner preamble had been observed above 30m; that
number was a cross-job sum of the worst checkout (1358s, contract-shape-v1)
and the worst setup-uv (571s, a different job), not a single observed
preamble. Replaced with the two exact single-phase observations plus the
worst own-work step among the ten budgeted gates (53s). No budget changes.

* evidence(OMN-15722): re-stamp all three receipts at 63be7d6

* evidence(OMN-15722): admissible self-bind supersedes gh-pr-view INERT check

occ-self-bind-pr-6173 uses `gh pr view`, which lexes to bare `gh` in command
position (not `gh api`) and is INADMISSIBLE (NOT_EXECUTED) under the OMN-15309
evidence_admissibility predicate. Contract Compliance Check on this PR's own
run (31228584791, job 93027660648) collapsed the whole dod_evidence
supersession chain to 0/3 PASS -> BLOCK, reddening the required check.

Append-only fix: occ-self-bind-pr-6173-admissible supersedes it with
`gh api repos/OWNER/REPO/pulls/6173/files` asserting the changed-file count
(5), with printed stdout so the run is distinguishable from a probe that
never executed (Receipt Hardening Gate, OMN-13060/OMN-15710). Verified
ADMISSIBLE by direct execution of classify_evidence over the exact
check_value, and the check itself run green (count=5) and red (count=4,
exit 1) before being recorded. Nothing above the new entries in
contracts/OMN-15722.yaml is edited; every prior dod_evidence item keeps its
bytes and OMN-13888 per-entry hash.

Local run of scripts/ci/run_contract_compliance_check.py against this head
confirms PASS (1/4 PASS, 3 WARN, 0 BLOCK).

* evidence(OMN-15722): correct stale self-bind file-count assertion (5 -> 7)

occ-self-bind-pr-6173-admissible asserted PR #6173's changed-file count
== 5, but adding its own receipt file to the diff made the live count 6
the moment it was committed -- confirmed red on Contract Compliance
Check (job 93048702548, run 31236076328): live count=6, assertion
expected 5, exit 1.

Appends occ-self-bind-pr-6173-admissible-v2, a self-inclusive correction:
its own receipt file is the 7th changed path, so it asserts count == 7,
the number that includes the file recording its own PASS.

* evidence(OMN-15722): OCC companion for #6173 (#6174)

* evidence: OCC companion pass 1 for #6173

* evidence: OCC companion self-bind for #6174

* fix(OMN-15722): format OCC autobind contract

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml) (#6149)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/d72b0c37559ddb1bad988e5a0f0a4c6011f0eb85__v1__run31061495853-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31061495853-1

* evidence(OMN-14888): self-bind OCC observation PR 6149

* evidence(OMN-14888): make OCC self-bind 6149 append-stable

* fix(OMN-14888): repair PR #6149 self-bind to append-only-stable predicate

The occ-self-bind-pr-6149 dod_evidence entry asserted .state == "open",
which goes false the instant this PR merges — a self-bind that breaks
append-only immutability on merge. Rebind to immutable facts (PR number,
base repo, head branch) with state accepted as open OR closed+merged,
keeping the check falsifiable for a wrong PR number/branch.

* fix(OMN-14888): supersede stale occ-self-bind-pr-6134 open-state assertion

PR #6134 merged (2026-08-09T03:14:53Z, merge commit ea53c31...) while its
merged dod_evidence entry occ-self-bind-pr-6134 still asserts .state ==
"open" -- the same class OMN-15374's occ-self-bind-pr-5855-superseded fixed
(OCC #6084 precedent). Append a net-new superseding entry bound to the
merged-terminal state; the original entry stays untouched (append-only).

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15763): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2028 (#6242)

* evidence(OMN-15763): author OCC companion for OmniNode-ai/omnimarket#2028

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 512b272bb26aba643093872519c8c46c142b0de2.

* evidence(OMN-15763): self-bind OCC#6242 + rebind contract_sha256

* fix(OMN-15763): backfill missing dod-occ-evidence-admissibility-validator contract entry

The OCC Companion Author automation emitted this receipt on PR #2028's
companion (dod-occ-evidence-admissibility-validator, node_pr_lifecycle_fix_effect
self-check) without adding the matching dod_evidence contract entry, tripping
the receipt-hardening append-only gate. Backfills the entry (source: generated,
matching the shape of the other autobind entries) and computes the real
contract_entry_sha256 via compute_contract_entry_sha256 (was a "PENDING"
placeholder) — verified locally against scripts/validation/check_receipt_hardening.py.

OMN-15763

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml) (#6138)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2023/cf77a700703ded2f8c99eacfb7695bdd767f772f__v1__run31057101391-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31057101391-1

* evidence(OMN-14888): self-bind OCC observation PR 6138

* evidence(OMN-14888): make OCC self-bind 6138 append-stable

* fix(OMN-14888): regenerate occ-self-bind-pr-6138 receipt for self-bind fix

The self-bind entry's check_value was rewritten to bind to immutable
facts (PR#/head ref/base repo, state open OR closed+merged) so the
assertion survives merge, matching the #6132/#6144 precedent. This
changes contract_entry_sha256, so the receipt is regenerated with the
recomputed hash and a fresh live probe readback.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml) (#6152)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2024/38d1a7242b189f4d2a4b20e5324ce8f3f13f3be8__v1__run31062523818-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31062523818-1

* evidence(OMN-14888): self-bind OCC observation PR 6152

* evidence(OMN-14888): make OCC self-bind 6152 append-stable

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml) (#6164)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2025/d0a4ff2ed7aa85267dd8b9013cf8a0782418d951__v1__run31142195987-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31142195987-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15757, OMN-15778): OCC companion for OmniNode-ai/omninode_infra#833 (#6246)

* evidence: OCC companion pass 1 for OmniNode-ai/omninode_infra#833

* evidence: OCC companion self-bind for #6246

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>

* evidence(OMN-15336): bind infra PR 2676 vendor migration (#6167)

* evidence(OMN-15336): bind infra PR 2676 vendor migration

* evidence(OMN-15336): self-bind OCC PR 6167

* evidence(OMN-15336): refresh registry RLS heads

* fix(OMN-15336): supersede market PR 2021 evidence append-only

* evidence(OMN-15336): rebind infra PR 2676 current head

* chore(OMN-15336): retrigger OCC gates

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2029 (#6247)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2029

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5.

* evidence(OMN-15777): self-bind OCC#6247 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-15777): OCC Evidence-Source autobind for OmniNode-ai/omnimarket#2030 (#6248)

* evidence(OMN-15777): author OCC companion for OmniNode-ai/omnimarket#2030

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 271a7abe276bc6a5663599a6e7736c8faab843f7.

* evidence(OMN-15777): self-bind OCC#6248 + rebind contract_sha256

* fix(OMN-15777): revert unintended mutation of merged receipt (append-only repair)

The occ-evidence-source-autobind commit for PR #2030 (57e1628) rebound
drift/dod_receipts/OMN-15777/dod-occ-evidence-admissibility-validator/command.yaml
in place -- but that receipt already merged as part of OCC#6247 (PR #2029's
companion) and is immutable per the append-only doctrine. PR #2030 already
carries its own dedicated, net-new evidence entries
(dod-OmniNode-ai-omnimarket-pr-2030, dod-OmniNode-ai-omnimarket-pr-2030-ci,
occ-self-bind-pr-6248) that bind it to commit 271a7abe; the shared validator
receipt did not need to be re-pointed at PR #2030 to satisfy that binding.

Reverts the file to its merged-on-dev content. No supersession file is
needed -- this is not a correction to the receipt's claim (still true and
still bound to PR #2029/commit f9cc9dcc), it is an unforced touch that
should never have modified it.

Implements OMN-15777

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-15780): OCC Evidence-Source autobind for OmniNode-ai/omninode_infra#834 (#6250)

* evidence(OMN-15780): author OCC companion for OmniNode-ai/omninode_infra#834

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 1fdeb0c9c9367d70e43ef88b128203cf567c4aed.

* evidence(OMN-15780): self-bind OCC#6250 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append (023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml) (#6155)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2022/023992b513456767c2ee39ad35703246bca5d83e__v1__run31063872175-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31063872175-1

* evidence(OMN-14888): self-bind OCC observation PR 6155

* evidence(OMN-14888): make OCC self-bind 6155 append-stable

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/f9cc9dcc1eddb67bb5acba9247677b1ab3f3e9f5__v1__run31303503673-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31303503673-1

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2029/c11400fe9483b9face2601c391f0a73add5d52cf__v1__run31304580306-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31304580306-1

* fix(OMN-14888): repair occ-self-bind-pr-6155 receipt after dev-merge

Conflict resolution against dev landing on PR #6155 rewrote the
occ-self-bind-pr-6155 dod_evidence entry's check_value to accept the
terminal closed+merged PR state (matching the occ-self-bind-pr-6134 /
occ-self-bind-pr-6149 established pattern) instead of a bare
.state == "open" assertion that would fail closed the moment this PR
merges. That byte change moved the per-entry contract hash, so the
paired receipt is regenerated here with the recomputed
contract_entry_sha256 and a fresh live probe_stdout.

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

* evidence(OMN-14888): OCC observation append (6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml) (#6237)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/6bbd87de3c0173956969f5a0b159c8631e4b929e__v1__run31291311120-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31291311120-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>
Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: omnimarket-bot <bot@omninode.ai>

* evidence(OMN-14888): OCC observation append (f1741be0163ab757738bb9ddbf7d2d67aca6aa49__v1__run31293106241-1.yaml) (#6241)

* evidence(OMN-14888): OCC observation append drift/occ_observations/OmniNode-ai__omnimarket/pr-2027/f1741be0163ab757738bb9ddbf7d2d67aca6aa49__v1__run31293106241-1.yaml

* evidence(OMN-14888): OCC observation self-bind occ-observation-run31293106241-1

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>

---------

Co-authored-by: node-occ-observation-effect <occ-observation-effect@omninode.ai>
Co-authored-by: onexbot-occ-writer[bot] <307849072+onexbot-occ-writer[bot]@users.noreply.github.com>
Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
Co-authored-by: Jonah Gray <jonah@omninode.ai>
Co-authored-by: omnimarket-bot <bot@omninode.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:ready Full CI runs on this PR (OMN-15731 label-gated CI pilot)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant