Skip to content

chore: release v0.4.0 (OMN-12245) - #926

Merged
jonahgabriel merged 78 commits into
mainfrom
promotion/OMN-12245-v0.4.0
May 26, 2026
Merged

jonahgabriel merged 78 commits into
mainfrom
promotion/OMN-12245-v0.4.0

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented May 26, 2026 •

Copy link
Copy Markdown
Contributor

Promotion: dev to main (OMN-12245)

Release candidate: rc-2026-05-25
Source: dev (171 commits since v0.3.1)

This is a promotion PR as part of the May 25 integration release (OMN-12245).

Evidence-Source: OCC#1710
Evidence-Ticket: OMN-12245
Evidence-Class: promotion
promotion-receipt: OCC-1738

Supersedes closed PR #922 after GitHub closed the PR during branch identity rename for Receipt Gate.

…le (#840)

Pure stateless compute nodes (aggregator, decomposer, registry) had
runtime_profiles: [market] but no market container exists. Changed to
runtime_profiles: [] so they run in any profile.
- Add operation fields to node_architecture_graph_populate_effect (4 routing entries)
  and node_architecture_graph_query_effect (4 routing entries) to resolve
  ONEX_CORE_064 duplicate dispatcher registration crashes
- Add operation fields to node_projection_swarm (2 topic entries) for same reason
- Remove PeriodicHeartbeatEmitter from node_projection_registration handler_routing
  (DI-uninjectable: requires db + publish_fn args the container cannot satisfy)
- Remove handler_routing from node_knowledge_context_assembler_orchestrator
  (handler requires 4 un-wirable backend dependencies)
…ilter (#842)

The Codex adapter subscribed to `request.response_topic` (the generic
pattern-b-dispatch-completed topic) even when dispatching delegate-skill
commands.  The runtime publishes delegate-skill results to the
contract-declared topics (`onex.evt.omnimarket.delegate-skill-completed/
failed.v1`), so the client never received the reply.

Fix: in `_dispatch_deployed_async`, when the command targets the
delegate-skill contract, override the route terminal topic to the
contract-declared completed/failed topics before calling
`wait_for_result`.  Add the corresponding topic constants to
`adapters/codex/topics.py`.

Adds a regression test that dispatches with the wrong (generic pattern-b)
response_topic and asserts the correct contract topics were subscribed.
…te (#843)

All 4 endpoint entries in endpoint_registry.yaml had stale model_ids
that would cause routing 404s against the actual vLLM/MLX deployments.
Updated to the live-verified identifiers: cyankiwi/Qwen3-Coder-30B-A3B-Instruct-AWQ-4bit,
Corianas/DeepSeek-R1-Distill-Qwen-14B-AWQ, deepseek-ai/DeepSeek-R1-Distill-Qwen-32B,
and mlx-community/Qwen3-Next-80B-A3B-Instruct-4bit.
…id PR (#844)

Three gates that were failing on main before #843 merged now block
the follow-up annotated endpoint_registry commit:

1. Leaked Literals Gate: add onex-allow-model-id annotations for the
   3 non-deepseek-ai/ model IDs in endpoint_registry.yaml so the gate
   can distinguish intentional operator-registry literals from leaks.

2. Unimported handler check: baseline HandlerKnowledgeContextAssemblerOrchestrator
   introduced in OMN-11935 (#834) without a local baseline entry.

3. no-hardcoded-topics pre-commit hook: exclude docs/adr-canary/ from
   the scan — the ground_truth_manifest.yaml quotes topic strings as
   documentation examples, not code literals. CI scripts (which only
   scan src/**/*.py) were already excluding this path implicitly.
…ction reducer (#846)

Synthetic golden-chain test events with no token/cost data were polluting
delegation_events. Guard added to project_delegate_skill_terminal(): skip
insert when tokens_input, tokens_output, and cost_usd are all zero.
Three new tests cover: zero-token skip, real-token accept, cost-only accept.
Replace stale HuggingFace checkpoint paths with actual vLLM-served model
IDs as returned by /v1/models on each endpoint. This aligns the model_id
written to delegation_events (delegated_to column) with the values that
ModelPricingTable.estimate_cost() uses for cost lookups.

Changes:
- qwen3-coder-30b → qwen3.6-35b-a3b (id), Qwen3.6-35B-A3B (model_id), ctx 112k→131072
- deepseek-r1-14b → qwen3.6-27b-mtp-iq4xs (id), Qwen3.6-27B-MTP-IQ4_XS.gguf (model_id), ctx 24k→98304, provider vllm
- deepseek-r1-32b → text-embedding-gte (.201:8002 embeddings), ctx null→8192
- qwen3-next-80b → deepseek-v4-flash (.200:8101 ds4), ctx null→131072
- added deepseek-v4-pro (.200:8101 alias)

All context_window values probe-verified against live /v1/models responses.
…andler_routing (#848)

When a contract declares handler_routing:, discovery.py uses
_parse_handler_routing() which reads event_model: (dict form) per-handler
entry. The delegate-skill contract had no event_model: under its
handler_routing.handlers[] entry, so _make_dispatch_callback passed the
raw envelope payload dict directly to handle() instead of calling
ModelDelegateSkillRequest.model_validate(payload) first.

This caused AttributeError: 'dict' object has no attribute 'correlation_id'
on every delegation dispatch. Adds the event_model: block following the
same pattern used by node_rsd_orchestrator and other typed orchestrators.

Companion to OMN-11996 (missing DispatchResultApplier in service_kernel).
…ded facts (#845)

Replace hardcoded context_window literals in bridge_config_loader.py and
adapter_delegation_router.py with registry-driven lookups via a new
registry_context_windows module. Local model tiers (qwen3-coder-30b,
deepseek-r1-14b, deepseek-r1-32b) now read context windows from
model_registry_v1.yaml; frontier cloud tiers (GLM, Gemini, OpenAI) have no
registry entry yet and use named module-level constants as explicit fallbacks.
Also updates the 4-tuple unpack in test_contract_model_routing_env_alignment
to match the new 3-tuple _MODEL_KEY_REGISTRY shape.
…estrator (#849)

Adds `route_event(topic, payload)` to HandlerSwarmDispatchOrchestrator so
each of the 5 response event topics (health-completed, decomposition-completed,
endpoints-selected, fanout-completed, aggregation-completed) is routed to the
correct FSM transition rather than always restarting at RECEIVED.

FSM state is persisted per run_id via injected ProtocolStateStore (optional;
handler degrades gracefully without it). Topic→transition mapping is derived
from contract.yaml subscribe_topics at construction time — no hardcoded strings.

Also adds `handle_async` state persistence so the initial RECEIVED state is
stored before the first response event can arrive.

Integration test (test_fsm_routing_integration.py) proves full traversal:
RECEIVED → HEALTH_CHECKED → DECOMPOSED → ENDPOINTS_SELECTED →
DISPATCHING → AGGREGATING → COMPLETED across 58 passing tests.
…850)

Adds queue-based dispatch mode to node_swarm_fanout_effect and introduces
node_swarm_worker_agent so workers on NAT/firewalled machines connect out
to the runtime rather than receiving inbound HTTP.

- EnumDispatchMode.DIRECT preserves existing HTTP push behavior (default)
- EnumDispatchMode.QUEUE publishes subtask assignments to
  onex.cmd.omnimarket.swarm-subtask-assigned.v1 and collects results
  from onex.evt.omnimarket.swarm-subtask-completed.v1 via injected
  ProtocolQueuePublisher / ProtocolQueueSubscriber
- node_swarm_worker_agent subscribes to assignment topic, filters by
  worker_id (empty = accept all), calls local model endpoint, publishes
  ModelSwarmSubtaskResult to completion topic
- Shared types (ModelSwarmSubtaskAssignment, ModelSwarmSubtaskResult,
  EnumExecutionStatus) promoted to omnimarket.models.swarm to avoid
  cross-node reach-ins; fanout node re-exports for intra-node consumers
- Wave scheduling and dependency chains respected in both modes
- 42 tests passing; mypy --strict clean; no hardcoded topic strings
…rved ID (#851)

The local-qwen-coder-30b backend was still using the old HuggingFace model
path (cyankiwi/Qwen3-Coder-30B-A3B-Instruct-AWQ-4bit) which vLLM does not
recognise, causing 404 on every delegation inference call. Changed to the
vLLM-served model ID (Qwen3.6-35B-A3B) that matches what .201:8000 reports
via /v1/models.
… run_id (#852)

The orchestrator publishes command payloads that downstream swarm nodes
could not deserialize because of field name mismatches and missing
fields on extra="forbid" models. This aligns all 5 interfaces:

- health_check: accept endpoint_ids + run_id, resolve full endpoints
  from registry; propagate run_id into result
- decompose: accept run_id on request, propagate into result
- select_endpoints: accept run_id, correlation_id, make registry_hash
  optional; promote orchestrator's status field into endpoint_status
  via model_validator
- fanout: accept endpoint_health dict alongside endpoints tuple;
  resolve from registry when only IDs provided; propagate run_id
- aggregate: accept subtasks + dispatches_json as alternatives to
  decomposition + dispatches; propagate run_id

Adds cross-schema alignment test that deserializes every orchestrator
command into its downstream request model.
…de_ci_watch (#854)

- Add `auto_fix: bool = False` field to ModelCiWatchCommand (was accepted
  but never read)
- Add `ModelCiFixCycle` model capturing per-cycle state: checks before/after,
  dispatch worker name, dispatch status, ci_green_after, error
- Add `FIXED` and `UNFIXABLE` values to EnumCiTerminalStatus
- Add `auto_fix_status` and `cycles` fields to ModelCiWatchResult
- Implement `_run_auto_fix_loop`: iterates up to max_fix_cycles, dispatching
  a fixer worker via HandlerDispatchWorker + HandlerDispatchWorkerExecution
  (same pattern as node_pr_polish/workflow_runner.py), re-polling CI after
  each dispatch; returns FIXED on first green, UNFIXABLE on exhaustion,
  short-circuits on dispatch error
- Implement `_dispatch_fix_worker`: compiles scope with PR#, repo, failed
  check names, and truncated log excerpt; uses EnumWorkerRole.fixer
- Implement `_wait_and_repoll`: polls every 30s up to 5min per cycle
- Update contract.yaml: add auto_fix input; add fixed/unfixable to
  terminal_status description; add auto_fix_status and cycles outputs
- 10 new unit tests covering: auto_fix disabled, FIXED after 1 and 2 cycles,
  UNFIXABLE after max cycles and single-cycle limit, dispatch error
  short-circuit, JSON round-trip of new fields
…rchestrator (#855)

- CONTRACT_EXISTS: check that contracts/<ticket>.yaml exists on disk (pre-existing, preserved)
- RECEIPT_EXISTS: check that the contract YAML has a non-empty dod_evidence[] section
- PR_MERGED: use `gh pr list --search <ticket> --state merged` to find a merged PR
- CI_GREEN: use `gh pr checks <num>` to verify all CI checks passed on the merged PR
- Batch mode: when scope is not OMN-XXXX, enumerate tickets from request.ticket_ids
  (explicit) or gh_search_query (gh issue list) and run all checks per ticket
- Add ModelDodCheckResult and ModelDodTicketResult to the result model for
  structured per-ticket and per-check reporting
- enabled_checks tuple on the request allows callers to run a subset of checks
- All gh subprocess calls have timeout + graceful failure handling
- 24 unit tests covering all new paths (checks, batch mode, dry_run, error cases)
… surface probes (#857)

Adds 3 real integration surface probes to node_integration_sweep_orchestrator:
- RUNTIME_HEALTH: curl to stability-test lane /health endpoint (18085)
- CONTAINER_HEALTH: ssh docker ps on runtime host, counts running vs unhealthy
- GITHUB_CI: gh run list for a repo, counts pass/fail conclusions

New surface_probes.py module is never-raises — all failures captured as
status="error" with details["error"]. Handler wires probes via run_surface_probes
flag (default True, skipped on dry_run). Results appear in the surfaces[] field
of the written YAML artifact and the result model.

Request model updated with stability_test_runtime_url, container_health_host,
github_ci_repo fields. Result model gains surfaces field.

14 unit tests cover pass/fail/error paths for all 3 probes and end-to-end
artifact writing with mocked probes. All 4928+ existing tests continue to pass.
…orchestrator (#858)

Demotes the fanout node from an effect to an orchestrator per the corrected
swarm architecture. The node now publishes delegation-execute commands to
onex.cmd.omnimarket.delegation-execute.v1 and collects completion events by
correlation_id instead of doing direct HTTP to model endpoints.

Key changes:
- Rename node directory and all internal references
- contract.yaml: node_type=orchestrator, runtime_profiles=[main], FSM declared,
  io_operations no longer includes http_call, subscribe/publish topics updated
- handler: remove all httpx/ThreadPoolExecutor/direct HTTP code; FSM
  PLANNING→DISPATCHING→COLLECTING→COMPLETED; publishes ModelLlmDelegationCallRequest
  shape per subtask; filters completion events by run_id prefix
- ModelSwarmFanoutRequest: remove dispatch_mode and worker_assignments (extra=forbid
  ensures callers with old fields fail loudly); add endpoint_registry_hash,
  routing_policy_hash
- ModelSwarmEndpoint: add endpoint_ref field (env var name for delegation call effect)
- ModelSwarmFanoutResult: add terminal event payload fields (completed_count,
  failed_count, degraded, aggregation_mode, etc.)
- enums.py: remove EnumDispatchMode; add EnumFanoutFsmState
- endpoint_registry.yaml: add endpoint_ref to all five endpoints
- pyproject.toml: update entry point from node_swarm_fanout_effect to
  node_swarm_fanout_orchestrator
- Tests: rewrite all 39 tests; zero HTTP mocking; includes architectural
  invariant test that asserts no httpx import in handler
- tests/test_swarm_schema_alignment.py: update import path
…ugh delegation chain (#859)

Move canonical delegation wire model imports from omnimarket local copies
to omnibase_compat across 20+ files. The local copies become dead code
(removal in follow-up).

Wire api_key and extra_headers through the delegation handler chain:
- _resolve_api_key() resolves routing decision api_key_ref env var
- Both ModelInferenceIntent construction sites pass api_key/extra_headers
- LlmCallerDelegation passes api_key to AdapterLlmProviderOpenai

Update omnibase-compat pin to include new fields (timeout_seconds,
error_message, api_key, extra_headers, cost_per_1k_tokens, expanded
task_type Literal).
…te annotations (#861)

- Removes src/omnimarket/nodes/node_swarm_worker_agent/ entirely (wrong
  architecture from PR #850; reuses node_llm_delegation_call_effect instead)
- Removes pyproject.toml entry point node_swarm_worker_agent
- models/swarm/ retained: still used by node_swarm_fanout_orchestrator
- Fixes bare # onex-allow-internal-ip annotations in
  node_swarm_fanout_orchestrator tests (pre-existing from PR #858) to include
  required OMN-XXXXX ticket + reason per gate spec
… into baseline_capture (#862)

Adds test_probe_unit.py with 23 unit tests covering the 4 infra-dependent probe
modules (system_health, kafka_topics, db_row_counts, linear_tickets) that had no
dedicated test coverage. Tests verify ProbeProtocol conformance, graceful degradation
on missing deps/env vars, correct data collection from mocked clients, and that the
handler's default registry contains all 6 BaselineProbeType members.
…Kafka (#863)

The build loop BUILDING phase was publishing to onex.cmd.omnimarket.delegation-request.v1
which had no subscriber and routed to LLM delegation instead of ticket-pipeline.
ticket-pipeline subscribes to onex.cmd.omnimarket.ticket-pipeline-start.v1.

Changes:
- node_build_dispatch_effect: change publish topic from delegation-request to
  ticket-pipeline-start; update _build_pipeline_start_payload() to produce a
  ModelPipelineStartCommand-shaped payload (ticket_id, correlation_id, dry_run,
  requested_at) that the ticket-pipeline consumer can validate on receipt
- node_build_loop_orchestrator/contract.yaml: add delegation-request as a
  publish topic so AdapterLlmDispatch (live LLM dispatch adapter) continues to
  load it from its own module contract rather than from node_build_dispatch_effect
- adapter_llm_dispatch.py: load _DEFAULT_DELEGATION_TOPIC from the orchestrator
  contract (not from node_build_dispatch_effect/contract.yaml)
- dep_health_allowlist.yaml: update delegation-request entry — node_build_dispatch_effect
  is no longer a publisher of that topic
- test_golden_chain_build_dispatch_effect.py: replace tests that asserted
  delegation-request payload shape with tests proving ticket-pipeline-start
  topic, ticket_id field presence, ModelPipelineStartCommand wire shape, and
  explicit regression guard that delegation-request is never published
…can (#864)

The contract sweep was scanning installed packages inside .venv directories,
which contain stale snapshots of contracts from prior releases. The
omniclaude plugin venv had an old omnibase_infra install with the pre-fixed
`onex.snapshot.platform.registration-snapshots.v1` topic, causing false
positives on node_registration_orchestrator.

Add path-part exclusion for `.venv` and `site-packages` segments so only
source-tree contracts are checked. Add 7 unit tests covering the exclusion
logic, valid topics, and missing-required-field detection.
Pure reducer that materializes per-subtask lifecycle state from delegation
events. Idempotent via run_id+subtask_id+terminal_event_id key. Aggregate
counters (completed/failed/pending/blocked) are computed_field properties
derived from the subtasks dict — never stored directly.

Subscribes: delegation-execute, delegation-call-completed,
delegation-escalation-triggered, delegation-all-tiers-failed,
swarm-fanout-completed. Publishes: swarm-subtask-state-changed.v1 and
swarm-subtask-projection-applied.v1 with full freshness fields.

10 unit tests pass: transitions, idempotency, escalation non-terminal,
derived counters, blocked state, projection freshness fields.
* feat(OMN-12120): add node_swarm_subtask_state_reducer

Pure reducer that materializes per-subtask lifecycle state from delegation
events. Idempotent via run_id+subtask_id+terminal_event_id key. Aggregate
counters (completed/failed/pending/blocked) are computed_field properties
derived from the subtasks dict — never stored directly.

Subscribes: delegation-execute, delegation-call-completed,
delegation-escalation-triggered, delegation-all-tiers-failed,
swarm-fanout-completed. Publishes: swarm-subtask-state-changed.v1 and
swarm-subtask-projection-applied.v1 with full freshness fields.

10 unit tests pass: transitions, idempotency, escalation non-terminal,
derived counters, blocked state, projection freshness fields.

* fix(OMN-12120): align subtask reducer gates
…t discovery (#867)

Probes local endpoints (endpoint_registry.yaml) and OpenRouter free-tier
/api/v1/models to discover and health-check the full model fleet. Returns
unified endpoint list with per-endpoint status; threshold gate enforces
≥8 healthy endpoints for the swarm orchestrator. 7 unit tests, mypy strict clean.
… subtask state reducer (#868)

Adds test_golden_chain_replay_idempotency.py proving the five Phase 2 Task 4 invariants:
1. Replay same terminal event → state_changed=False (no duplicate transition)
2. Projection identity stable — same state object returned, no new projection row
3. Aggregate counters unchanged across N replays
4. No projection-applied event (cursor=None) emitted on replay
5. Reducer cursor advances monotonically through the forward event chain

Also covers: double-terminal drop (different event_id, already-terminal subtask),
N-replay cursor uniqueness, and failed-path replay.

Fixes pre-existing leaked-literals violation in node_swarm_fleet_discovery_effect tests
(missing onex-allow-internal-ip annotations from OMN-12083).
…iring (#866)

Three swarm node contracts declared event_bus.subscribe_topics but had no
handler_routing block. wire_from_manifest skips contracts without
handler_routing, so these handlers were never registered on the Kafka
dispatch loop — the swarm FSM stalled after publishing health-check,
decompose, and fanout commands because there were no consumers.

Nodes fixed:
- node_swarm_endpoint_health_effect: adds handler_routing for
  HandlerSwarmEndpointHealth + ModelSwarmHealthCheckRequest; also adds
  contract_name/node_name, event_bus.version/plugin_managed, and
  published_events for consistency with sibling contracts
- node_swarm_decomposer_compute: adds handler_routing for
  HandlerSwarmDecomposer + ModelSwarmDecomposeRequest
- node_swarm_fanout_orchestrator: adds handler_routing for
  HandlerSwarmFanout + ModelSwarmFanoutRequest

All three use routing_strategy: operation_match following the pattern
established by node_swarm_aggregator_compute.
…gn_to_plan contract (#869)

Root cause: old omnibase_core <=0.40.0 used
os.environ.get("KAFKA_BOOTSTRAP_SERVERS", "localhost:19092") in cli_run_node.py,
causing node_design_to_plan dispatch to silently connect to localhost:19092 when
KAFKA_BOOTSTRAP_SERVERS was unset. Current omnibase_core uses
os.environ["KAFKA_BOOTSTRAP_SERVERS"] (KeyError on missing, no fallback).

Changes:
- contract.yaml: add env_dependencies.KAFKA_BOOTSTRAP_SERVERS with required: true
  so operators know this is required and tooling can validate at deploy time
- tests/unit/nodes/node_design_to_plan/test_kafka_bootstrap.py: regression guard
  that asserts the contract declares the dep, no localhost hardcode exists in node
  source, and the installed omnibase_core cli_run_node does not use localhost default
…tion fields) (#870)

Updates the compat dependency from d1bd88b to 3f92e810 (v0.4.1) to include
PR #108 which adds api_key_ref and extra_headers fields on ModelInferenceIntent.
Required for OpenRouter delegation in cloud and stability-test lanes.
… conflict (#871)

PR #851 (model_name fix) was branched before PR #856 (capability-named backends)
landed. When PR #851 merged it overwrote the backend ID renames from PR #856,
restoring local-qwen-coder-30b / local-deepseek-r1-14b / local-qwen3-6-35b
and re-introducing hardcoded model IDs.

This commit re-lands the PR #856 state:
- bifrost_delegation.yaml: local-coder, local-reasoner, local-heavy-reasoning,
  local-embedding backends; model_name: null for all local slots; config_version 2.0.0
- routing_tiers.yaml: backend_id references updated to match capability names
- Test fixtures in 4 test files updated to use capability-named backend IDs

Model names are resolved at deploy time via bifrost_overrides.yaml overlay.
No site-specific model IDs in the public repo.
…ler (#899)

Wave 2 contract-first ORCHESTRATOR node for the multi_agent skill.
Implements typed I/O models for parallel_debug, parallel_build, and
sequential_review workflows with fan-out/fan-in reconciliation.
Handler stub raises NotImplementedError per node_not_implemented: true.
28 unit tests covering all models, enums, bounds, and stub guard.
…+ handler (#900)

Wave 1 contract-first stub for the epic-level dispatch watchdog orchestrator.
Monitors all Task() subagents in a wave for stalls, triggers recovery
(report | cancel | redispatch), and escalates blocked tasks to Linear when
max_redispatches is exceeded. Complementary to node_worker_stall_recovery.

- contract.yaml: node_type=orchestrator, node_not_implemented=true
- Models: ModelWaveTask, ModelStallEvent, ModelRecoveryAction,
  ModelWatchdogSummary, ModelWatchdogResult, ModelWatchdogRequest
- Handler stub: raises NotImplementedError citing OMN-12209 Wave 2
- 29 unit tests covering all model validation, enum members, bounds,
  frozen constraints, and handler stub behaviour
…+ handler (#901)

Wave 1 stub node: structured review findings → Linear tickets.
- Contract: EFFECT_GENERIC, node_not_implemented: true, Wave 1
- Models: EnumFindingSeverity, ModelReviewFinding, ModelCreateFollowupTicketsCommand,
  ModelCreateFollowupTicketsResult, ModelCreatedTicketRef, ModelTicketCreationFailure
- Handler stub: raises NotImplementedError (stub-ok), deferred to Wave 2
- Tests: 9 golden chain tests (severity enum, model validation, frozen immutability,
  stub NotImplementedError, event bus topic wiring)
- Fix pre-existing no-hardcoded-topics violation in cli/commands/trace.py
  by importing LOG_ENTRY_TOPIC from omnimarket.logging.topics
…andler (#902)

Adds the wave_scheduler_orchestrator ORCHESTRATOR node (stub, node_not_implemented: true)
to omnimarket. Defines contract.yaml with full Kafka event_bus surface, typed input/output
Pydantic models (ModelWaveSchedulerRequest, ModelWaveSchedulerResult with supporting
ModelWaveAssignment, ModelWaveExecutionSummary, ModelDependencyViolation), and a
NotImplementedError handler stub. 22 golden-chain unit tests cover contract shape,
entry point, model validation, enum values, and loud handler failure.

Also fixes two pre-existing pre-commit false positives: adds # stub-ok to the
Click trace group and util_context_chunk_id.py, and extends the no-hardcoded-topics
exclude pattern to cover src/omnimarket/cli/ (CLI constants are not handler literals).
…andler (#904)

Adds the ORCHESTRATOR node scaffold for the decompose-epic pipeline.
Establishes contract.yaml (node_not_implemented: true), typed request/result
models, a NotImplementedError stub handler, and 9 unit tests covering model
validation, frozen config, count property, and contract structure.
…handler (#905)

Adds the ORCHESTRATOR node stub for the tech_debt_sweep skill. Includes
contract.yaml (node_not_implemented: true), typed Input/Output models
(repos, categories, dry_run → findings by category, created tickets,
skipped duplicates), NotImplementedError handler stub, metadata.yaml,
pyproject.toml entry point, and 7 golden-chain unit tests (all passing).
…ct + handler (#906)

Adds the adversarial_pipeline_orchestrator ORCHESTRATOR node (stub,
node_not_implemented: true) to omnimarket, promoting the logic from the
omniclaude adversarial_pipeline skill.

Contract declares a 3-stage pipeline:
  Stage 1 — design_to_plan: topic → plan file
  Stage 2 — hostile_reviewer gate: requires >= min_findings_gate findings (default 3)
  Stage 3 — plan_to_tickets: gated plan → Linear tickets

Files added:
  - contract.yaml (node_not_implemented: true, full Kafka event_bus surface)
  - models/model_adversarial_pipeline_request.py (ModelAdversarialPipelineRequest,
    ModelAdversarialPipelineResult — frozen, extra=forbid)
  - handlers/handler_adversarial_pipeline_orchestrator.py (stub, raises NotImplementedError)
  - tests/test_golden_chain_adversarial_pipeline_orchestrator.py (6 unit tests)
  - pyproject.toml: entry point registered

Also fixes pre-existing CI gate failure in node_context_experiment_compute:
util_context_chunk_id.py docstring contained "XXXXXXXX" which matched the
stub detector's XXX pattern. Moved stub-ok annotation to def line and
rewrote format example to ctx_<8hex>.
Add contract-first stub nodes for the demo skill:
- node_demo_fanout_orchestrator: ORCHESTRATOR, fans out LLM inference
  requests to multiple models in parallel, collects per-model results
  with token counts and latency
- node_demo_cost_compute: COMPUTE pure/idempotent, pricing lookup and
  cost calculation from inference results, identifies cheapest model
- node_demo_renderer_effect: EFFECT_GENERIC, ASCII bar chart generation
  from cost data

All three nodes: contract.yaml + handler stub (raise NotImplementedError # stub-ok)
+ models + metadata.yaml + golden-chain tests (36/36 passing).
Entry points registered in pyproject.toml.
…ler (#918)

Move inline curl recon logic from the dashboard_sweep skill into
NodeDashboardSweep. When base_url is set on DashboardSweepRequest,
Phase 1 performs route discovery (HTML link extraction) and per-route
HTTP probing before classification; pre-supplied pages skip recon and
remain fully backward-compatible.

- Add Phase 1 _run_recon / _recon_to_page_input methods (urllib, no new deps)
- Add ModelReconResult + base_url/extra_routes fields on DashboardSweepRequest
- Expose recon_results on DashboardSweepResult
- Bump contract node_version 1.0.0 → 2.0.0, contract_version → 1.1.0
- Add 8 new unit tests covering recon mode; all 28 dashboard tests pass
…919)

Add collector.py with LiveMetadataCollector (rpk/psql probes) and wire
it into __main__.py via a new --collect flag, so the node can run the
full collection+classification pipeline without relying on the skill to
pre-collect data inline.

- collector.py: probe_producer_status, probe_consumer_lag,
  probe_table_row_count, collect_flow_metadata — all env-driven,
  fail-safe, fallback-ok annotated
- __main__.py: --collect flag, _collect_live(), mutually exclusive with
  --flows; backwards-compatible (legacy no-flag path unchanged)
- contract.yaml: flows input changed from required to optional (default []);
  collect input documented
- test_golden_chain_data_flow_sweep_collect.py: 11 new unit tests covering
  collector probes (mocked), _collect_live fallback, handler integration,
  and CLI --collect flag paths
…ontract (#920)

PluginDelegation owns all dispatch wiring via DispatcherDelegationRequest
and custom dispatchers. The handler_routing block caused the auto-wiring
framework to register dispatchers for HandlerDelegationWorkflow and
HandlerComplianceLoop that call .handle() — a method neither handler has.

This produced HANDLER_ERROR on every delegation-request.v1 dispatch,
causing DispatchResultApplier to skip publishing the ModelRoutingIntent.
The FSM never advanced, resulting in a 300s timeout on every B9 test run.
@coderabbitai

coderabbitai Bot commented May 26, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1b2e8e68-31c0-4a9b-bdab-adde36a164be

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch promotion/OMN-12245-v0.4.0

Comment @coderabbitai help to get the list of available commands and usage tips.

@jonahgabriel
jonahgabriel enabled auto-merge (squash) May 26, 2026 13:36
@github-actions

github-actions Bot commented May 26, 2026 •

Copy link
Copy Markdown

⚠️ Hostile Reviewer — DEGRADED (informational)

Blocking findings (critical/error): 0
Total findings: 0
Models succeeded: none

Note: All reviewer models failed or were unavailable. Degraded results are informational during the pilot phase (OMN-8524) and do not block merge. Error: cli_review exited non-zero (all models failed or binary error)


Gate semantics (pilot phase)

Verdict Meaning Blocks merge?
passed No critical/error findings No
blocked CRITICAL or ERROR findings found Yes
degraded All models unavailable (infra) No (pilot)

Powered by omniintelligence.review_pairing.cli_review — node-based adversarial review via HandlerLlmCliSubprocess (OMN-8524)

@github-actions

github-actions Bot commented May 26, 2026 •

Copy link
Copy Markdown

⚠️ Architectural Review — WARNINGS

Errors: 0
Warnings: 1

What this checks

Rule Description
ARCH-TOPIC-001 No hardcoded Kafka topic strings in handler code
ARCH-DI-001 No event_bus=None bypass
ARCH-DI-002 No direct Handler instantiation outside workflow_runner/adapters
ARCH-DI-003 No reinvented DI containers
ARCH-TOPIC-002 contract.yaml topics follow `onex.{cmd

ARCH-DI-002: Direct Handler instantiation (warning)\n\n```\nsrc/omnimarket/nodes/node_build_loop_orchestrator/main.py:92: handler = HandlerBuildLoopOrchestrator(event_bus=_EVENT_BUS)

src/omnimarket/nodes/node_ci_watch/handlers/handler_ci_watch.py:372: dispatch_result = HandlerDispatchWorker().handle(
src/omnimarket/nodes/node_ci_watch/handlers/handler_ci_watch.py:405: execution_result = HandlerDispatchWorkerExecution().handle(
src/omnimarket/nodes/node_delegation_orchestrator/handlers/handler_delegation_workflow.py:192: loop = HandlerComplianceLoop()
src/omnimarket/nodes/node_delegation_orchestrator/wiring.py:64: _SHARED_WORKFLOW_HANDLER = HandlerDelegationWorkflow()
src/omnimarket/nodes/node_integration_sweep_orchestrator/handlers/handler_integration_sweep_orchestrator.py:42: self._runtime_sha_handler = runtime_sha_handler or HandlerRuntimeShaVerify()
src/omnimarket/nodes/node_knowledge_context_assembler_orchestrator/handlers/handler_knowledge_context_assembler_orchestrator.py:90: self._reducer = HandlerKnowledgeContextAssemblerReducer()
src/omnimarket/nodes/node_overnight/main.py:194: handler = HandlerOvernight(
src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py:539: inv_handler = HandlerPrLifecycleInventory()
src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py:552: triage_handler = HandlerPrLifecycleTriage()
src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py:565: reducer_handler = HandlerPrLifecycleStateReducer()
src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py:581: merge_handler = HandlerPrLifecycleMerge(
src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py:605: fix_handler = HandlerPrLifecycleFix(
src/omnimarket/nodes/node_session_orchestrator/main.py:75: handler = HandlerSessionOrchestrator()\n```\n\nHandler classes should be wired only in workflow_runner.py or adapter modules. Direct instantiation elsewhere bypasses the contract system.\n\n

Powered by node_pr_review_bot

@github-actions

github-actions Bot commented May 26, 2026 •

Copy link
Copy Markdown

✅ PR Review Bot — CLEAN

Findings: 0
Run ID: ``

Note: Reviewer models are running as stubs (OMN-7969–OMN-7972 pending). Architectural findings from Phase 1 (arch-lint) are the authoritative signal until model handlers land.


Verdict semantics

Verdict Meaning
clean No blocking findings
risks_noted Findings noted; threads passed verification
blocking_issue MAJOR/CRITICAL findings not resolved — do not merge

Powered by node_pr_review_bot — FSM pipeline with multi-model review fan-out

@jonahgabriel
jonahgabriel merged commit 597fc11 into main May 26, 2026
59 of 60 checks passed
@jonahgabriel
jonahgabriel deleted the promotion/OMN-12245-v0.4.0 branch May 26, 2026 20:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant