Repository navigation
chore: release v0.4.0 (OMN-12245) - #926
Conversation
…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
… 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.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
| 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)
|
| 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
✅ PR Review Bot — CLEANFindings: 0
Verdict semantics
Powered by node_pr_review_bot — FSM pipeline with multi-model review fan-out |
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.