Skip to content

feat(OMN-20910): the Hostile Reviewer reads its voters from a contract overlay - #1039

Merged
jonahgabriel merged 4 commits into
devfrom
jonah/omn-20910-review-voters-overlay
Oct 10, 2026
Merged

jonahgabriel merged 4 commits into
devfrom
jonah/omn-20910-review-voters-overlay

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Ticket: OMN-20910 (parent OMN-20768). Operator RULING 2026-10-10T18:17:37Z: review-voter models are declared in a contract overlay, never in repository variables or workflow files.

What

  • New COMPUTE node node_review_voters_overlay_compute: handle(ModelReviewVotersOverlayRequest) -> ModelReviewVoterRoster validates a review_voters_overlay.v1 document and resolves each voter's endpoint from a backend of the lab delegation overlay (bifrost_lane_overlay.v3) or from its own endpoint_url, with model selection (served or declared), temperature, top_p, focus prompt, timeout, retries and a required flag. A refusal is returned as data naming the voter.
  • File edge: model_registry_loader.load_review_voters(path). It and the node import only pydantic and yaml, so the workflows' pre-install preflight reads the same roster.
  • cli_review --voters-overlay FILE (excludes --model): the overlay is the roster. No API fallback is substituted. A required voter that is unreachable is named and no voter is called; a required voter that fails its call is named; both exit 2 (no verdict). Each reachable served voter's live model id is printed in the log.
  • retry_budget --voters-overlay FILE budgets the overlay's own timeouts.
  • register_review_voters refuses a voter id that shadows a model_registry.yaml key.
  • Quorum unchanged: review_quorum stays in model_registry.yaml (bounded >= 2) and distinct voters are still counted by endpoint plus model.

The overlay file itself is omnibase_infra docker/lane-overlays/hostile-review-voters.yaml (companion PR); the three hostile-reviewer workflows switch to it after this lands and their omniintelligence pin moves here.

Depends on

omniintelligence#1038 (review-voter-diversity-9f8a): this branch is stacked on its commit, which adds the temperature, top_p and review_focus fields the overlay entries carry. Land #1038 first; this PR then holds only its own two commits.

Proof

  • tests/unit/review_pairing/test_review_voters_overlay_omn20910.py: 34 tests (loading, validation naming the voter, removed voter not called, overlay-only model swap, unreachable and failing required voters exit 2, optional voter loss, one voter is still no quorum, retry budget). tests/unit/review_pairing/ 809 passed locally; mypy --strict clean on the changed modules.

Lab: 2026-10-10 ~18:45Z, from the operator Mac against the lab, cli_review --file <plan> --voters-overlay omnibase_infra/docker/lane-overlays/hostile-review-voters.yaml: correctness -> .201:8000 served Qwen3.8-27B succeeded in 23.7s, security-contracts -> .200:8130 served Qwen3.8-27B succeeded in 53.6s, quorum passed (2 distinct reviewers), exit 0. Same run with the second voter pointed at the retired :8131: exit 2, required review voter 'security-contracts' is unreachable (security-contracts at 192.168.86.200:8131), no voter called. An unknown backend id: exit 1 naming the voter and listing the bound backends.

Evidence-Ticket: OMN-20910
Evidence-Source: OCC#13595

…t overlay

New COMPUTE node node_review_voters_overlay_compute: handle() validates a
review_voters_overlay.v1 document and resolves each voter's endpoint from a
backend of the lab delegation overlay (bifrost_lane_overlay.v3) or from its own
endpoint_url, with model selection, sampling, focus, timeout and a required
flag. A refusal is returned as data naming the voter. The file edge is
model_registry_loader.load_review_voters.

cli_review and retry_budget take --voters-overlay. A required voter that is
unreachable or fails exits 2 naming it; no fallback is substituted. The quorum
policy stays in model_registry.yaml and is unchanged. The loader and the node
import only pydantic and yaml, so the workflow preflight reads the same roster
before the dependency install.
jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Oct 10, 2026
#13595)

* evidence(OMN-20910): author OCC companion for OmniNode-ai/omniintelligence#1039

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

* evidence(OMN-20910): self-bind OCC#13595 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
…ith handle(request), so the node is born canonical
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