Skip to content

feat(OMN-19543): declare the dev-200 lane on .200 with its own compose overlay on the 42xxx block - #4116

Merged
jonahgabriel merged 3 commits into
devfrom
jonah/omn-19543-dev-200-lane
Sep 25, 2026
Merged

jonahgabriel merged 3 commits into
devfrom
jonah/omn-19543-dev-200-lane

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

What

Declares dev-200, the third deployed dev lane, on the .200 host (hostname Stickybeatz-Studio). Ticket OMN-19543, epic OMN-19500. Authority: omni_home ledger RULING 2026-09-25T10:22:22Z (one deploy slot per lab host), amended by the CORRECTION 2026-09-25T10:22:36Z ("well for parllelism anyway"). The plan's verdict for .200 is VIABLE (lane lab-deploy-lanes-plan, TERMINAL 2026-09-25T10:29:02Z).

This PR follows the dev-202 template (#4095), with two differences, both because .200 runs macOS with Docker Desktop:

  • Port block 42xxx. dev-202's 61xxx block would fall inside the macOS ephemeral range, 49152-65535 (sysctl net.inet.ip.portrange). The block was claimed in the omni_home ledger STATUS row 2026-09-25T10:33:16Z, and lsof read no listener in it. The runtime is on 42085, effects on 42086 and the projection API on 42002. The full list is in the overlay header.
  • Every port binds loopback only. A macOS host has no 172.17.0.1 bridge gateway, and the lane does not need one. Docker Desktop forwards a container's host.docker.internal to the macOS host's loopback. I measured this on .200 with throwaway containers. A server published on 127.0.0.1:42999 answered a busybox container at host.docker.internal:42999 both with and without the host-gateway alias. The LAN address 192.168.86.200:42999 refused the same server.

Changed files:

  • docker/docker-compose.dev-200.yml is the overlay. It renames the project, every container, the network and every volume, and republishes every port.
  • docker/lane-overlays/dev-200.bifrost.yaml sets cloud locale with no local backend. It binds nothing on the .201 model server and nothing on .200's planner on port 8130.
  • deploy/lane-census/lane-manifest.yaml adds the dev-200 entry on lab-200, with optional: true and a fresh verified: line.
  • scripts/generate_claude_lane_block.py adds the dev-200 row.
  • The lane stays out of GOVERNED_LANES and GRANT_INTERLOCK_LANES.

Tests

  • New file tests/ci/test_dev_200_lane_boundary_omn19543.py, adapted from the dev-202 boundary test. It checks:
    • the lane is ungoverned;
    • it is declared on lab-200 only;
    • every port binds loopback only, and every port sits in 42000-42999, below the ephemeral range;
    • every dev service is declared under a dev-200 name;
    • there is no keycloak and no infisical;
    • the lane touches nothing on .201;
    • the census on .200 checks dev-200 and dogfood;
    • a stopped runtime is still a finding.
  • test_lane_census_manifest_parity.py adds dev-200 to the compose-lane ratchet. test_lane_census_host_scope_omn19088.py adds dev-200 to the lanes that do not apply on the .101 and .105 dogfood hosts.
  • RED. With the manifest, the generator and the two new overlay files restored to origin/dev, 15 tests fail. A path checkout restored the files.
  • GREEN. 168 passed across the lane-census, boundary and generator suites. A further 156 passed and 2 skipped across the compose and bifrost scanners.

Lab

The lab run happened before this PR opened, under the ledger HOLD 2026-09-25T10:47:49Z-dev-200-lane on surface 200-compose-dev. The lane ran from the stacked branch head 63376a979, which carries this commit.

  • Build. The workspace build ran from 10:50:38Z to 10:54:11Z. compose up of omnibase-infra-dev-200 ran from 10:54:16Z to 10:56:00Z.
  • Health. /health returned 200 on 42085, 42086 and 42002 at 11:16Z. Runtime and effects were healthy with RestartCount 0.
  • Census on .200. scripts/lane-census-check.sh --json at 11:17Z read host lab-200, lanes checked dogfood and dev-200, has_drift false.
  • Other services on the host. The dogfood stack, the omn18012 brokers, the planner on port 8130 and the hook-emit-drainer were unchanged. Container StartedAt and RestartCount were identical before and after.
  • Finding (not introduced here). omnimarket-dev-200-projection-tenant-registry-writer is unhealthy because onex.tenant.events does not exist on the lane's own broker. dev-202's copy of this writer was restarting at the same moment (read-only docker ps on .202, 11:16Z). So the gap belongs to the template: an isolated lane broker never gets that topic.

Runtime classification

This PR is runtime-affecting, because it adds a compose overlay. It changes nothing on .201: no .201 lane reads the new files.

Landing order

  1. This PR.
  2. The deploy-agent PR stacked on it, which makes each instance's composition data and declares the dev-200 instance. It goes solo.
  3. The receipt-lane PR stacked on that one, which is non-runtime.

Evidence-Ticket: OMN-19543
Evidence-Source: OCC#11258

…e overlay on the 42xxx block

Onex-Lane: dev-200-lane
Onex-Session: 50705c397acd4413bdee8c1379652cf8
@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

No OCC evidence companion was minted for this PR.

this PR is already bound to OCC#11258; its evidence companion exists and nothing needs authoring

To clear this: Nothing to do — the companion already exists.

Reported by node_occ_companion_effect (decline code already_bound, OMN-16665). This decision was made against the PR's LIVE state at compute time, not at publish time — a green publisher job only means the command reached the broker.

jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 25, 2026
…ibase_infra#4116 (#11258)

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

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

* evidence(OMN-19543): self-bind OCC#11258 + 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 — REVIEWED

Critical findings: 0
Major findings: 5
Total findings: 15
Models succeeded: qwen3-review,qwen3-review-b,glm-review

Action required: findings were posted as review threads. Address or reject each one, then resolve its thread — the Hostile Review Thread Gate fails while hostile-reviewer threads are unresolved (OMN-17492).


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) Fails this job with a named reason

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

@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: qwen3-review, qwen3-review-b, glm-review
Models failed: none
New finding threads: 4
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 15
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: 15 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] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review) — Regex in _published_port_lines matches only 3-part port entries, breaking loopback-only test | The helper _published_port_lines uses the regex r'^\s+-\s+"([^"]:\d+:\d+)"\s$' which requires exactly t
  • [MAJOR] docker/docker-compose.dev-200.yml (qwen3-review) — Redpanda external listeners bind 0.0.0.0 inside container, exposed via loopback host port | The Redpanda service overrides its command to bind external listeners on 0.0.0.0:19092 and 0.0.0.0:18082 ins
  • [MAJOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review) — Test asserts BIFROST_LANE_OVERLAY_PATH count is 4, but overlay mounts it in 4 services; verify count matches actual services | The test test_dev_200_lane_boundary_reaches_nothing_on_201 asserts that t
  • [MAJOR] tests/ci/test_dev_200_lane_boundary_omn19543.py, test_dev_200_lane_boundary_reaches_nothing_on_201 (qwen3-review-b) — Test asserts 4 Bifrost overlay mounts but overlay defines 5 | The test test_dev_200_lane_boundary_reaches_nothing_on_201 asserts that the string `./lane-overlays/dev-200.bifrost.yaml:/app/config/del
  • [MAJOR] tests/ci/test_dev_200_lane_boundary_omn19543.py, test_dev_200_lane_boundary_declares_every_dev_service_under_its_name (qwen3-review-b) — DEV_TO_DEV_200 mapping omits services present in manifest | The test test_dev_200_lane_boundary_declares_every_dev_service_under_its_name asserts that the set of services declared in the dev lane
  • [MAJOR] docker/docker-compose.dev-200.yml, x-omninode-contract-overlay and redpanda command (glm-review) — Redpanda advertises 127.0.0.1 to clients that are not on the macOS host | The advertised external Kafka/proxy addresses are 127.0.0.1:42192 and 127.0.0.1:42182. Metadata returned to any client resolve
  • [MAJOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (glm-review) — No parity test between overlay container_name and manifest service names | The census test synthesizes container rows from the manifest (via _healthy_dev_200_rows) rather than from the rendered compos
  • [MINOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review) — DEV_TO_DEV_200 mapping omits several services declared in the dev lane | The test test_dev_200_lane_boundary_declares_every_dev_service_under_its_name asserts that the set of services declared in the
  • [MINOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review) — Lane manifest declares dev-200 as optional, but the test asserts optional is True | The lane manifest declares dev-200 with optional: true, and the test test_dev_200_lane_boundary_manifest_declares_la
  • [MINOR] docker/docker-compose.dev-200.yml (qwen3-review) — Redpanda memory set to 2G with 7000 partitions per shard may cause performance issues | The Redpanda service is configured with --memory 2G and --set topic_partitions_per_shard=7000. This is a high pa
  • [MINOR] docker/docker-compose.dev-200.yml, redpanda service (qwen3-review-b) — Redpanda admin port exposed on loopback | The Redpanda admin port (42644) is published on 127.0.0.1. While loopback-only binding is safer than exposing on all interfaces, the admin port provides full
  • [MINOR] docker/docker-compose.dev-200.yml, redpanda service (qwen3-review-b) — Redpanda memory limit may be too low for parallel lanes | The Redpanda memory limit is set to 2G by default (${DEV_200_REDPANDA_MEMORY:-2G}). The comment notes that the Docker Desktop VM on .200 is
  • [MINOR] docker/docker-compose.dev-200.yml (glm-review) — Lane label coverage is inconsistent across the overlay's services | Some services carry com.omninode.lane: dev-200 (forward-migration, cloud-migrations, onex-api, tenant-projection-writer, infra-routi
  • [MINOR] docker/docker-compose.dev-200.yml, ports blocks (glm-review) — Loopback publish still exposes unauthenticated Postgres, Valkey and Redpanda to every local process | Binding to 127.0.0.1 confines exposure to the host, but on a shared lab workstation every local pr
  • [MINOR] docker/docker-compose.dev-200.yml, port block comment (glm-review) — Reserved port 42090 sits in the declared block but has no enforcement | The comment reserves 42090 for onex-api, which is disabled on this lane, so nothing binds it. If onex-api is later enabled with

Findings not anchored to a changed file

  • [MINOR] hostile-reviewer (qwen3-review-b)

    Test relies on regex parsing of YAML, fragile to formatting changes | The test _published_port_lines() uses a regex to parse port entries from the YAML file. This is fragile to formatting changes, such as changes in indentation, quotes, or the order of fields. If the YAML is reformatted, the test may fail even if the port bindings are correct. Consider using a YAML parser to extract port bindings instead of regex. | Evidence: In tests/ci/test_dev_200_lane_boundary_omn19543.py, the function `_published_por

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (glm-review)

    Port checks parse YAML with regex and count a port that can never bind | _published_port_lines and _bindings scrape raw text with regex, so the disabled onex-api's 127.0.0.1:42090:8000 entry is counted as a binding. The loopback test then asserts a set that includes a port Docker will never publish while the service is profile-gated, making the test's claim ("every published port binds loopback only") vacuously include an unbindable port. Regex parsing also silently passes if a future entry uses flow style,

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

Findings demoted from threads (anchor rejected)

  • [MINOR] hostile-reviewer (qwen3-review)

    Test for .201 dev container on .200 uses a hardcoded container name that may not match the actual dev lane container name | The test test_dev_200_lane_boundary_a_201_dev_container_on_200_is_a_finding creates a row with the container name 'omninode-runtime' and project 'omnibase-infra'. This assumes that the .201 dev lane's container name is 'omninode-runtime' and its project is 'omnibase-infra'. If the .201 dev lane uses a different container name or project, the test will not correctly simulate a .201 dev

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review)

    No test verifies that the dev-200 lane's network is isolated from other lanes' networks | The overlay defines a custom network omnibase-infra-dev-200-network, but there is no test that verifies this network is not shared with any other lane's network. If another lane's compose file also defines a network with the same name, or if a service in another lane is attached to this network, the isolation assumption is broken. A test that scans all compose files for network definitions and asserts that no other lan

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review-b)

    Missing test for volume isolation | The test suite verifies port bindings, service naming, and census behavior, but does not explicitly test that volumes are isolated between lanes. The overlay defines volumes with omnibase-infra-dev-200- and omninode-dev-200- prefixes, but there is no test that asserts no volume name collides with other lanes' volumes. A collision could lead to data corruption or unexpected behavior. | Evidence: The test file tests/ci/test_dev_200_lane_boundary_omn19543.py does not i

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (glm-review)

    Cross-lane port clarity check has false positives and misses non-compose files | test_dev_200_lane_boundary_block_is_clear_of_every_other_lane greps all other compose files for the literal pattern 42\d{3}; any occurrence of such a number in a comment, image tag, or memory value in another file blocks the lane even with no port conflict. Conversely it only scans docker/docker-compose*.yml, so a conflicting port declared in a lane overlay file, a script, or a kustomize manifest is invisible. | Evidence: for p

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

…0-lane

# Conflicts:
#	deploy/lane-census/lane-manifest.yaml
#	scripts/generate_claude_lane_block.py
#	tests/unit/scripts/test_lane_census_manifest_parity.py

@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: qwen3-review, qwen3-review-b, glm-review
Models failed: none
New finding threads: 6
Deduped (already posted on this PR): 0
Below quorum (one model only, reported not threaded): 7
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: 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] docker/docker-compose.dev-200.yml, deploy/lane-census/lane-manifest.yaml (qwen3-review) — Redpanda external Kafka port collides with existing isolated prover stack | The lane manifest's own verified comment for dev-200 records that the .200 host already has an 'isolated prover stack' liste
  • [MAJOR] docker/docker-compose.dev-200.yml (qwen3-review) — Mounting /dev/null as a read-only secret file is a silent failure mode | The overlay mounts /dev/null:/run/secrets/vertex_access_token:ro for omninode-runtime, runtime-effects, and runtime-worker. T
  • [MAJOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review) — Missing test for the Bifrost overlay's refusal to bind local backends | The Bifrost overlay dev-200.bifrost.yaml sets locale: cloud and backends: []. The comment says 'the renderer disables ever
  • [MINOR] docker/docker-compose.dev-200.yml (qwen3-review) — Redpanda memory allocation of 2G may be insufficient for the partition count | The Redpanda command sets --memory 2G and topic_partitions_per_shard=7000. With 7000 partitions per shard and a singl
  • [MINOR] docker/docker-compose.dev-200.yml (qwen3-review-b) — Redpanda external listeners bind 0.0.0.0 inside the container | The Redpanda command overrides set --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092 and --pandaproxy-addr internal://0.0.0.
  • [MINOR] docker/lane-overlays/dev-200.bifrost.yaml (qwen3-review-b) — Bifrost overlay with empty backends may cause silent delegation failures | The dev-200 Bifrost overlay sets locale: cloud and backends: []. The comment states that no cloud credential is supplied, so
  • [MINOR] tests/ci/test_dev_200_lane_boundary_omn19543.py (qwen3-review-b) — Census test uses synthetic rows that may not match real container output | The census tests (test_dev_200_lane_boundary_census_on_200_reads_clean and test_dev_200_lane_boundary_census_still_reports_a_

Findings demoted from threads (anchor rejected)

  • [MAJOR] hostile-reviewer (qwen3-review)

    Test regex for port entries is fragile and may miss multi-line or differently-formatted entries | The test _published_port_lines() uses the regex ^\s+-\s+"([^"]*:\d+:\d+)"\s*$ with re.MULTILINE. This matches lines like - "127.0.0.1:42436:5432". However, the test test_dev_200_lane_boundary_every_port_entry_names_a_host_address compares sorted(entries) (which matches the two-part form host-port:container-port) against sorted(_published_port_lines()) (which matches the three-part form). T

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MAJOR] hostile-reviewer (qwen3-review-b)

    Regex for published port lines misses unquoted entries | The helper _published_port_lines() uses the pattern r'^\s+-\s+"([^"]:\d+:\d+)"\s$' which requires the port entry to be wrapped in double quotes. If any port entry in the overlay is written without quotes (e.g., - 127.0.0.1:42436:5432), the regex will not match it, and the test test_dev_200_lane_boundary_every_published_port_binds_loopback_only will silently pass with an incomplete set of bindings. The test test_dev_200_lane_boundary_every_port_entry

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review)

    The test test_dev_200_lane_boundary_relabels_every_dev_lane_label uses a fragile line-by-line regex | The test parses the dev-lane and dev-200 compose files line by line with a regex to find service names and labels. This is fragile: if a service name is on the same line as its colon (e.g., service: instead of service: on its own line), the regex will miss it. The regex ^ ([A-Za-z0-9_.-]+):\s*$ requires the service name to be on a line by itself with exactly two leading spaces. This is a common YAM

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review)

    No test for the optional: true flag's effect on census findings | The manifest sets optional: true for dev-200. The comment says 'a declared lane with nothing running yields no finding, and one with any declared service running is reconciled in full'. There is no test that verifies this behavior. The test test_dev_200_lane_boundary_census_on_200_reads_clean tests the case where all services are running, but there is no test for the case where no services are running (which should yield no finding due

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review-b)

    Test does not verify that disabled services are not started | The test test_dev_200_lane_boundary_declares_no_forbidden_service checks that keycloak and infisical have the dev-200-disabled profile and no container_name. However, it does not verify that the profile dev-200-disabled is not activated in the compose invocation. If a future deploy script accidentally activates that profile, the services would start. The test suite should include a check that the deploy command (documented in the overlay header)

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (qwen3-review-b)

    Port block collision test only scans committed compose files | The test test_dev_200_lane_boundary_block_is_clear_of_every_other_lane scans all docker-compose*.yml files in the docker/ directory for 42xxx port literals. This is a static check that only covers committed files. If a new compose file is added in a future PR that uses a 42xxx port, the test will catch it. However, if a port is allocated dynamically at runtime (e.g., via a script that picks a free port in the 42000-42999 range), the test will no

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

@jonahgabriel
jonahgabriel merged commit 0bbb82f into dev Sep 25, 2026
146 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-19543-dev-200-lane branch September 25, 2026 13:00
jonahgabriel added a commit that referenced this pull request Sep 25, 2026
Resolves the routing table against #4105 (verify: blocks) and #4116 (the
dev-200 lane declaration): dev-202 keeps its lane: and verify: blocks, and
dev-200 gets a verify: block on its 42xxx ports with receipt lane
compose-dev-200 (EnumLabLane.COMPOSE_DEV_200, the same hunk as #4118).
No route names dev-200: no runner carries host-200 yet.

Onex-Lane: lab-200-deploy-83
Onex-Session: c2d0be217b2d4bc7b90c63f1e06e5adc
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