Skip to content

feat(OMN-19507): dev-202 publishes its verify ports on the docker bridge gateway so a runner container reaches them - #4109

Merged
jonahgabriel merged 1 commit into
devfrom
jonah/omn-19507-dev-202-gateway-bind
Sep 25, 2026
Merged

jonahgabriel merged 1 commit into
devfrom
jonah/omn-19507-dev-202-gateway-bind

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

OMN-19507: dev-202 verify ports reachable from a runner container

Ticket: OMN-19507 (AC3 prerequisite), epic OMN-19500. Authority: operator RULING 2026-09-25T06:57:54Z in the omni_home rolling ledger (line 3238): the dev-202 overlay binds the docker bridge gateway address, not all interfaces and not the LAN, so fleet runners reach it via host.docker.internal.

Stacked on omnibase_infra#4095. This branch carries #4095's commits until it lands; the change here is the single commit df83c4fe8. Once #4095 lands, that commit is rebased onto dev (a clean replay: #4095's squash has the same tree as its branch head).

What changes

  • A per-merge verify job runs in a runner container, where localhost is the container itself. It reads a lane at host.docker.internal, the runner's host-gateway alias, which resolves to the default bridge gateway: 172.17.0.1 on .202 (read 2026-09-25 with docker network inspect bridge; daemon.json there sets no host-gateway-ip).

  • docker/docker-compose.dev-202.yml: runtime main 61085, effects 61086 and projection API 61002 are published on loopback AND on 172.17.0.1. Loopback stays because the deploy agent's own health probe reads localhost:<port>. Every other port (Postgres, Valkey, Redpanda, consumers, phoenix) stays loopback-only; a verify job reads those through the docker socket. Nothing binds all interfaces or the LAN address.

  • deploy/lane-census/lane-manifest.yaml: comment updated to say the same.

  • tests/ci/test_dev_202_lane_boundary_omn19505.py: the loopback-only test is replaced by three tests: (1) every port entry names a host address; (2) every port binds only loopback or the gateway, and every port is on loopback; (3) exactly {61085, 61086, 61002} are on the gateway.

  • RED first: with the new tests and the old overlay, test (3) failed (1 failed, 15 passed); with the overlay change all 16 pass. Focused runs: the boundary file plus lane-census manifest parity, sim-202 boundary and host-scope tests, all passing.

  • Rendered the compose triple (infra + dev-lane + dev-202, --profile runtime) locally with stub env values: 18 published entries across 28 services; the only non-loopback entries are the three gateway binds above.

  • Mechanism measured on .202 with throwaway containers on port 61999/61998 (removed after; 0 containers, 0 networks, 0 listeners left): a container on a user-defined network carrying host.docker.internal:host-gateway got PONG from a gateway-published port, got connection refused from a loopback-only one (reproducing the open finding), and the host's LAN address refused the port.

Not in this PR

Evidence-Ticket: OMN-19507
Evidence-Source: OCC#11238

@jonahgabriel jonahgabriel added the hold:auto-merge Holds auto-merge (check_auto_merge_hold.py); remove to release label Sep 25, 2026
jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 25, 2026
…ibase_infra#4109 (#11238)

* evidence(OMN-19507): author OCC companion for OmniNode-ai/omnibase_infra#4109

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

* evidence(OMN-19507): self-bind OCC#11238 + rebind contract_sha256

---------

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

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Critical findings: 0
Major findings: 1
Total findings: 6
Models succeeded: glm-review

Note: Fewer than 2 reviewer models succeeded. Degraded results are informational (OMN-8468/OMN-8524) and do not block merge. Error: cli_review exit 2 (fewer than 2 models succeeded — partial/total outage)


Semantics (OMN-17492 — the model finds, thread resolution gates)

Surface Meaning Blocks merge?
Review threads Per-finding, posted by the reviewer No (informational)
Hostile Review Thread Gate Deterministic: unresolved hostile-reviewer threads exist Fails until resolved (not yet a required context)
degraded verdict Fewer than 2 models succeeded (infra) No

Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review: qwen3-review, qwen3-review-b, glm-review (OMN-8468/OMN-8524/OMN-17492)

…dge gateway so a runner container reaches them

A per-merge verify job runs in a runner container and reads the lane at
host.docker.internal, which resolves to the docker bridge gateway (172.17.0.1
on .202). The dev-202 overlay bound every port to loopback only, which refuses
that alias. Runtime main 61085, effects 61086 and projection API 61002 are now
published on loopback and on the gateway; everything else stays loopback-only
and nothing binds all interfaces or the LAN. Tests assert both directions.
@jonahgabriel
jonahgabriel force-pushed the jonah/omn-19507-dev-202-gateway-bind branch from df83c4f to 0d55bc2 Compare September 25, 2026 08:45

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hostile Reviewer — adversarial findings (OMN-17492)

Models succeeded: glm-review
Models failed: codex
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] docker/docker-compose.dev-202.yml, VERIFY-RUNNER REACH comment block (glm-review) — Gateway bind exposes ports to every container on the host, not just the verify runner | 172.17.0.1 is the default bridge gateway, but it is reachable from any container on any Docker network on .202 t
  • [MINOR] docker/docker-compose.dev-202.yml; tests/ci/test_dev_202_lane_boundary_omn19505.py (glm-review) — Hardcoded 172.17.0.1 is an environment snapshot, not a contract | The address is correct only while the daemon defines no host-gateway-ip, the default address pool still allocates 172.17.0.0/16 to the
  • [MINOR] tests/ci/test_dev_202_lane_boundary_omn19505.py, _bindings and test_dev_202_lane_boundary_every_port_entry_names_a_host_address (glm-review) — Port-entry regex and split parsing admit malformed entries silently | The cross-check regex ([^"]*:\d+) matches any colon-suffixed string, and _bindings calls line.split(":") with fixed unpackin
  • [MINOR] tests/ci/test_dev_202_lane_boundary_omn19505.py (glm-review) — GATEWAY_REACHED_PORTS duplicates deploy_lane_routing.yaml with no consistency check | The set {61085, 61086, 61002} is transcribed from config/deploy_lane_routing.yaml into a hardcoded test constant.
  • [MINOR] tests/ci/test_dev_202_lane_boundary_omn19505.py (glm-review) — Boundary tests validate compose text only, never the listening sockets | All three port tests assert on the YAML source of the overlay. Docker Compose can render a !override differently than expecte

@jonahgabriel
jonahgabriel merged commit c8bdc74 into dev Sep 25, 2026
141 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-19507-dev-202-gateway-bind branch September 25, 2026 09:06
@jonahgabriel

Copy link
Copy Markdown
Collaborator Author

Lab proof on .202 at this head, taken before landing (rule 24), under the omni_home ledger HOLD of lane dev-202-bringup for surface 202-compose-dev:

  • The dev-202 lane was brought up on .202 from dev dfb949d: a workspace build of 64 s, then compose up. With dev's overlay, which binds loopback only, omnipc2-verify-runner-1 got 000 from http://host.docker.internal:61085/health, :61086/health and :61002/projections. That reproduces the open finding.
  • The .202 clone was then checked out at this head, 0d55bc2. Only omninode-runtime, runtime-effects and projection-api were recreated, with up -d --no-deps. ss -ltn then listed each of 61085, 61086 and 61002 on both 127.0.0.1 and 172.17.0.1, and on nothing else.
  • From inside the verify runner container, as the runner user, after the runtime turned healthy (restarts 0): 61085 answered 200, 61086 answered 200 and 61002 /projections answered 200.
  • From the Mac on the LAN, 192.168.86.202 ports 61085, 61002 and 61436 were closed. The positive control, llama.cpp on :8000, was open.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hold:auto-merge Holds auto-merge (check_auto_merge_hold.py); remove to release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant