Skip to content

fix(OMN-16682): track the re-flipped trusted-CI seam in the runner routing policy - #2923

Merged
github-actions[bot] merged 1 commit into
devfrom
jonah/omn-16682-runner-routing-policy-expected-json
Aug 27, 2026
Merged

github-actions[bot] merged 1 commit into
devfrom
jonah/omn-16682-runner-routing-policy-expected-json

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Aug 27, 2026 •

Copy link
Copy Markdown
Collaborator

OMN-16682 re-flip Finding A — the routing audit asserted the pre-flip seam

The trusted-CI seam was deliberately re-flipped to GitHub-hosted runners at org scope and at all five repo shadows on 2026-08-27T04:36:53–56Z. config/runner_routing_policy.yaml:5 was never moved with it, so the policy still asserted ["self-hosted","omnibase-ci"] as intended state.

Deliberate note: this body does not spell out the OCC stamp marker literal. The occ-companion-effect publisher's idempotency check on dev is a bare substring match (OMN-16710, fix in omnimarket#2160), so writing it here would suppress this PR's own companion and still report SUCCESS.

What was wrong

Every scheduled Runner Routing Audit run reported six drift findings — org plus omnibase_core, omnibase_infra, omniclaude, omnimarket, onex_change_control — each of the form OMNI_TRUSTED_CI_RUNS_ON_JSON drifted to '["ubuntu-latest"]'; expected '["self-hosted","omnibase-ci"]'. All six describe intended state, not drift.

Observed on the 07:58:03Z scheduled run (33051942203): six ::error title=Runner routing drift:: lines, and Audit local workflow routing reporting Runner routing audit passed. immediately above them.

Why this mattered beyond a red badge

scripts/audit-runner-routing.py::main accumulates findings from both surfaces and returns 1 if the combined list is non-empty. The variable half was guaranteed to contribute six findings on every run, so the job's pass/fail signal was pinned to fail regardless of what the other half found.

That other half is audit_local_workflows, which enforces the hosted_runner_allowlist — including the fork-isolation entries this epic cares about (omnigate.yml, "Fork-only untrusted PR verification must not execute on self-hosted runners", the OMN-16683 surface). A genuine new violation there would have produced one more error line inside an already-failing job and changed nothing observable. The audit was blind exactly where it is load-bearing.

The change

One value: the trusted seam's expected_json now states the intended hosted value, plus a comment recording why it tracks the flip and why the OCC publishers do not.

Deliberately untouched:

  • OMNI_PUBLIC_PR_RUNS_ON_JSON — already ["ubuntu-latest"], unchanged.
  • repositories — unchanged, all five shadows still audited.
  • hosted_runner_allowlist — unchanged, all 8 entries and reasons intact.

The OCC carve-out is not folded into this seam

occ-*-manual-replay and the OCC autobind / companion-effect publishers do not read OMNI_TRUSTED_CI_RUNS_ON_JSON. They read the dedicated OMNI_OCC_AUTOBIND_RUNS_ON_JSON knob with a literal ["self-hosted","omnibase-ci"] fallback (OMN-16691, fanned out across omnibase_infra#2922 / omnibase_compat#197 / omnidash#295 / omniintelligence#854 / omnibase_spi#281 / omnimemory#452). They publish to the tailnet-only dev-lane broker, which only the self-hosted fleet can reach.

That variable is unset at org and repo scope (404 at both, verified read-only), so the literal is the operating value and the carve-out holds by construction.

Verification

  • scripts/audit-runner-routing.py --github-vars against the live org and repo variables → Runner routing audit passed., exit 0. Previously 6 findings, exit 1.
  • scripts/audit-runner-routing.py --local-workflows → Runner routing audit passed., exit 0.
  • uv run pytest tests/ci/test_runner_routing_audit.py -q → 10 passed. test_policy_tracks_repos_that_drifted_to_hosted_minutes asserted the old literal and was updated with the reason; the synthetic policy fixtures in the other tests still exercise the self-hosted expectation, so drift detection itself remains covered.
  • Pre-push governed impacted-test selector → 1709 passed in 527s.
  • pre-commit run --files config/runner_routing_policy.yaml tests/ci/test_runner_routing_audit.py → all applicable hooks passed.

No Actions variable was created, patched, or deleted by this change. The re-flip lane remains the sole owner of the seam variables.

Evidence-Ticket: OMN-16682
Evidence-Source: OCC#7273

Summary by CodeRabbit

  • Chores
    • Updated trusted CI workflows to use GitHub-hosted Ubuntu runners.
    • Preserved dedicated self-hosted runner routing for OCC publishers.
    • Updated automated policy checks to reflect the revised runner configuration.

…uting policy

The hourly Runner Routing Audit asserted OMNI_TRUSTED_CI_RUNS_ON_JSON ==
'["self-hosted","omnibase-ci"]' while the seam was deliberately re-flipped to
'["ubuntu-latest"]' at org scope and all five repo shadows on
2026-08-27T04:36:53-56Z. Every scheduled run therefore reported six drift
findings (org + omnibase_core + omnibase_infra + omniclaude + omnimarket +
onex_change_control) against intended state.

That red was not merely cosmetic. audit-runner-routing.py returns 1 whenever any
finding exists, so the audit's other surface -- audit_local_workflows, which
carries the hosted-runner allowlist including the OMN-16683 fork-isolation
entries -- was evaluated on a job that was already failing. Genuine new drift
there could not have changed the job's signal, so the audit was blind exactly
where it is load-bearing.

Change: expected_json for the trusted seam now states the intended hosted value.
OMNI_PUBLIC_PR_RUNS_ON_JSON is untouched (already '["ubuntu-latest"]'), the
repositories list is untouched, and the hosted_runner_allowlist is untouched.

The OCC carve-out is deliberately NOT folded into this seam: occ-*-manual-replay
and the OCC autobind/companion-effect publishers read the dedicated
OMNI_OCC_AUTOBIND_RUNS_ON_JSON knob with a literal
'["self-hosted","omnibase-ci"]' fallback (OMN-16691), because they publish to
the tailnet-only dev-lane broker that only the self-hosted fleet can reach. That
variable is unset at org and repo scope, so the literal is the operating value.

No Actions variable was created, patched, or deleted by this change.

Verification:
* scripts/audit-runner-routing.py --github-vars against live org+repo variables
  -> 'Runner routing audit passed.' exit 0 (was 6 findings, exit 1).
* scripts/audit-runner-routing.py --local-workflows -> passed, exit 0.
* uv run pytest tests/ci/test_runner_routing_audit.py -q -> 10 passed.
* pre-commit run --files <both changed files> -> all applicable hooks passed.
@github-actions
github-actions Bot enabled auto-merge (squash) August 27, 2026 08:20
@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.

@coderabbitai

coderabbitai Bot commented Aug 27, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e83ab50e-fa9f-4281-a56f-f0e4cbb3b214

📥 Commits

Reviewing files that changed from the base of the PR and between 5801329 and dff0706.

📒 Files selected for processing (2)
  • config/runner_routing_policy.yaml
  • tests/ci/test_runner_routing_audit.py

Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.


📝 Walkthrough

Walkthrough

The trusted CI runner expectation changed from self-hosted labels to ubuntu-latest. The policy audit test now validates this configuration.

Changes

Trusted CI runner routing

Layer / File(s) Summary
Update trusted runner policy and audit
config/runner_routing_policy.yaml, tests/ci/test_runner_routing_audit.py
The trusted CI policy and audit test now expect ["ubuntu-latest"]. OCC publishers retain their separate self-hosted configuration.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to dff07

The change updates the runner-routing audit policy to match the intended hosted-runner configuration and adjusts its test expectation; no actionable merge-blocking risk remains after normal checks and review.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the runner routing policy change and the re-flipped trusted-CI configuration. It is concise and directly related to the primary changes.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jonah/omn-16682-runner-routing-policy-expected-json

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

@github-actions

github-actions Bot commented Aug 27, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Blocking findings (critical): 0
Total findings: 0
Models succeeded: none

Note: All reviewer models failed or were unavailable. Degraded results are informational during the pilot phase (OMN-8468/OMN-8524) and do not block merge. Error: all review endpoints [192.168.86.201:8000 192.168.86.201:8000 ] unreachable — preflight short-circuit (no models available)


Gate semantics (pilot phase)

Verdict Meaning Blocks merge?
passed No critical findings No
blocked CRITICAL findings found Yes
degraded All models unavailable (infra) No (pilot)

Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review (OMN-8468/OMN-8524)

jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Aug 27, 2026
#7273)

* evidence: OCC companion pass 1 for OmniNode-ai/omnibase_infra#2923

* evidence: OCC companion self-bind for #7273

---------

Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
@github-actions
github-actions Bot merged commit 8ce11d5 into dev Aug 27, 2026
165 of 173 checks passed
@github-actions
github-actions Bot deleted the jonah/omn-16682-runner-routing-policy-expected-json branch August 27, 2026 08:49
github-actions Bot pushed a commit that referenced this pull request Aug 27, 2026
… contract-compliance (#2926)

`ci.yml`'s `contract-compliance` step met an empty `PR_NUMBER` with `exit 0`.
That was a vacuous pass on a required gate: "Contract Compliance Check" is a
GATE_JOBS entry in `scripts/ci/ci_summary_gate.py`, and CI Summary is this
repo's sole required branch-protection context, so the umbrella poller counted
a run that evaluated zero DoD check_values as a *provable* pass. Unlike a red
gate, a green one that checked nothing never prompts investigation.

Scope correction against the ticket body, which claimed "every dev push":
`on.push.branches` here is `[main]`, so this never fired on a dev commit. The
two live fail-open events are push-to-main (release-synced fast-forwards) and
merge_group -- the latter unexercised today (no registry repo has a queue on
dev as of 2026-08-24) but a latent bypass of the sole required context the
instant a queue returns, with zero further code change.

The fix is resolution, not narrowing. Excluding push/merge_group with a
job-level `if:` would publish a `skipped` check run, which branch protection
counts as passing -- the OMN-14863 skip-vector class. So the job keeps running
on all three events and `scripts/ci/resolve_contract_compliance_pr.py` answers
which PR's check_values apply: the event's own number on pull_request (no API
call, behaviourally identical to pre-fix), the `pr-<n>-` segment of the
gh-readonly-queue ref on merge_group (no API call), or the merged source PR of
the pushed commit via `gh api repos/{repo}/commits/{sha}/pulls`. Anything
unresolved -- including a transient gh failure -- exits 1.

Verified live against the real API before landing: dev 8ce11d5 -> #2923, and
the three most recent main commits -> #2837/#2823/#2835, so the push path now
evaluates a real scope rather than going spuriously red. An all-zero SHA exits
1 with no stdout.

Ships with the OMN-15547 incident replay its own default-deny rule demands:
two verbatim `gh api` captures under tests/fixtures/omn16508/ -- the empty
association list GitHub really returns for a commit no merged PR produced
(6d7090d, head of closed-unmerged #2890), which the guard must reject, and a
21KB merged-PR response (5b904d8 -> #2378) as the control that stops a
hard-wired `return None` from replaying the incident while failing every
legitimate push-to-main closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant