Repository navigation
feat(OMN-19215): the dev overlay spreads delegation across the two Qwen3.8-27B hosts - #4134
Conversation
…ugh to the rendered contract
The lane overlay binding accepts an optional placement {tier, fallback_for,
max_context_tokens} on an ADDED backend only, refuses one larger than the
backend's context_window, and the renderer passes it through unchanged. The
routing authority in omnimarket mirrors the backend into that tier after the
rungs it backs. An added backend with no placement renders exactly as before.
Onex-Lane: pc2-delegation-load
Onex-Session: 94b52a596fd34760ac199e09d09305b1
…ier behind the two .201 rungs Held: merge only after the omnimarket placement change is released into the dev lane image, since an older omnimarket refuses the placement key. Onex-Lane: pc2-delegation-load Onex-Session: 94b52a596fd34760ac199e09d09305b1
…h ProtocolConfigurationError Onex-Lane: pc2-delegation-load Onex-Session: 94b52a596fd34760ac199e09d09305b1
…s intact, and an oversized one is refused Onex-Lane: pc2-delegation-load Onex-Session: 94b52a596fd34760ac199e09d09305b1
…oice traffic A placement gains mode (fallback, the default, or spread). The renderer writes mode only when it is not the default, so a fallback placement renders the bytes a routing authority without the field accepts. The dev overlay places the .202 omnipc2 backend as a spread peer of the two .201 rungs (RULING ledger:4257).
#11316) * evidence: OCC companion pass 1 for OmniNode-ai/omnibase_infra#4134 * evidence: OCC companion self-bind for #11316 --------- Co-authored-by: node-occ-companion-effect <occ-companion-effect@omninode.ai>
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, qwen3-review-b, glm-review
Models failed: none
New finding threads: 2
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 14
Nit-level findings suppressed: 2
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 14 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — Missing validation of fallback_for rung existence in renderer | The renderer passes theplacementobject through to the rendered contract without validating that thefallback_forrungs actually ex - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True may omit required fields if defaults are non-null | The renderer usesbinding.placement.model_dump(mode="json", exclude_defaults=True). This excludes fields that have their def - [MAJOR]
docker/lane-overlays/dev.bifrost.yaml (placement comment) and enum_bifrost_lane_placement_mode.py docstring(glm-review) — Spread hash selection contradicts the documented retry behavior | The overlay comment and the enum docstring assert two behaviors that are mutually inconsistent as described: selection is 'a stable ha - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py (_validate_binding)(glm-review) — Renderer defers all rung-name validation despite knowing the backend set | The renderer validates that max_context_tokens fits context_window but does not check that every fallback_for rung names a ba - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — Integration test relies on committed dev overlay file | The integration testtest_dev_overlay_places_omnipc2_omn19215.pyreads the committeddev.bifrost.yamlfile. This couples the test to the spe - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — No validation that fallback_for rungs are in the same tier | The placement model does not validate that thefallback_forrungs are in the same tier as thetierfield. If a lane overlay specifies ` - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review-b) — No validation of tier/rung names against actual routing ladder | The placement model accepts arbitrary tier and fallback_for rung names without validating them against the actual routing ladder. The c - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review-b) — Spread mode may cause uneven load distribution | The spread mode uses a stable hash of the correlation id to pick between rungs. This can lead to uneven load distribution if the correlation ids are no - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review-b) — No test for spread mode with multiple rungs | The tests only cover spread mode with a single rung in fallback_for. There is no test that verifies the behavior when spread mode is used with multiple ru - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py(qwen3-review-b) — max_context_tokens validation does not consider max_tokens | The validator checks that placement.max_context_tokens is not greater than the backend's context_window, but it does not consider the backe - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py (_added_backend_entry)(glm-review) — exclude_defaults couples render shape to future field defaults | entry["placement"] = binding.placement.model_dump(mode="json", exclude_defaults=True) is used to omit the default mode, but exclude_def - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(glm-review) — No test that spread mode survives context-window routing assumptions | The committed overlay sets max_context_tokens: 32768 on a spread placement mirroring rungs with a 131072-token window. The commen - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py (_write_base_contract, first test)(glm-review) — Integration test relies on endpoint binding without pinning environment behavior | test_the_committed_dev_overlay_renders_the_omnipc2_omn19215 calls the renderer with environ={} against a base contrac - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(glm-review) — Cross-package contract enforced only by comment in the producing package | ModelBifrostLaneBackendPlacement states that omnimarket validates tier and rung names, but the schema this package renders an
Findings demoted from threads (anchor rejected)
-
[MAJOR] hostile-reviewer (qwen3-review)
Placement validation on base-declared backends is dead code | The validator in ModelBifrostLaneBackendBinding._validate_binding raises an error if a base-declared backend carries a placement. However, the test test_a_base_backend_cannot_be_given_a_placement_by_a_lane passes a placement to _base_binding, which constructs a dict for the overlay. The overlay is merged into the base contract. If the base contract already declares 'local-coder', the overlay's binding for 'local-coder' is treated as a modificatio
Resolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492). -
[MAJOR] hostile-reviewer (qwen3-review-b)
Placement validation on base-declared backends is dead code | The validator in ModelBifrostLaneBackendBinding._validate_binding raises an error if a base-declared backend carries a placement. However, the renderer's _added_backend_entry function is only called for backends that the lane overlay adds (i.e., where declares_new_backend is True). The test test_a_base_backend_cannot_be_given_a_placement_by_a_lane attempts to trigger this by passing a placement on a base binding, but the renderer likely ignores p
Resolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492).
✅ Hostile Reviewer — REVIEWEDCritical findings: 1
Semantics (OMN-17492 — the model finds, thread resolution gates)
Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review: qwen3-review (Qwen3.8-27B), gpt-oss-review (gpt-oss-120b) (OMN-8468/OMN-8524/OMN-17492) |
…he overlay still declares omnibase_infra#4005 (OMN-19251) deleted the dead .200 local-ds-v4-flash row from docker/lane-overlays/dev.bifrost.yaml. The test's minimal base contract still named that rung, so both tests raised KeyError once dev was merged into this branch. Drop it from the base-contract fixture and type the overlay loader's return.
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 8
Nit-level findings suppressed: 1
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 8 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True silently drops explicit fallback mode, breaking the documented contract | The renderer uses model_dump(mode='json', exclude_defaults=True) to serialize the placement. The docstri - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — Placement tier and fallback_for names are not validated against the routing ladder at render time | The model docstring explicitly defers tier and rung name validation to the routing authority (omnima - [MAJOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test for spread mode with multiple fallback_for rungs | The integration test and unit tests only exercise single-rung fallback_for lists. The spread mode's stable-hash routing across multiple rungs - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py(qwen3-review) — max_context_tokens validation only checks against context_window, not against the actual serving capacity | The validator ensures placement.max_context_tokens <= binding.context_window, but the YAML c - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — Placement model is frozen but the binding is not, creating asymmetric mutability | ModelBifrostLaneBackendPlacement uses ConfigDict(frozen=True), but ModelBifrostLaneBackendBinding does not. This mean - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — Integration test uses a hardcoded env var mapping that may drift from the base contract | The integration test hardcodes _ENDPOINT_URL_ENV with specific env var names for local-coder and local-heavy-r - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — No test for placement with fallback_for referencing a backend not in the rendered contract | The integration test asserts that every rung in fallback_for is bound in the rendered contract, but there i - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Stable-hash routing by correlation id may cause hot spots under skewed correlation id distributions | The spread mode uses a stable hash of the correlation id to pick between rungs. If correlation ids
Lab readback, .201 dev lane, 2026-09-27 (OMN-19215 stack, with .202 down)Lane What ran. I hotpatched omnimarket#2913 at Condition. .202 is down. Its /data disk failed and llama-server cannot load its model (OMN-19863), so Result. I made six
A dead spread peer costs one refused connection and a same-tier sibling retry, not a failed delegation. So .202 does not need to come out of the overlay while its disk is out. Restore. The originals went back at 11:53:18Z. The deploy agent then recreated both containers from image Ordering hazard, measured. The lane's released omnimarket (0.4.245, the dev lane's current install) refuses the contract #4134 renders: Not proven here. These runs did not prove .202 answering (OMN-19215 AC2). That waits on OMN-19863. The receipts cannot show which host answered: both attempts carry the model-derived |
|
OCC autobind rebound this PR's evidence-source stamp line to The receipt gate's own eligibility validator, run against the change-control tree the gate pins for Reported by |
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 2
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 10
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 10 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [CRITICAL]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Runtime asserts used for required fields in _added_backend_entry | The function _added_backend_entry relies on assert statements to guarantee that binding.provider, binding.tier and binding.credential - [MAJOR]
src/omnibase_infra/runtime/models/enum_bifrost_lane_placement_mode.py(qwen3-review) — Spread mode enables traffic splitting without per-request authz check | The 'spread' placement mode causes the routing authority to distribute first-choice traffic across rungs by a stable hash of the - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True may omit non-default mode values in edge cases | The renderer uses binding.placement.model_dump(mode='json', exclude_defaults=True) to omit the mode key when it is the default (F - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — No validation that fallback_for rungs exist in the rendered contract | The renderer passes placement through without verifying that the rung names in fallback_for actually correspond to backends in th - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test for placement on a backend with context_window=None | The unit tests cover the oversized-placement rejection and the pass-through, but no test exercises the case where an added backend has con - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — Frozen model with extra=forbid prevents forward-compatible overlay evolution | ModelBifrostLaneBackendPlacement uses ConfigDict(frozen=True, extra='forbid'). This means any future addition of a field - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — model_dump called on every render even when placement is absent | The code path 'if binding.placement is not None: entry["placement"] = binding.placement.model_dump(...)' is correct, but the surroundi - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test that spread mode with multiple rungs renders correctly | The unit test test_a_spread_placement_passes_its_mode_through uses a single-rung placement. The dev overlay uses two rungs (local-coder - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — Integration test base contract omits tier and timeout_ms fields | The write_base_contract helper in the integration test writes a minimal base contract with only backend_id, model_name, endpoint_url - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py(gpt-oss-review) — Missing validation of placement.tier against base contract tiers | ModelBifrostLaneBackendPlacement validates its internal fields but does not verify that the specified tier exists in the base contrac
Findings demoted from threads (anchor rejected)
-
[MAJOR] hostile-reviewer (qwen3-review)
Placement validation bypassed when context_window is None | The validator in ModelBifrostLaneBackendBinding._validate_binding compares self.placement.max_context_tokens > self.context_window. If the backend binding's context_window field is None (which is permitted by the model definition, as it is an optional field), this comparison will raise a TypeError at runtime rather than a controlled ValidationError. The guard only checks 'if self.placement is not None' before the comparison, not whether context_win
Resolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492). -
[MAJOR] hostile-reviewer (gpt-oss-review)
Inconsistent exception type for placement validation in ModelBifrostLaneBackendBinding | The _validate_binding method raises ValueError when placement constraints are violated, while callers and tests expect ProtocolConfigurationError (or ValidationError) for configuration problems. This mismatch can lead to uncaught ValueError exceptions propagating to callers that only handle ProtocolConfigurationError, resulting in unexpected crashes. | Evidence: src/omnibase_infra/runtime/models/model_bifrost_lane_backe
Resolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492).
…res local-embedding omnibase_infra#4207 (OMN-17099) bound local-embedding in the dev overlay. The minimal base contract this test writes declared only the two chat rungs, so after dev was merged in the render refused local-embedding as an undeclared added backend. Declare it with the real base contract's env hint, as the sibling OMN-18570 and OMN-18626 tests already do.
|
OCC autobind rebound this PR's evidence-source stamp line to The receipt gate's own eligibility validator, run against the change-control tree the gate pins for Reported by |
…es the current dev overlay omnibase_infra#4207 (OMN-17099) bound local-embedding in the dev overlay, and omnibase_infra#4005 (OMN-19251) removed local-ds-v4-flash from it. After dev was merged in, the minimal base contract this test writes still declared ds-v4-flash (a KeyError on the served-id lookup) and not local-embedding (the render refused it as an undeclared added backend). Declare the three base backends the overlay binds today, as omnibase_infra#4134 does, and type _dev_overlay's return so the file passes mypy --strict. The file is now byte-identical to #4134's. Onex-Lane: pc2-delegation-load Onex-Session: 94b52a596fd34760ac199e09d09305b1
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 2
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 8
Nit-level findings suppressed: 1
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 8 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — No validation that fallback_for rungs exist in the rendered contract | The renderer passes placement through without verifying that the rungs named infallback_forare actually present in the render - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True may omit non-default mode values in edge cases | The renderer usesbinding.placement.model_dump(mode="json", exclude_defaults=True). Pydantic'sexclude_defaultsexcludes fiel - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(gpt-oss-review) — fallback_for length not enforced | ModelBifrostLaneBackendPlacement defines fallback_for as a tuple with Field(min_length=1). In Pydantic v2, min_length does not apply to tuple types, so an empty list - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — render_bifrost_delegation_contract may not translate ValueError to ProtocolConfigurationError | Tests expect ProtocolConfigurationError when placement.max_context_tokens exceeds context_window. The va - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py(qwen3-review) — No test for placement on a backend with serving=False | The renderer's_added_backend_entrysetsendpoint_urlto None whenbinding.servingis False. A placement on a non-serving backend is seman - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — Integration test relies on mutable global overlay file without isolation | The integration testtest_dev_overlay_places_omnipc2_omn19215.pyreads the committeddev.bifrost.yamldirectly from the r - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — Placement validation split across renderer and routing authority creates a gap | The renderer validates onlymax_context_tokens <= context_windowand that the backend is lane-added. The tier and run - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — render function uses variable annotation that may shadow built‑in name | render_bifrost_delegation_contract replaces a direct return dict with an annotated assignment `entry: dict[object, object] = {.
Findings demoted from threads (anchor rejected)
-
[MAJOR] hostile-reviewer (qwen3-review)
Placement validation bypassed when context_window is None | In _validate_binding, the check
if self.placement.max_context_tokens > self.context_windowwill raise a TypeError ifself.context_windowis None. The ModelBifrostLaneBackendBinding model likely allows context_window to be optional or None for some backend types. If a lane-added backend omits context_window but provides a placement, the comparisonint > Nonewill crash with a TypeError instead of a clean ValidationError or ProtocolConfiguratioResolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492). -
[MAJOR] hostile-reviewer (gpt-oss-review)
placement validation may raise TypeError when context_window is missing | ModelBifrostLaneBackendBinding._validate_binding compares placement.max_context_tokens to self.context_window without confirming that context_window is set. If a binding omits context_window, the comparison triggers a TypeError, bypassing the intended ValueError and causing an uncaught exception during model validation. | Evidence: src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py:115-122 performs the comparison
Resolve this thread when addressed — the
Hostile Review Thread Gateblocks while hostile-reviewer threads are unresolved (OMN-17492).
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 5
Nit-level findings suppressed: 1
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 5 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py, tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — Placement validation on base-declared backends is unreachable in the renderer | The validator in ModelBifrostLaneBackendBinding._validate_binding raises an error if a placement is present on a backend - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_binding.py(gpt-oss-review) — Placement validation method lacks Pydantic validator decorator | The method_validate_bindinginmodel_bifrost_lane_backend_binding.pycontains logic that should enforce placement constraints (e.g - [MAJOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(gpt-oss-review) — Test expects ValidationError but code raises ValueError or bypasses validation | Unit tests intest_bifrost_lane_overlay_placement_omn19215.pyassert that oversized placement specifications raise `p - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Placement mode 'spread' may allow traffic distribution to unauthorized backends | The 'spread' mode allows the routing authority to share first-choice traffic with the added backend. The comment state - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test for placement on a backend with a context_window smaller than the placement's max_context_tokens | The test test_a_placement_larger_than_the_context_window_fails_naming_the_backend tests that
…-placement # Conflicts: # docker/lane-overlays/dev.bifrost.yaml # src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py # src/omnibase_infra/runtime/render_bifrost_delegation_contract.py # tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 7
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 7 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True silently drops all default-valued placement fields, not just mode | The renderer change replaces an unconditional model_dump(mode="json") with model_dump(mode="json", exclude_def - [MAJOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test verifies that a non-default value for a non-mode field is still rendered | The test suite covers: spread mode passes through, fallback mode is omitted, and an unknown mode is rejected. There i - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Backward‑compatibility relies on omission of default mode field | The newmodeattribute is added to the placement model and rendered withexclude_defaults=Trueso that a fallback placement is byt - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread-mode routing semantics are documented in a comment but not enforced or tested at the model layer | The YAML comment describes spread-mode behavior in detail: stable hash of correlation id, retr - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — exclude_defaults=True on a str-Enum may behave unexpectedly with Pydantic v2 serialization | EnumBifrostLanePlacementMode is a str-Enum. In Pydantic v2, model_dump(mode="json") serializes enum members - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — No test for the YAML overlay file itself | The diff modifies dev.bifrost.yaml to add mode: spread to a backend's placement. There is no test that loads this specific YAML file and validates it against - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Potential loss of explicit default values when usingexclude_defaults|exclude_defaults=Trueremoves any field whose value matches the model's default, not only themodefield. If future defaul
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 6
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 6 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True drops all default-valued fields, not just mode | The renderer now calls model_dump(mode="json", exclude_defaults=True). This excludes every field whose value equals its Pydantic - [MAJOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread mode changes traffic distribution without rate-limit or quota enforcement | The YAML comment states that undermode: spreadthe routing authority picks .201 or .202 per request by a stable ha - [MAJOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test verifies that spread mode actually changes routing behavior | The three new tests verify serialization round-trip: spread renders with the key, fallback omits it, and an unknown value is rejec - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True is unsafe if Pydantic model gains a default-valued required field | The model currently has no fields with defaults other thanmode. Theexclude_defaults=Trueflag is a Pydan - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — No test for the interaction between spread mode and max_context_tokens overflow | The YAML comment states 'A prompt larger than 32768 tokens always stays on .201.' This is a critical routing invariant - [MINOR]
src/omnibase_infra/runtime/models/enum_bifrost_lane_placement_mode.py(qwen3-review) — Enum is a str-Enum but the model field uses the enum type, not str | EnumBifrostLanePlacementMode inherits from both str and Enum. The model field is typed as EnumBifrostLanePlacementMode, not str. Py
…ent as spread, and a fallback mode renders no mode key Integration Test Coverage refused the PR as a feature change with no integration test. Both cases drive the committed dev overlay through the real renderer; the fallback case is the negative control that keeps the pre-mode bytes for an older routing authority.
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 9
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 9 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True drops non-default scalar fields, breaking the byte-identical guarantee | The renderer now calls model_dump(mode="json", exclude_defaults=True). Pydantic's exclude_defaults exclud - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True also drops tier, fallback_for, max_context_tokens if they ever get defaults | The comment in the model docstring states that the renderer writes mode only when it is not the defa - [MAJOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — No test verifies that spread placements include all placement fields, not just mode | The unit test test_a_spread_placement_passes_its_mode_through asserts that the rendered placement equals the input - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(gpt-oss-review) — Addition ofmodefield changes public model contract | The newmodeattribute inModelBifrostLaneBackendPlacementextends the JSON schema of the placement object. Existing routing authorities th - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Comment in overlay YAML describes routing behavior that is not enforced by this codebase | The updated comment in dev.bifrost.yaml describes the routing authority's behavior in detail: stable hash of - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — No test for the case where mode is explicitly set to fallback in a spread-capable context | The unit test test_a_fallback_placement_renders_without_a_mode_key sets mode to fallback explicitly and veri - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — No validation that spread mode is only used with compatible rungs | The enum allows any placement to set mode: spread, but the routing authority's behavior (hash-based distribution across rungs) may o - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Use ofexclude_defaults=Trueadds serialization overhead |exclude_defaults=Trueforces Pydantic to compare each field against its default value duringmodel_dump, which can increase CPU usage w - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(gpt-oss-review) — Missing test for schema compatibility with strict validators | Current tests verify that fallback placements omit themodekey, but they do not assert behavior when a downstream consumer enforces st
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 11
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 11 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True drops non-default fields beyond mode, breaking byte-identical contract | The renderer now calls model_dump(mode="json", exclude_defaults=True) on the entire placement model. The - [MAJOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread mode with stable hash on correlation id enables traffic steering attacks | The comment in the YAML states that spread mode routes by a stable hash of the correlation id. An attacker who control - [MAJOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — No test verifies that spread mode is rejected by a routing authority that does not know the field | The negative control test (test_a_fallback_mode_in_the_dev_overlay_renders_the_pre_mode_bytes) verif - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(gpt-oss-review) — Unbounded max_context_tokens allows resource exhaustion | The ModelBifrostLaneBackendPlacement model validates max_context_tokens only with gt=0, lacking an upper bound. An attacker could supply an ex - [MAJOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(gpt-oss-review) — Default mode field serialized inconsistently across code paths | The model setsmodedefault to FALLBACK, but the renderer omits the field only whenexclude_defaults=True. Other serialization path - [MAJOR]
plan(gpt-oss-review) — Versioning risk introduced by optional placement mode field | Addingmodechanges the contract shape for lane placements. The current approach relies on omission of the default to preserve backward - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(qwen3-review) — exclude_defaults=True on a model with a str-Enum default may behave unexpectedly across Pydantic versions | The mode field is a str-Enum with default FALLBACK. Pydantic's exclude_defaults compares the - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test for the interaction between spread mode and the max_context_tokens overflow rule | The YAML comment states that a prompt larger than 32768 tokens always stays on .201, even in spread mode. Thi - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread mode couples routing policy to a single correlation id hash without a fallback for hash collisions | The design states that a transport failure on either engine retries the other. However, the - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(gpt-oss-review) — No test for max_context_tokens upper‑bound enforcement | The new upper‑bound validation is absent, yet the test suite only checks that an oversized placement is refused without confirming the specific - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Missing explicit error handling around model_dump | render_bifrost_delegation_contract callsbinding.placement.model_dumpwithout a try/except block. If the model contains invalid data (e.g., unknow
There was a problem hiding this comment.
Hostile Reviewer — adversarial findings (OMN-17492)
Models succeeded: qwen3-review, gpt-oss-review
Models failed: none
New finding threads: 0
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 12
Nit-level findings suppressed: 0
The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.
Below quorum: 12 finding(s) raised by one model only (OMN-18479)
These are reported and NOT dropped, but they get no thread and do not block: a single model's finding no other model reproduced is not evidence enough to stop a merge. Read them; act on them if they are right.
- [CRITICAL]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True silently drops required fields from rendered placement | The renderer now calls model_dump(mode="json", exclude_defaults=True) on ModelBifrostLaneBackendPlacement. Pydantic's exc - [MAJOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(qwen3-review) — exclude_defaults=True also excludes 'tier' if it ever acquires a default, breaking required-field contract | The use of exclude_defaults=True is a latent correctness hazard. Pydantic excludes any fiel - [MAJOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(qwen3-review) — No test verifies that required placement fields survive the exclude_defaults rendering | The new tests verify that 'mode' is present for spread and absent for fallback, and that the fallback placement - [MAJOR]
docker/lane-overlays/dev.bifrost.yaml, src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) — Addition ofmodefield breaks backward compatibility for older routing authorities | The newmodeattribute is added toModelBifrostLaneBackendPlacementand rendered into the overlay when set to - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread mode distributes traffic by correlation-id hash without documented collision or fairness guarantees | The comment states the routing authority picks .201 or .202 'by a stable hash of the correl - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — Spread mode with 4-slot limit on both engines may not improve throughput under sustained load | The comment states each engine enforces its own four-slot limit (.201 vLLM --max-num-seqs 4, .202 llama. - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — No test for the retry-on-transport-failure path between .201 and .202 | The comment states 'a transport failure on either retries the other'. No test in the diff exercises this retry path. The spread - [MINOR]
docker/lane-overlays/dev.bifrost.yaml(qwen3-review) — No test for the 32768-token boundary condition in spread mode | The comment states 'A prompt larger than 32768 tokens always stays on .201'. No test verifies that a prompt of exactly 32768 tokens is r - [MINOR]
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py(qwen3-review) — Mode field is a string enum but the rendered output is a string, not an enum, creating a type mismatch at the boundary | The model uses EnumBifrostLanePlacementMode (a str, Enum) for the 'mode' field, - [MINOR]
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py(gpt-oss-review) — Missing test for omission ofmodefield when default fallback is used | The test suite verifies that a fallback placement renders without amodekey, but there is no test covering the scenario whe - [MINOR]
src/omnibase_infra/runtime/render_bifrost_delegation_contract.py(gpt-oss-review) —exclude_defaults=Trueadds overhead to model serialization | Switching tomodel_dump(..., exclude_defaults=True)forces Pydantic to compare each field against its default value during serializatio - [MINOR]
src/omnibase_infra/runtime/models/model_bifrost_lane_backend_placement.py(gpt-oss-review) —modefield default not marked as optional may cause strict validation failures |modeis defined with a default value but the field is not declared as optional. Some Pydantic configurations treat
Summary
OMN-19215 AC4, omnibase_infra half. The omnimarket half is omnimarket#2913. This lets the lab's second Qwen3.8-27B host (.202) take a share of first-choice delegation traffic on the dev lane instead of idling behind .201. It answers the operator's delegation fan-out ruling (the parent delegation fan-out ticket, ledger RULING row 4257).
This branch is built on omnibase_infra#3999 (placement passthrough, same ticket), with
origin/devmerged in. Its diff therefore shows #3999's commits plus the one commit below. When #3999 merges first, the diff shrinks to that commit.ModelBifrostLaneBackendPlacementgainsmode(EnumBifrostLanePlacementMode:fallbackby default, orspread). An unknown mode is refused.exclude_defaults, so a fallback placement renders the same bytes feat(OMN-19215): carry a lane-added backend's tier placement through the bifrost renderer #3999 renders and that the released omnimarket accepts. Onlyspreadadds amodekey.local-omnipc2-chat(.202:8000) keeps its placement behindlocal-coderandlocal-heavy-reasoningwithmode: spread. The routing authority picks .201 or .202 per request by a stable hash of the correlation id, and a transport failure on either retries the other. A prompt over 32768 tokens stays on .201. Each engine keeps its own four-slot limit: .201 vLLM--max-num-seqs 4, .202 llama.cpp--parallel 4.Is an overlay change enough? (the operator's question)
Not on its own. Read at code:
devanddogfood(omnimarket/config/ci_bus_lanes.yaml). The dev-202, dev-200 and dev-105 overlays declarelocale: cloudwith zero backends by design. Adding lanes spreads orchestration, not inference._select_model_for_taskis first-match in declaration order.This PR plus omnimarket#2913 closes points 2 and 3. Point 1 is unchanged on purpose.
Lab proof
The .201 dev lane was hot-patched with this branch's renderer files and dev overlay, plus the omnimarket#2913 files, under ledger HOLD row 4528 and RELEASE row 4620. The rendered contract read back
mode: spread, and the runtime loggedmax_in_flight_records=8. Eight concurrent long-output delegations (150-integer oracle, 8/8 correct in both configs):Short oracle-rubric prompts are dominated by orchestration overhead and showed no measurable latency change. Across the spread rounds 16 of 46 requests were served by .202, attributed per correlation id from the routing log. The full table is in omnimarket#2913. Evidence is in omni_home
.claude_scratch/reports/delegation-fanout-2026-09-25/.Tests
tests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py: 3 new tests. A spread placement passes its mode through; an explicit fallback renders with nomodekey (the pre-mode bytes); an unknown mode is refused. 12 passed.test_dev_overlay_places_omnipc2_omn19215, serialization round-trip, lane-overlay CI, renderer and committed-lab-overlay render suites. 78 passed.mypy --strictis clean on the changed modules and the test. Pre-commit passed at commit.Landing order (required)
modekey, and the dev lane's delegation config would fail to load.After landing, re-run the fan-out harness against the deployed lane (no hot-patch) as the post-merge lab readback. Re-run C13, C14 and C29 as #3999's body lists.
Ticket: OMN-19215 (parent: the delegation fan-out ticket).
.202 back in routing (2026-09-27)
The stop-using-.202 pause on this PR is released: operator RULING 2026-09-27T20:32:19Z lane=omnipc2-routing-restore (ledger:11849, "ok, looks fine I think. put it back into routing"), RELEASE rows ledger:11850, 11851 and 11855. .202 was rebuilt on its boot NVMe.
Serving profile reconciled, no change needed. .202 now serves
Qwen3.8-27B-MTP-Q3_K_M.ggufwith a q8_0 KV cache through a systemd drop-in (profile in the internal planning corpus). Read live 2026-09-27T20:3xZ:GET .202:8000/v1/modelsid and aliasQwen3.8-27B,meta.n_ctx32768, ftype Q3_K - Medium;/propstotal_slots 4;/slotsn_ctx 32768 on each of 4 slots; the unit still runs-c 32768 --parallel 4 --kv-unifiedexactly as before the rebuild. From insideomninode-runtime-effectson the .201 dev lane,GET .202:8000/v1/modelsreturns 200 withQwen3.8-27B, and a real chat completion to .202 returnsmodel: Qwen3.8-27B. This PR encodes the served id, the 32768 window and the four-slot limit, all unchanged; it encodes no model file, quant or KV type. Only the quant (IQ4_XS to Q3_K_M) and KV type (f16 to q8_0) changed, which no identity or health probe here checks.Lab pass still owed, with .202 live. The earlier hotpatch proof ran while .202 was down. Path: this reaches the lane only after an omnimarket release containing omnimarket#2913 is in the dev-lane image (the lane's omnimarket 0.4.245 refuses
placement.mode). Then (1) the lab-pool proof on the head before it lands; (2) the compose-dev lab receipt keyed by the merged sha on the .201 dev lane; (3) the spread pair throughonex-apion the .201 dev lane: runs hashed tolocal-omnipc2-chatcomplete on .202 in one attempt, rung-hashed runs on .201, and an unmodified control on .201. This PR's commits contain every commit of omnibase_infra#3999.Branch updated from dev 2026-09-27; the dev-overlay placement test's minimal base contract now declares
local-embedding, which the dev overlay binds since omnibase_infra#4207 (commit 423eb90). Focused suites green locally at that head: 106 passed (placement unit and integration tests, renderer, lane-overlay model, committed-lab-overlay render, served-id render, typed-decision render, model roundtrip); ruff,mypy --strictand pre-commit clean on the changed file.State at 2026-09-28T02:25Z (lane fix-202-followups-83)
Landing order steps 1 and 2 are done. omnimarket#2913 is merged as da3555861 and is in the omnimarket tags v0.4.259 and v0.4.260. omnibase_infra#3999 merged as 7f88ed3 at 2026-09-28T01:17Z. The .201 dev lane runs the image built from 7f88ed3 (label
org.opencontainers.image.revision), and both runtime containers run omnimarket 0.4.261, which carriesenum_backend_placement_mode.pyfrom #2913. Read 2026-09-28T01:58Z.Step 3's premise holds. The placement this branch renders for
local-omnipc2-chat,{tier: local, fallback_for: [local-coder, local-heavy-reasoning], max_context_tokens: 32768, mode: spread}, was validated byModelDelegationBackendPlacement.model_validateinsideomninode-runtimeon the .201 dev lane (omnimarket 0.4.261). It was accepted withmode: spread. This was read only: the dict was piped todocker exec -i ... python -, and no file was written in the container.Branch updated from dev after #3999's squash. The squash conflicted with the copies of #3999's commits carried here in four files: the dev overlay, the placement model, the renderer and the placement unit test. Each was resolved to this branch's side, which is a strict superset of dev's side: dev's only differing lines were the pre-mode comment and the
model_dumpcall withoutexclude_defaults. The diff against dev is now exactly the spread delta: 5 files, +86/-4. Focused suites are green locally at 063c522: 189 passed and 1 skipped (placement unit and integration, renderer, added-backend, parameter-count, lane-overlay model and CI, served-id, committed-lab-overlay and typed-decision renders, model round-trip). ruff andmypy --strictare clean on the three changed modules, and pre-commit passed at commit.Lab pool readback (OMN-18893)
Still owed after merge (unchanged from the section above): (2) the compose-dev lab receipt keyed by the merged sha on the .201 dev lane, and (3) the spread pair through
onex-apion that lane. Runs hashed tolocal-omnipc2-chatshould complete on .202 in one attempt, rung-hashed runs on .201, and an unmodified control on .201. Then re-run the fan-out harness and C13, C14 and C29.Integration test (head fdd93c7)
Integration Test Coverage was red on 063c522 because the PR changed no test under tests/integration. fdd93c7 adds two cases to
tests/integration/runtime/test_dev_overlay_places_omnipc2_omn19215.py, both driving the committed dev overlay through the real renderer. The first checks that the omnipc2 placement renders withmode: spread. The second is a negative control: withmode: fallbackthe render carries nomodekey and matches the pre-mode shape. Focused: 16 passed (this file andtests/unit/runtime/test_bifrost_lane_overlay_placement_omn19215.py). ruff and mypy --strict are clean on the file.The only change since the lab-proven head 063c522 is this test file.
src/and the dev overlay are byte-identical, so the lab-pool PASS on lab-202 still describes the runtime this head builds. Hold note: the delegation-fanout ordering row of 2026-09-25T17:22:10Z is met. omnibase_infra#3999 is merged, and omnimarket#2913 is in omnimarket v0.4.259 (the .201 dev lane runs 0.4.261). The decision is recorded in the drain's hold revalidation (lane infra-backlog-83).Evidence-Ticket: OMN-19215
Evidence-Source: OCC#11316
Lab pool readback (OMN-18893)