Skip to content

feat(OMN-19522): the dev-202 deploy-agent instance runs its own composition with the .201-only phases off - #4101

Merged
jonahgabriel merged 7 commits into
devfrom
jonah/omn-19522-dev-202-executor-lane
Sep 25, 2026
Merged

jonahgabriel merged 7 commits into
devfrom
jonah/omn-19522-dev-202-executor-lane

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

What

Remaining B3 work of the second-deploy-slot plan (knowledge-base-internal beta/plans/2026-09-24-second-deploy-slot-plan.md, epic OMN-19500). Ticket: OMN-19522. Operator authority: omni_home ledger RULING 2026-09-25T00:56:45Z (lane merge-drain-83).

Stacked on omnibase_infra#4097 (OMN-19506) and omnibase_infra#4095 (OMN-19505). This branch carries their commits. It adds one commit of its own, 65eba4b67. Land it after both, then merge dev in before it lands. See the landing order below.

Summary (drafted by lab delegation run 87a26441-103c-4c51-99c2-67c12c319917 from a fact list, then checked against the diff):

  • The deploy agent now has two routing instances, dev-201 and dev-202. The executor picks its compose configuration by the instance, not by the wire lane alone. Before this change, a dev-202 agent would have rendered the .201 composition (project omnibase-infra, ports 8085/8086) on .202.
  • executor.DEV_INSTANCE_LANE_CONFIGS is keyed by instance. select_dev_instance(name) runs once at agent start, with the instance the router resolved. An unknown name refuses start. It never falls back to .201's composition.
  • The dev-202 config:
    • compose files: infra, dev-lane and the dev-202 overlay;
    • compose project and build project: omnibase-infra-dev-202;
    • postgres container: omnibase-infra-dev-202-postgres;
    • health targets: service names on ports 61085 and 61086;
    • main runtime container: omninode-dev-202-runtime, which the lineage fence reads.
  • dev-202 switches off four phases that exist only on .201:
    • the gateway deploy;
    • the k3s onex-lab overlay apply and its repair build;
    • the onex-api pin delivery;
    • the Infisical seed, which is recorded as skipped.
  • The services the overlay disables by profile are never compose arguments, because naming one would auto-activate its profile: onex-api, the two cloud-migration one-shots, keycloak, infisical and gateway-forwarder.
  • dev-201, and an agent with no router, behave exactly as before. Tests pin this.
  • Two new files, neither installed on any host:
    • scripts/deploy-agent/deploy/deploy-agent-dev-202.service;
    • scripts/deploy-agent/deploy/dev-202.env.template, which holds variable names only. The test derives the required set from the compose triple's required variables, minus docker/runtime-policy.env.

Why the build project changed too

Compose names a built image <project>-<service>. If the lane is built under omnibase-infra and brought up under omnibase-infra-dev-202, the up finds no image and builds a second one, without the GIT_SHA build args. A new build_project field defaults to omnibase-infra, so every other lane issues exactly the same build argv as before.

Tests

  • New file scripts/deploy-agent/tests/unit/test_dev_202_executor_lane_omn19522.py, 27 tests. The names carry the ticket's falsifier selectors: dev_202_lane_config, dev_202_phases_off, dev_201_unchanged, dev_202_unit and dev_202_env_template.
    • The dev-202 literals are read back from docker/docker-compose.dev-202.yml: project name, postgres container, runtime container, published health ports and the profile-disabled set.
    • The executor's instance set is checked to equal the routing table's.
  • conftest.py resets the selected instance to dev-201 for every test.
  • RED. Against feat(OMN-19506): route each dev rebuild command to one deploy-agent instance by a declared table #4097's executor the new module does not import. Mutation controls on this commit:
    • removing the select_dev_instance call in agent.py fails ..._is_selected_by_agent_construction;
    • removing the lab-overlay gate fails both phases_off job tests.
    • Both mutations were restored with a path checkout.
  • GREEN.
    • The whole deploy-agent unit suite: 1113 passed and 1 skipped (uv run pytest tests/unit in scripts/deploy-agent).
    • mypy is clean on executor.py and agent.py.
    • pre-commit run --files passes on all 6 changed files (57 hooks passed).

Lab

  • There is no lab run, and none is possible yet. Decision 19 of the unified verification plan allows no clone and no .git on .202 while the C13, C14 and C29 producers run bare there. C29's container move is omninode_infra#1663, which is still open. The unit is therefore in the repo and not installed.
  • On .201 this is a no-op.
    • The committed routing table routes nothing to dev-202.
    • The .201 agent resolves dev-201, and dev-201's config is the object _LANE_CONFIGS[DEV], unchanged.
    • The agent's own self-update is the readback. The journal should still name dev-201, consumer group onex-deploy-agent.

Runtime classification

This PR is runtime-affecting because it changes the deploy agent (scripts/deploy-agent). It goes SOLO with the agent idle, after #4097.

Landing order across this epic's open PRs

  1. feat(OMN-19505): declare the dev-202 lane on .202 with its own compose overlay #4095 (B2, dev-202 lane declaration).
  2. feat(OMN-19506): route each dev rebuild command to one deploy-agent instance by a declared table #4097 (B3, routing; deploy agent, solo).
  3. This PR (B3 executor; deploy agent, solo). Merge dev in after 1 and 2.
  4. feat(OMN-19507): add the compose-dev-202 lab-pass receipt lane, outside the any-of default #4098 (B5 AC1, receipt lane) and then feat(OMN-19508): staging delivery and the omnimarket release cut admit a compose-dev-202 PASS #4099 (B6), which are independent of 1 to 3.
  5. The B5 AC2 PR from this lane, stacked on feat(OMN-19507): add the compose-dev-202 lab-pass receipt lane, outside the any-of default #4098.

Evidence-Ticket: OMN-19522
Evidence-Source: OCC#11207

…e overlay

Second-deploy-slot plan task B2 (epic OMN-19500). A dev-shaped lane on the
.202 host, layered on the dev composition, with its own Postgres, Redpanda
and Valkey, loopback ports in the 61xxx block, its own Bifrost overlay with
no local model rung, and every service the .201 dev lane declares under a
dev-202 name. Keycloak and Infisical are disabled; onex-api and its cloud
migrations are profile-gated. Declared, not built.
…nstance by a declared table

Second-deploy-slot plan task B3 (epic OMN-19500). config/deploy_lane_routing.yaml
maps a dev command's requesting repository to one agent instance and names
dev-201 as the pinned default. Each instance subscribes with its own declared
consumer group (dev-201 keeps onex-deploy-agent so .201's offsets carry over)
and skips a command routed elsewhere, committing its offset and publishing
nothing, before the busy and duplicate checks. The route is read from the
table at the command's own git_ref, as the TLA+ model on the ticket requires.
The committed table routes nothing to dev-202 yet.
…sition with the .201-only phases off

The executor keys the dev lane's compose files, project, build project,
postgres container, health targets and main runtime container by the routing
instance the agent resolved (OMN-19506), selected once at agent start. The
dev-202 instance renders the infra + dev-lane + dev-202 triple under
omnibase-infra-dev-202 with health ports 61085/61086, never names the services
its overlay disables, and skips the gateway deploy, the k3s onex-lab overlay and
repair build, the onex-api pin delivery and the Infisical seed. dev-201 and a
router-less agent are unchanged.

Adds scripts/deploy-agent/deploy/deploy-agent-dev-202.service (not installed:
decision 19 of the unified verification plan) and a names-only
dev-202.env.template derived from the compose triple's required names.
@jonahgabriel jonahgabriel added the hold:auto-merge Holds auto-merge (check_auto_merge_hold.py); remove to release label Sep 25, 2026
onexbot-occ-writer Bot pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 25, 2026
…fra#4101

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head 65eba4b6762cc993b06e5c992dca88a75df20351.
jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 25, 2026
#11207)

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

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

* evidence(OMN-19522): self-bind OCC#11207 + rebind contract_sha256

---------

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

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Critical findings: 0
Major findings: 0
Total findings: 0
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)

…2-executor-lane

# Conflicts:
#	scripts/deploy-agent/deploy_agent/agent.py
#	scripts/deploy-agent/tests/unit/conftest.py
@jonahgabriel
jonahgabriel merged commit dfe3fc4 into dev Sep 25, 2026
135 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-19522-dev-202-executor-lane branch September 25, 2026 09:27
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