Skip to content

backmerge(OMN-12245): delegation projection counts hotfix - #934

Merged
jonahgabriel merged 5 commits into
devfrom
hotfix/omn-12245-delegation-projection-counts
May 27, 2026
Merged

jonahgabriel merged 5 commits into
devfrom
hotfix/omn-12245-delegation-projection-counts

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • backmerge fix(OMN-12245): project delegation gate counts #933 hotfix branch into dev after main hotfix release
  • dev already contains the projection code; this branch carries the release version bump to 0.4.2
  • clears dev backmerge gates by restoring node entry points, updating handler baselines, normalizing dep-health baseline, and annotating runner literal examples

Verification

  • local: uv run pytest tests/test_golden_chain_projection_delegation.py -q -> 28 passed
  • local: uv run pytest src/omnimarket/nodes/node_swarm_dispatch_orchestrator/tests/test_fsm.py src/omnimarket/nodes/node_swarm_fanout_orchestrator/tests/test_handler_swarm_fanout.py tests/test_golden_chain_runner_orchestrator.py tests/test_node_generate_node_effect.py tests/nodes/node_observability_sink_effect/test_handler_observability_sink_effect.py -q -> 70 passed
  • local: uv run ruff check targeted files -> passed
  • local: uv run ruff format --check targeted files -> passed
  • local: bash scripts/validation/check_leaked_literals.sh blocking all -> passed
  • local: uv run python scripts/ci/check_unimported_handlers.py -> passed
  • local: uv run python scripts/validate_node_drift.py --check-changed origin/main --strict -> PASS
  • local: uv run python scripts/ci/run_dep_health_sweep.py --repo-roots src/ --severity-threshold MAJOR --baseline-path .onex_state/dep_health_baseline.json --delta-mode -> passed

Evidence-Ticket: OMN-12245
Evidence-Source: OCC#1790
Guard-Source: OCC#1791
hotfix-evidence: OCC-1790
backmerge-for: #933

if not value:
_logger.warning(
"api_key_ref=%s declared but env var is unset; proceeding without api_key",
ref,
for subtask in wave_subtasks:
if any(dep in failed_ids for dep in subtask.depends_on):
all_dispatches.append(
ModelSwarmDispatch(
total_deadline = time.monotonic() + config.total_run_timeout_seconds
all_dispatches: list[ModelSwarmDispatch] = []
failed_ids: set[str] = set()
wall_start = time.monotonic()
}
)

_VALID_FORMATS = frozenset({"markdown", "json"})
# Request / Response models
# ---------------------------------------------------------------------------

_VALID_MODES = frozenset(
"number": str(parsed["number"]),
"repo": str(parsed.get("repo", "")),
}
except json.JSONDecodeError:

# Keep _DEFAULT_FLOWS as a backwards-compatible alias (same objects — stubs
# carry safe zero-value defaults so pure-compute tests keep passing).
_DEFAULT_FLOWS = _DEFAULT_FLOW_STUBS
Comment on lines +321 to +323
from omnimarket.cli.commands import ( # noqa: E402
trace as _trace_commands, # noqa: F401 # registers trace group via @market.group decorator
)
Comment on lines +321 to +323
from omnimarket.cli.commands import ( # noqa: E402
trace as _trace_commands, # noqa: F401 # registers trace group via @market.group decorator
)
import click
import httpx

from omnimarket.cli.market import market
@coderabbitai

coderabbitai Bot commented May 27, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

@jonahgabriel, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 20 minutes and 49 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f5631a4e-f8bd-43af-914b-6209c3fa58a7

📥 Commits

Reviewing files that changed from the base of the PR and between 3169559 and 1412d78.

📒 Files selected for processing (4)
  • .onex_state/dep_health_baseline.json
  • pyproject.toml
  • scripts/validation/unimported_handler_baseline.txt
  • src/omnimarket/nodes/node_design_to_plan/contract.yaml
📝 Walkthrough

Walkthrough

The PR adds branch-target enforcement, expands delegation and swarm orchestration behavior, introduces trace and persistence tooling, adds many new node contracts and stub packages, implements correctness and sweep features, migrates swarm fanout to an orchestrator, and refreshes packaging, evidence, and dep-health baseline artifacts.

Changes

OmniMarket runtime and node expansion

Layer / File(s) Summary
Repo guards, packaging, and evidence
.github/workflows/main-target-guard.yml, pyproject.toml, .pre-commit-config.yaml, .onex_state/dep_health_baseline.json, docs/evidence/dep-health-sweep/..., docs/work-tracking/contracts/OMN-12245.yaml, src/dep_health_allowlist.yaml
Adds a PR target guard workflow, updates package/version and node entry points, adjusts topic-hook exclusions, and refreshes dep-health and release evidence artifacts.
Delegation runtime and routing updates
src/omnimarket/adapters/..., src/omnimarket/events/delegation.py, src/omnimarket/models/delegation/wire/*, src/omnimarket/configs/*, src/omnimarket/inference/*, src/omnimarket/nodes/node_delegation_*, src/omnimarket/nodes/node_build_*, src/omnimarket/nodes/node_projection_delegation/...
Moves delegation DTO sourcing to compat contracts, adds delegate-skill terminal topics, introduces escalation-aware routing/workflow behavior, updates backend config resolution, and switches build dispatch payloads to ticket-pipeline-start.
CLI, persistence, and sweep observability
src/omnimarket/cli/..., src/omnimarket/nodes/node_log_persistence_effect/..., src/omnimarket/nodes/node_data_flow_sweep/..., src/omnimarket/nodes/node_integration_sweep_orchestrator/..., src/omnimarket/nodes/node_dispatch_request_handler/..., src/omnimarket/nodes/node_contract_sweep/...
Adds market trace commands, persists platform log entries to Postgres, adds live flow metadata collection and surface probes, and introduces a dispatch request handler.
New node contracts and stub packages
src/omnimarket/nodes/node_context_experiment_compute/..., node_create_followup_tickets_effect/..., node_adversarial_pipeline_orchestrator/..., node_decompose_epic_orchestrator/..., node_epic_team_orchestrator/..., node_friction_triage_orchestrator/..., node_demo_*, node_dispatch_watchdog_orchestrator/..., node_multi_agent_orchestrator/..., node_refill_sprint_orchestrator/...
Adds new node metadata, contracts, request/result models, package exports, and stub handlers for multiple planned compute, effect, and orchestrator nodes.
Sweep and correctness implementations
src/omnimarket/nodes/node_ci_watch/..., node_dod_sweep_orchestrator/..., node_dashboard_sweep/..., node_handler_correctness_gate/...
Implements the handler correctness gate, expands DoD sweep into targeted and batch modes, adds dashboard HTTP recon, and extends CI watch with optional auto-fix cycles.
PR lifecycle OCC remediation
src/omnimarket/nodes/node_pr_lifecycle_fix_effect/..., src/omnimarket/nodes/node_pr_lifecycle_orchestrator/...
Adds OCC contract auto-creation for deploy-gate contract misses and wires the new adapter into PR lifecycle remediation.
Swarm orchestration migration and reducers
src/omnimarket/models/swarm/*, src/omnimarket/nodes/node_swarm_*, src/omnimarket/nodes/node_projection_swarm/contract.yaml
Removes the swarm fanout effect, adds a queue-driven fanout orchestrator, persists swarm dispatch FSM state, propagates run_id through swarm nodes, updates registry and endpoint health inputs, adds fleet discovery, and introduces a subtask state reducer.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Poem

A rabbit hopped through topics and queues,
stitching new trails with runtime clues.
With traces, guards, and contracts in tow,
more nodes now sprout where workflows grow.
(_/)\
(•ㅅ•) thump!

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hotfix/omn-12245-delegation-projection-counts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/omnimarket/nodes/node_ci_watch/handlers/handler_ci_watch.py (1)

143-158: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Transport errors are currently reported as PASSED.

_fetch_ci_status() returns ([], "...error...") when gh pr checks fails or its output is unreadable, and this branch treats any empty failed_checks list as green. That turns GitHub auth failures, CLI errors, and transient outages into a false PASSED result and skips the auto-fix path entirely.

Return an explicit error outcome from _fetch_ci_status() (or raise) and map it to EnumCiTerminalStatus.ERROR/TIMEOUT here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/nodes/node_ci_watch/handlers/handler_ci_watch.py` around lines
143 - 158, The code treats an empty failed_checks list as a PASSED result even
when _fetch_ci_status returned an error summary; change the handler in
handler_ci_watch.py to detect an error/timeout outcome from _fetch_ci_status
(e.g., have _fetch_ci_status return an explicit error flag or raise a dedicated
exception) and map that to a non-PASSED terminal status instead of PASSED: when
_fetch_ci_status indicates a transport/CLI error or timeout, return
ModelCiWatchResult with terminal_status set to EnumCiTerminalStatus.ERROR or
EnumCiTerminalStatus.TIMEOUT (and include the failure_summary), and only return
PASSED when there is no error flag/exception and failed_checks is empty. Ensure
you update caller logic around the _fetch_ci_status call to catch the raised
error or check the returned error flag and populate started_at/completed_at
similarly to the success and failure branches.
src/omnimarket/nodes/node_swarm_dispatch_orchestrator/handlers/handler_swarm_dispatch.py (1)

132-153: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fail fast when async routing is used without a state store.

With state_store=None, handle_async() publishes the first command but _persist_state() is a no-op, so every later route_event() for that run deterministically fails with MissingRunStateError. That turns a wiring mistake into a delayed runtime wedge.

Suggested guard
     async def handle_async(self, request: ModelSwarmDispatchRequest) -> None:
+        if self._state_store is None:
+            raise RuntimeError(
+                "HandlerSwarmDispatchOrchestrator.handle_async requires a state_store"
+            )
         """Handle the initial swarm-dispatch command.
@@
     async def route_event(
         self,
         topic: str,
         payload: dict[str, Any],
     ) -> ModelOrchestratorState:
+        if self._state_store is None:
+            raise RuntimeError(
+                "HandlerSwarmDispatchOrchestrator.route_event requires a state_store"
+            )
         """Route a response event to the correct FSM transition.

Also applies to: 520-548

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_dispatch_orchestrator/handlers/handler_swarm_dispatch.py`
around lines 132 - 153, The constructor currently allows creating the handler
with state_store=None which lets handle_async publish a first command while
_persist_state is a no-op and later route_event calls raise
MissingRunStateError; add a fail-fast guard in the handler constructor (the
method that sets self._state_store and loads topics) that detects when async
routing is expected (e.g., contract indicates subscribe_topics or publish topics
used by handle_async like "swarm-decompose", "swarm-select-endpoints",
"swarm-fanout", or presence of subscribe topics) and if so raise a clear
exception (ValueError or custom) when state_store is None; reference the
constructor that sets self._state_store and the methods handle_async,
_persist_state, and route_event so reviewers can locate and fix the logic (also
apply the same guard in the other constructor/initialization block noted around
lines 520-548).
🟡 Minor comments (12)
src/omnimarket/nodes/node_contract_sweep/handlers/handler_contract_sweep.py-122-128 (1)

122-128: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align path filter with the stated “src-only authoritative” rule.

The new guard skips .venv/site-packages, but it still allows any path containing "nodes" outside src. Please enforce src/omnimarket/nodes explicitly to avoid stale/non-source contract scans.

As per coding guidelines, “Keep node logic inside src/omnimarket/nodes/node_* directories.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/nodes/node_contract_sweep/handlers/handler_contract_sweep.py`
around lines 122 - 128, The path filter currently only excludes ".venv" and
"site-packages" but still allows contracts outside the authoritative source
tree; update the logic around contract_path/contract_parts so it only accepts
paths rooted under src/omnimarket/nodes and specifically under node_...
directories (e.g., require the first three path components to be
"src","omnimarket","nodes" and the next component to start with "node_"), while
still keeping the existing checks for ".venv" and "site-packages"; adjust the
conditional that now checks contract_parts to first check for those excluded
segments and then require the src/omnimarket/nodes/node_* prefix before
proceeding.
src/omnimarket/models/swarm/model_swarm_subtask_result.py-18-18 (1)

18-18: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Constrain latency_ms to non-negative values.

Negative latency is currently accepted, which can skew telemetry and reporting. Add a lower bound at model validation.

💡 Suggested fix
-from pydantic import BaseModel, ConfigDict
+from pydantic import BaseModel, ConfigDict, Field
@@
-    latency_ms: int = 0
+    latency_ms: int = Field(default=0, ge=0)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/models/swarm/model_swarm_subtask_result.py` at line 18, The
field latency_ms on the SwarmSubtaskResult model currently allows negative
values; update its type/validation to enforce a non-negative integer (>= 0) by
using Pydantic validators or a constrained type/Field (e.g., conint(ge=0) or
Field(..., ge=0)) on the latency_ms declaration and/or add a `@validator` for
latency_ms in the SwarmSubtaskResult class to raise a ValidationError for
negative inputs so telemetry/reporting cannot receive negative latencies.
src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_escalation_attempt.py-23-32 (1)

23-32: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add numeric bounds to match the field contracts.

Line 23 documents quality_score as 0.0-1.0, and Line 30 represents latency in milliseconds, but neither field enforces bounds. Invalid values can slip into persisted evidence records.

Proposed fix
-    quality_score: float = Field(
-        ..., description="Quality gate score for this attempt (0.0-1.0)."
-    )
+    quality_score: float = Field(
+        ..., ge=0.0, le=1.0, description="Quality gate score for this attempt (0.0-1.0)."
+    )
@@
-    latency_ms: int = Field(
-        ..., description="End-to-end latency for this attempt in milliseconds."
-    )
+    latency_ms: int = Field(
+        ..., ge=0, description="End-to-end latency for this attempt in milliseconds."
+    )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_escalation_attempt.py`
around lines 23 - 32, The Pydantic model fields quality_score and latency_ms
lack validation bounds; update the Field(...) declarations for quality_score (in
model_delegation_escalation_attempt.py) to enforce 0.0 <= quality_score <= 1.0
(e.g., use ge=0.0, le=1.0) and for latency_ms to enforce non-negative integer
values (e.g., ge=0); keep the current descriptions and default for
failure_reasons unchanged.
src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_fanout_result.py-16-23 (1)

16-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard telemetry fields against negative values.

wall_latency_ms, sum_subtask_latency_ms, completed_count, and failed_count can currently accept negative values, which can corrupt downstream metrics/projections.

Proposed fix
-from pydantic import BaseModel, ConfigDict
+from pydantic import BaseModel, ConfigDict, Field
@@
-    wall_latency_ms: int
-    sum_subtask_latency_ms: int
+    wall_latency_ms: int = Field(ge=0)
+    sum_subtask_latency_ms: int = Field(ge=0)
@@
-    completed_count: int = 0
-    failed_count: int = 0
+    completed_count: int = Field(default=0, ge=0)
+    failed_count: int = Field(default=0, ge=0)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_fanout_result.py`
around lines 16 - 23, The model currently allows negative metrics; add a
validation step in the dataclass (e.g., implement __post_init__ on
ModelSwarmFanoutResult) that checks wall_latency_ms, sum_subtask_latency_ms,
completed_count, and failed_count are >= 0 and raises a ValueError with a clear
message if any are negative; also ensure any deserialization/path that
constructs ModelSwarmFanoutResult (factory methods or from_dict-like helpers)
uses the same validation to prevent invalid instances from being created.
src/omnimarket/nodes/node_delegation_orchestrator/plugin.py-440-445 (1)

440-445: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Sanitize exception text before warning log emission.

Line 442 logs _exc directly; prefer sanitize_error_message(_exc) to avoid leaking internal exception content.

Suggested fix
                 except Exception as _exc:
                     logger.warning(
                         "Failed to register DirectBridgeDelegationDispatchPort: %s "
                         "(correlation_id=%s)",
-                        _exc,
+                        sanitize_error_message(_exc),
                         correlation_id,
                     )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/nodes/node_delegation_orchestrator/plugin.py` around lines 440
- 445, The catch block logging for DirectBridgeDelegationDispatchPort currently
emits the raw exception `_exc`; replace that with a sanitized string by calling
`sanitize_error_message(_exc)` in the `logger.warning` call to avoid leaking
internal details, and ensure `sanitize_error_message` is imported or available
in the module where `plugin.py` defines the registration logic (the try/except
around `DirectBridgeDelegationDispatchPort` registration).
src/omnimarket/adapters/codex/runtime_client.py-624-636 (1)

624-636: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Runtime evidence should reflect the actual subscribed terminal topic.

When delegate-skill routing is selected, terminal subscription uses delegate-specific topics, but downstream evidence still reports request.response_topic. This makes debugging/telemetry misleading for this path.

💡 Suggested patch
@@
-            if is_delegate_skill:
+            if is_delegate_skill:
                 terminal_topic = _DELEGATE_SKILL_COMPLETED_TOPIC
                 extra_topics = (
                     _DELEGATE_SKILL_FAILED_TOPIC,
                     *additional_response_topics,
                 )
@@
-            route = ModelDispatchBusRoute(
+            selected_terminal_topic = terminal_topic
+            route = ModelDispatchBusRoute(
                 contract_path=Path("codex-runtime-request-adapter"),
                 command_topic=self._command_topic,
                 terminal_topic=terminal_topic,
             )
@@
         evidence = _deployed_runtime_evidence(
             command_topic=self._command_topic,
-            response_topic=request.response_topic,
+            response_topic=selected_terminal_topic,
             runtime_selection=request.runtime_selection,
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/adapters/codex/runtime_client.py` around lines 624 - 636, The
runtime evidence currently always reports request.response_topic even when
delegate-skill routing is used; detect the delegate path (the is_delegate_skill
check that uses _DELEGATE_SKILL_COMMAND_TOPIC and _DELEGATE_SKILL_COMMAND_NAMES)
and ensure downstream telemetry/evidence uses the actual terminal_topic (set to
_DELEGATE_SKILL_COMPLETED_TOPIC for delegates) instead of
request.response_topic; update any code that emits/runtime_evidence or similar
to reference the terminal_topic variable (and, if applicable, include
extra_topics from the extra_topics tuple) so reported subscriptions match the
real subscribed topic.
src/omnimarket/nodes/node_swarm_subtask_state_reducer/handlers/handler_swarm_subtask_state.py-177-185 (1)

177-185: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix attempt counter overwrite for first-seen escalation events.

Line 183 overwrites the earlier escalation increment logic. If existing is None and the event is DELEGATION_ESCALATION_TRIGGERED, attempt_count becomes 0 instead of 1.

Suggested fix
     if existing is None:
         attempt_count = (
-            1 if event.event_type == EnumDelegationEventType.DELEGATION_EXECUTE else 0
+            1
+            if event.event_type
+            in {
+                EnumDelegationEventType.DELEGATION_EXECUTE,
+                EnumDelegationEventType.DELEGATION_ESCALATION_TRIGGERED,
+            }
+            else 0
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_subtask_state_reducer/handlers/handler_swarm_subtask_state.py`
around lines 177 - 185, The current logic overwrites the escalation increment by
resetting attempt_count when existing is None; update the initialization so
first-seen escalation events keep their increment. Specifically, in the block
that sets attempt_count when existing is None (around the variables
attempt_count, existing, and event.event_type), set attempt_count = 1 if
event.event_type is EnumDelegationEventType.DELEGATION_EXECUTE OR
EnumDelegationEventType.DELEGATION_ESCALATION_TRIGGERED, otherwise 0 (or
alternatively apply the escalation increment before the existing-is-None
assignment and only set a default of 0 when no increment occurred). Ensure you
reference and update the code paths that use attempt_count, existing, and
event.event_type so first-seen DELEGATION_ESCALATION_TRIGGERED yields
attempt_count == 1.
src/omnimarket/nodes/node_swarm_dispatch_orchestrator/models/model_orchestrator_state.py-68-70 (1)

68-70: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard invalid max_subtasks and negative wall-latency values.

Line 68 and Line 102 accept any integer; max_subtasks <= 0 or dispatch_wall_latency_ms < 0 can propagate invalid orchestration state.

Proposed fix
     def with_max_subtasks(self, max_subtasks: int) -> ModelOrchestratorState:
+        if max_subtasks < 1:
+            raise ValueError("max_subtasks must be >= 1")
         return self.model_copy(update={"max_subtasks": max_subtasks})
@@
     def with_dispatches(
         self,
         dispatches: tuple[ModelSubtaskDispatch, ...],
         dispatch_wall_latency_ms: int = 0,
     ) -> ModelOrchestratorState:
+        if dispatch_wall_latency_ms < 0:
+            raise ValueError("dispatch_wall_latency_ms must be >= 0")
         return self.model_copy(
             update={
                 "fsm_state": EnumSwarmOrchestratorState.DISPATCHING,
                 "dispatches": dispatches,
                 "dispatch_wall_latency_ms": dispatch_wall_latency_ms,
             }
         )

Also applies to: 100-103, 108-108

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_dispatch_orchestrator/models/model_orchestrator_state.py`
around lines 68 - 70, Validate inputs before calling model_copy: in
with_max_subtasks ensure max_subtasks is an int > 0 and raise ValueError if not,
and in the setter that updates dispatch_wall_latency_ms (the method that updates
the dispatch wall latency) ensure dispatch_wall_latency_ms is an int >= 0 and
raise ValueError if negative; keep using self.model_copy(update={...}) to return
the updated ModelOrchestratorState after validation so invalid values cannot
propagate into the orchestration state.
src/omnimarket/nodes/node_refill_sprint_orchestrator/models/model_refill_sprint.py-176-176 (1)

176-176: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make ModelRefillSprintResult immutable to match the module’s frozen-value-object contract.
ModelRefillSprintResult sets model_config = ConfigDict(extra="forbid") without frozen=True, while the module docstring and other models in this file use ConfigDict(frozen=True, extra="forbid").

Proposed fix
-    model_config = ConfigDict(extra="forbid")
+    model_config = ConfigDict(frozen=True, extra="forbid")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_refill_sprint_orchestrator/models/model_refill_sprint.py`
at line 176, ModelRefillSprintResult currently sets model_config =
ConfigDict(extra="forbid") but must be immutable to follow the module's
frozen-value-object contract; update the class's model_config to include
frozen=True (i.e., ConfigDict(frozen=True, extra="forbid")) so the Pydantic
model is immutable, matching other models in the file and the module docstring.
src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_request.py-26-26 (1)

26-26: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Validate min_healthy_endpoints to reject negatives.

At Line 26, negative values are accepted, which can break threshold semantics and let invalid requests through.

Suggested fix
-from pydantic import BaseModel, ConfigDict
+from pydantic import BaseModel, ConfigDict, Field
@@
-    min_healthy_endpoints: int = 8
+    min_healthy_endpoints: int = Field(default=8, ge=0)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_request.py`
at line 26, The field min_healthy_endpoints in model_fleet_discovery_request.py
currently allows negative values; add validation on the model (e.g., a Pydantic
validator or field constraint) to ensure min_healthy_endpoints is an int >= 0
and raise a validation error for negatives so invalid requests are rejected;
locate the model class in model_fleet_discovery_request.py (the class that
defines the min_healthy_endpoints field) and implement the non-negative check
referencing the min_healthy_endpoints symbol.
src/omnimarket/nodes/node_data_flow_sweep/collector.py-143-151 (1)

143-151: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix newest-message age parsing to avoid silent None and missed TOPIC_STALE

In src/omnimarket/nodes/node_data_flow_sweep/collector.py, _probe_newest_message_age’s regex captures only up to seconds (no .fff and no trailing Z/offset). As a result, datetime.fromisoformat(...) produces a naive ts, and (now - ts) subtracts naive from timezone-aware now (datetime.UTC), raising TypeError which is caught and returned as None. This bypasses the handler’s newest_message_age_seconds is not None check for TOPIC_STALE.

💡 Proposed fix
-    m = re.match(r"(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})", out.strip())
+    m = re.match(
+        r"(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)",
+        out.strip(),
+    )
@@
-        ts = datetime.datetime.fromisoformat(m.group(1).replace("Z", "+00:00"))
+        ts = datetime.datetime.fromisoformat(m.group(1).replace("Z", "+00:00"))
+        if ts.tzinfo is None:
+            ts = ts.replace(tzinfo=datetime.UTC)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/omnimarket/nodes/node_data_flow_sweep/collector.py` around lines 143 -
151, The regex in _probe_newest_message_age only captures up to whole seconds so
datetime.fromisoformat sometimes returns a naive timestamp which causes a
TypeError when subtracting from timezone-aware datetime.now(tz=datetime.UTC) and
the exception is swallowed returning None; update the regex in
_probe_newest_message_age to capture optional fractional seconds and an optional
timezone designator (Z or ±HH:MM) so m.group(1) contains a full ISO timestamp,
then build a timezone-aware ts (use datetime.fromisoformat after normalizing 'Z'
to '+00:00' or explicitly set tzinfo=datetime.UTC when no offset is present) and
let that non-None value be returned instead of silently returning None. Ensure
you still return None only when the regex truly fails and do not rely on
catching TypeError from naive/aware arithmetic.
src/omnimarket/nodes/node_swarm_dispatch_orchestrator/handlers/handler_swarm_dispatch.py-312-315 (1)

312-315: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Forward the aggregate event's latency into transition_aggregating().

route_event() currently calls transition_aggregating(state, payload) with the default total_latency_ms=0, so the completed payload always reports total_latency_ms as zero on this path.

Suggested fix
         elif routing_key == "aggregating":
             # aggregation-completed advances through AGGREGATING → COMPLETED in one shot
-            state, _ = self.transition_aggregating(state, payload)
+            total_latency_ms = int(payload.get("total_latency_ms", 0))
+            state, _ = self.transition_aggregating(
+                state,
+                payload,
+                total_latency_ms=total_latency_ms,
+            )
             state, publishes = self.transition_completed(state)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_dispatch_orchestrator/handlers/handler_swarm_dispatch.py`
around lines 312 - 315, The call site in route_event that handles routing_key ==
"aggregating" must forward the aggregate event's latency into
transition_aggregating instead of using the implicit zero; update the call where
you currently do state, _ = self.transition_aggregating(state, payload) to
compute the latency from the incoming payload (e.g. extract
payload["total_latency_ms"] or payload.get("total_latency_ms", 0) / or combine
individual latency fields as your payload schema requires) and pass it as the
total_latency_ms argument to transition_aggregating(state, payload,
total_latency_ms), then continue to call transition_completed(state) as before
so the completed payload carries the correct total_latency_ms.
🧹 Nitpick comments (3)
src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_result.py (1)

37-42: ⚡ Quick win

Enforce aggregate-count invariants against endpoints.

healthy_count, unhealthy_count, local_count, and openrouter_count can drift from endpoints with no guard. Add an after-validation invariant that verifies these counters from endpoint status/provider so projection counts fail fast when inconsistent.

Proposed patch
-from pydantic import BaseModel, ConfigDict
+from pydantic import BaseModel, ConfigDict, model_validator
@@
 class ModelFleetDiscoveryResult(BaseModel):
@@
     correlation_id: str = ""
+
+    `@model_validator`(mode="after")
+    def _validate_aggregate_counts(self) -> "ModelFleetDiscoveryResult":
+        healthy = sum(1 for endpoint in self.endpoints if endpoint.status == EnumDiscoveryEndpointStatus.healthy)
+        unhealthy = sum(1 for endpoint in self.endpoints if endpoint.status == EnumDiscoveryEndpointStatus.unhealthy)
+        local = sum(1 for endpoint in self.endpoints if endpoint.provider == "local")
+        openrouter = sum(1 for endpoint in self.endpoints if endpoint.provider == "openrouter")
+
+        if self.healthy_count != healthy or self.unhealthy_count != unhealthy:
+            raise ValueError("status counts do not match endpoints")
+        if self.local_count != local or self.openrouter_count != openrouter:
+            raise ValueError("provider counts do not match endpoints")
+        return self
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_result.py`
around lines 37 - 42, The aggregate count fields on ModelFleetDiscoveryResult
can become inconsistent with the endpoints tuple; add an after-validation check
(e.g., a pydantic `@root_validator`(pre=False) or equivalent post-init invariant
in the ModelFleetDiscoveryResult class) that computes counts by iterating over
endpoints and their status/provider (count healthy vs unhealthy from
endpoint.status and local vs openrouter from endpoint.provider), then compare
those computed values against healthy_count, unhealthy_count, local_count, and
openrouter_count and raise a ValidationError/ValueError with a clear message if
any mismatch is found so projection construction fails fast; update any logic
that sets meets_threshold if it should be derived from the recomputed counts.
src/omnimarket/nodes/node_demo_fanout_orchestrator/models/model_fanout_request.py (1)

29-31: ⚡ Quick win

Guard against empty endpoint configuration at model boundary.

endpoint_url accepts empty strings today, which defers failure to runtime dispatch. Add a non-empty constraint here so bad configs fail fast.

Suggested fix
-    endpoint_url: str = Field(description="OpenAI-compatible endpoint base URL")
+    endpoint_url: str = Field(
+        min_length=1,
+        description="OpenAI-compatible endpoint base URL",
+    )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_demo_fanout_orchestrator/models/model_fanout_request.py`
around lines 29 - 31, The endpoint_url Field in model_fanout_request.py
currently allows empty strings, so add a non-empty constraint on the Pydantic
field to fail-fast: update endpoint_url: str = Field(...) to include
min_length=1 (e.g., Field(..., min_length=1, description="OpenAI-compatible
endpoint base URL")) or replace with constr(min_length=1) as the type (e.g.,
endpoint_url: constr(min_length=1) = Field(description=...)); this enforces a
non-empty endpoint at model validation time for the model_fanout_request schema.
src/omnimarket/nodes/node_create_followup_tickets_effect/models/model_create_followup_tickets_state.py (1)

129-132: ⚡ Quick win

Constrain status to explicit allowed values.

status is currently a plain str, so invalid values can slip through silently. Encoding the allowed states in the type makes the wire contract safer.

Suggested fix
+from typing import Literal
...
 class ModelCreateFollowupTicketsResult(BaseModel):
...
-    status: str = Field(
+    status: Literal["created", "dry_run", "error", "partial"] = Field(
         default="created",
         description="Overall status: created | dry_run | error | partial.",
     )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@src/omnimarket/nodes/node_create_followup_tickets_effect/models/model_create_followup_tickets_state.py`
around lines 129 - 132, The status Field on the CreateFollowupTicketsState model
is an unconstrained str; change it to an explicit allowed set (e.g., use
typing.Literal["created","dry_run","error","partial"] or define a small Enum
like FollowupStatus and use that as the type) and update the Field default to
one of those members; adjust imports (from typing import Literal or from enum
import Enum) and the model's status declaration so Pydantic enforces only the
allowed states.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7fb0b748-ba86-4d88-9141-c8fd92da1824

📥 Commits

Reviewing files that changed from the base of the PR and between c28ce31 and 3169559.

📒 Files selected for processing (300)
  • .github/workflows/main-target-guard.yml
  • .onex_state/dep_health_baseline.json
  • .pre-commit-config.yaml
  • docs/evidence/dep-health-sweep/proof-of-life-001/baseline_diff.json
  • docs/evidence/dep-health-sweep/proof-of-life-001/findings.json
  • docs/evidence/dep-health-sweep/proof-of-life-001/import_graph.json
  • docs/evidence/dep-health-sweep/proof-of-life-001/projection_rows.json
  • docs/evidence/dep-health-sweep/proof-of-life-001/proof_summary.md
  • docs/evidence/dep-health-sweep/proof-of-life-001/run_manifest.json
  • docs/evidence/dep-health-sweep/proof-of-life-001/topology_graph.json
  • docs/work-tracking/contracts/OMN-12245.yaml
  • pyproject.toml
  • scripts/validation/unimported_handler_baseline.txt
  • src/dep_health_allowlist.yaml
  • src/omnimarket/adapters/codex/runtime_client.py
  • src/omnimarket/adapters/codex/topics.py
  • src/omnimarket/adapters/llm/adapter_llm_caller_delegation.py
  • src/omnimarket/adapters/llm/bifrost/model_bifrost_delegation_config.py
  • src/omnimarket/cli/commands/__init__.py
  • src/omnimarket/cli/commands/trace.py
  • src/omnimarket/cli/market.py
  • src/omnimarket/configs/bifrost_delegation.yaml
  • src/omnimarket/configs/routing_tiers.yaml
  • src/omnimarket/events/delegation.py
  • src/omnimarket/events/demo_pipeline.py
  • src/omnimarket/inference/bridge_config_loader.py
  • src/omnimarket/inference/registry_context_windows.py
  • src/omnimarket/models/delegation/wire/__init__.py
  • src/omnimarket/models/delegation/wire/model_bifrost_delegation_config.py
  • src/omnimarket/models/swarm/__init__.py
  • src/omnimarket/models/swarm/enum_execution_status.py
  • src/omnimarket/models/swarm/model_swarm_subtask_assignment.py
  • src/omnimarket/models/swarm/model_swarm_subtask_result.py
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/__init__.py
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/handlers/handler_adversarial_pipeline_orchestrator.py
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_adversarial_pipeline_orchestrator/models/model_adversarial_pipeline_request.py
  • src/omnimarket/nodes/node_architecture_graph_populate_effect/contract.yaml
  • src/omnimarket/nodes/node_architecture_graph_query_effect/contract.yaml
  • src/omnimarket/nodes/node_budget_policy_compute/models/model_budget_limits.py
  • src/omnimarket/nodes/node_build_dispatch_effect/contract.yaml
  • src/omnimarket/nodes/node_build_dispatch_effect/handlers/handler_build_dispatch.py
  • src/omnimarket/nodes/node_build_loop_orchestrator/__main__.py
  • src/omnimarket/nodes/node_build_loop_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_build_loop_orchestrator/handlers/adapter_delegation_router.py
  • src/omnimarket/nodes/node_build_loop_orchestrator/handlers/adapter_llm_dispatch.py
  • src/omnimarket/nodes/node_ci_watch/__init__.py
  • src/omnimarket/nodes/node_ci_watch/contract.yaml
  • src/omnimarket/nodes/node_ci_watch/handlers/handler_ci_watch.py
  • src/omnimarket/nodes/node_context_experiment_compute/__init__.py
  • src/omnimarket/nodes/node_context_experiment_compute/contract.yaml
  • src/omnimarket/nodes/node_context_experiment_compute/metadata.yaml
  • src/omnimarket/nodes/node_context_experiment_compute/models/__init__.py
  • src/omnimarket/nodes/node_context_experiment_compute/models/model_context_chunk_extended.py
  • src/omnimarket/nodes/node_context_experiment_compute/models/model_context_pack_extended.py
  • src/omnimarket/nodes/node_context_experiment_compute/models/model_context_pack_validity_scope.py
  • src/omnimarket/nodes/node_context_experiment_compute/models/util_context_chunk_id.py
  • src/omnimarket/nodes/node_context_experiment_compute/tests/__init__.py
  • src/omnimarket/nodes/node_contract_sweep/handlers/handler_contract_sweep.py
  • src/omnimarket/nodes/node_create_followup_tickets_effect/__init__.py
  • src/omnimarket/nodes/node_create_followup_tickets_effect/contract.yaml
  • src/omnimarket/nodes/node_create_followup_tickets_effect/handlers/__init__.py
  • src/omnimarket/nodes/node_create_followup_tickets_effect/handlers/handler_create_followup_tickets_effect.py
  • src/omnimarket/nodes/node_create_followup_tickets_effect/metadata.yaml
  • src/omnimarket/nodes/node_create_followup_tickets_effect/models/__init__.py
  • src/omnimarket/nodes/node_create_followup_tickets_effect/models/model_create_followup_tickets_state.py
  • src/omnimarket/nodes/node_dashboard_sweep/contract.yaml
  • src/omnimarket/nodes/node_dashboard_sweep/handlers/handler_dashboard_sweep.py
  • src/omnimarket/nodes/node_data_flow_sweep/__main__.py
  • src/omnimarket/nodes/node_data_flow_sweep/collector.py
  • src/omnimarket/nodes/node_data_flow_sweep/contract.yaml
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/__init__.py
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/handlers/handler_decompose_epic.py
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_decompose_epic_orchestrator/models/model_decompose_epic_request.py
  • src/omnimarket/nodes/node_delegate_skill_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_delegate_skill_orchestrator/ports/port_direct_bridge_dispatch.py
  • src/omnimarket/nodes/node_delegate_skill_orchestrator/ports/port_runtime_delegation_dispatch.py
  • src/omnimarket/nodes/node_delegation_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_delegation_orchestrator/delegation_intent_bridge.py
  • src/omnimarket/nodes/node_delegation_orchestrator/enums.py
  • src/omnimarket/nodes/node_delegation_orchestrator/handlers/handler_compliance_loop.py
  • src/omnimarket/nodes/node_delegation_orchestrator/handlers/handler_delegation_workflow.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_baseline_intent.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_compliance_loop_result.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_escalation_attempt.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_event.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_request.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_delegation_result.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_inference_intent.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_inference_response_data.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_quality_gate_intent.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_routing_intent.py
  • src/omnimarket/nodes/node_delegation_orchestrator/models/model_task_delegated_event.py
  • src/omnimarket/nodes/node_delegation_orchestrator/plugin.py
  • src/omnimarket/nodes/node_delegation_orchestrator/wiring.py
  • src/omnimarket/nodes/node_delegation_quality_gate_reducer/handlers/handler_quality_gate.py
  • src/omnimarket/nodes/node_delegation_quality_gate_reducer/models/model_quality_contract.py
  • src/omnimarket/nodes/node_delegation_quality_gate_reducer/models/model_quality_gate_input.py
  • src/omnimarket/nodes/node_delegation_quality_gate_reducer/models/model_quality_gate_result.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/__init__.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/contract.yaml
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/handlers/__init__.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/handlers/handler_delegation_routing_feedback.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/metadata.yaml
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/models/__init__.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/models/model_delegation_feedback_event.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/models/model_routing_feedback.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/tests/__init__.py
  • src/omnimarket/nodes/node_delegation_routing_feedback_reducer/tests/test_handler_delegation_routing_feedback.py
  • src/omnimarket/nodes/node_delegation_routing_reducer/handlers/handler_delegation_routing.py
  • src/omnimarket/nodes/node_delegation_routing_reducer/models/model_delegation_config.py
  • src/omnimarket/nodes/node_delegation_routing_reducer/models/model_routing_decision.py
  • src/omnimarket/nodes/node_delegation_routing_reducer/models/model_routing_tier.py
  • src/omnimarket/nodes/node_delegation_routing_reducer/models/model_tier_model.py
  • src/omnimarket/nodes/node_demo_cost_compute/__init__.py
  • src/omnimarket/nodes/node_demo_cost_compute/contract.yaml
  • src/omnimarket/nodes/node_demo_cost_compute/handlers/__init__.py
  • src/omnimarket/nodes/node_demo_cost_compute/handlers/handler_cost_compute.py
  • src/omnimarket/nodes/node_demo_cost_compute/metadata.yaml
  • src/omnimarket/nodes/node_demo_cost_compute/models/__init__.py
  • src/omnimarket/nodes/node_demo_cost_compute/models/model_cost_request.py
  • src/omnimarket/nodes/node_demo_cost_compute/tests/__init__.py
  • src/omnimarket/nodes/node_demo_cost_compute/tests/test_golden_chain.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/__init__.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/handlers/handler_fanout.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/models/model_fanout_request.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/tests/__init__.py
  • src/omnimarket/nodes/node_demo_fanout_orchestrator/tests/test_golden_chain.py
  • src/omnimarket/nodes/node_demo_renderer_effect/__init__.py
  • src/omnimarket/nodes/node_demo_renderer_effect/contract.yaml
  • src/omnimarket/nodes/node_demo_renderer_effect/handlers/__init__.py
  • src/omnimarket/nodes/node_demo_renderer_effect/handlers/handler_renderer.py
  • src/omnimarket/nodes/node_demo_renderer_effect/metadata.yaml
  • src/omnimarket/nodes/node_demo_renderer_effect/models/__init__.py
  • src/omnimarket/nodes/node_demo_renderer_effect/models/model_render_request.py
  • src/omnimarket/nodes/node_demo_renderer_effect/tests/__init__.py
  • src/omnimarket/nodes/node_demo_renderer_effect/tests/test_golden_chain.py
  • src/omnimarket/nodes/node_design_to_plan/contract.yaml
  • src/omnimarket/nodes/node_dispatch_request_handler/__init__.py
  • src/omnimarket/nodes/node_dispatch_request_handler/contract.yaml
  • src/omnimarket/nodes/node_dispatch_request_handler/handlers/__init__.py
  • src/omnimarket/nodes/node_dispatch_request_handler/handlers/handler_dispatch_request.py
  • src/omnimarket/nodes/node_dispatch_request_handler/metadata.yaml
  • src/omnimarket/nodes/node_dispatch_request_handler/models/__init__.py
  • src/omnimarket/nodes/node_dispatch_request_handler/models/model_dispatch_request.py
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/__init__.py
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/handlers/handler_watchdog.py
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_dispatch_watchdog_orchestrator/models/model_watchdog.py
  • src/omnimarket/nodes/node_dod_sweep_orchestrator/handlers/handler_dod_sweep_orchestrator.py
  • src/omnimarket/nodes/node_dod_sweep_orchestrator/models/model_dod_sweep_orchestrator_request.py
  • src/omnimarket/nodes/node_dod_sweep_orchestrator/models/model_dod_sweep_orchestrator_result.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/__init__.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_epic_team_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/handlers/handler_epic_team_orchestrator.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_epic_team_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/models/model_epic_team_request.py
  • src/omnimarket/nodes/node_epic_team_orchestrator/models/model_epic_team_result.py
  • src/omnimarket/nodes/node_friction_triage_orchestrator/__init__.py
  • src/omnimarket/nodes/node_friction_triage_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_friction_triage_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_friction_triage_orchestrator/handlers/handler_friction_triage_orchestrator.py
  • src/omnimarket/nodes/node_friction_triage_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_friction_triage_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_friction_triage_orchestrator/models/model_friction_triage_request.py
  • src/omnimarket/nodes/node_handler_correctness_gate/__init__.py
  • src/omnimarket/nodes/node_handler_correctness_gate/contract.yaml
  • src/omnimarket/nodes/node_handler_correctness_gate/contracts/example_eval_set.yaml
  • src/omnimarket/nodes/node_handler_correctness_gate/handlers/__init__.py
  • src/omnimarket/nodes/node_handler_correctness_gate/handlers/handler_correctness_gate.py
  • src/omnimarket/nodes/node_handler_correctness_gate/metadata.yaml
  • src/omnimarket/nodes/node_handler_correctness_gate/models/__init__.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/enums.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/model_correctness_check_request.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/model_correctness_check_result.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/model_eval_entry.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/model_eval_failure.py
  • src/omnimarket/nodes/node_handler_correctness_gate/models/model_eval_set.py
  • src/omnimarket/nodes/node_handler_correctness_gate/tests/__init__.py
  • src/omnimarket/nodes/node_handler_correctness_gate/tests/test_handler_correctness_gate.py
  • src/omnimarket/nodes/node_handoff_effect/handlers/handler_handoff_effect.py
  • src/omnimarket/nodes/node_integration_sweep_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_integration_sweep_orchestrator/handlers/handler_integration_sweep_orchestrator.py
  • src/omnimarket/nodes/node_integration_sweep_orchestrator/handlers/surface_probes.py
  • src/omnimarket/nodes/node_integration_sweep_orchestrator/models/model_integration_sweep_orchestrator_request.py
  • src/omnimarket/nodes/node_integration_sweep_orchestrator/models/model_integration_sweep_orchestrator_result.py
  • src/omnimarket/nodes/node_knowledge_context_assembler_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_knowledge_context_assembler_orchestrator/handlers/handler_knowledge_context_assembler_orchestrator.py
  • src/omnimarket/nodes/node_log_persistence_effect/__init__.py
  • src/omnimarket/nodes/node_log_persistence_effect/contract.yaml
  • src/omnimarket/nodes/node_log_persistence_effect/handlers/__init__.py
  • src/omnimarket/nodes/node_log_persistence_effect/handlers/handler_log_persistence_effect.py
  • src/omnimarket/nodes/node_log_persistence_effect/metadata.yaml
  • src/omnimarket/nodes/node_multi_agent_orchestrator/__init__.py
  • src/omnimarket/nodes/node_multi_agent_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_multi_agent_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_multi_agent_orchestrator/handlers/handler_multi_agent.py
  • src/omnimarket/nodes/node_multi_agent_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_multi_agent_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_multi_agent_orchestrator/models/model_multi_agent.py
  • src/omnimarket/nodes/node_overnight/__main__.py
  • src/omnimarket/nodes/node_pr_lifecycle_fix_effect/contract.yaml
  • src/omnimarket/nodes/node_pr_lifecycle_fix_effect/handlers/adapter_occ_contract.py
  • src/omnimarket/nodes/node_pr_lifecycle_fix_effect/handlers/adapter_pr_polish_dispatch.py
  • src/omnimarket/nodes/node_pr_lifecycle_fix_effect/handlers/handler_pr_lifecycle_fix.py
  • src/omnimarket/nodes/node_pr_lifecycle_fix_effect/models/model_fix_command.py
  • src/omnimarket/nodes/node_pr_lifecycle_orchestrator/handlers/handler_pr_lifecycle_orchestrator.py
  • src/omnimarket/nodes/node_projection_delegation/handlers/handler_projection_delegation.py
  • src/omnimarket/nodes/node_projection_registration/contract.yaml
  • src/omnimarket/nodes/node_projection_swarm/contract.yaml
  • src/omnimarket/nodes/node_redeploy/__main__.py
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/__init__.py
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/handlers/handler_refill_sprint.py
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_refill_sprint_orchestrator/models/model_refill_sprint.py
  • src/omnimarket/nodes/node_session_orchestrator/__main__.py
  • src/omnimarket/nodes/node_swarm_aggregator_compute/contract.yaml
  • src/omnimarket/nodes/node_swarm_aggregator_compute/handlers/handler_swarm_aggregator.py
  • src/omnimarket/nodes/node_swarm_aggregator_compute/models/model_swarm_aggregate_request.py
  • src/omnimarket/nodes/node_swarm_aggregator_compute/models/model_swarm_aggregate_result.py
  • src/omnimarket/nodes/node_swarm_decomposer_compute/contract.yaml
  • src/omnimarket/nodes/node_swarm_decomposer_compute/handlers/handler_swarm_decomposer.py
  • src/omnimarket/nodes/node_swarm_decomposer_compute/models/model_swarm_decompose_request.py
  • src/omnimarket/nodes/node_swarm_decomposer_compute/models/model_swarm_decompose_result.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/handlers/handler_swarm_dispatch.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/models/model_orchestrator_state.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/models/model_swarm_dispatch_request.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/tests/test_fsm_routing_integration.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/tests/test_handler_swarm_dispatch.py
  • src/omnimarket/nodes/node_swarm_dispatch_orchestrator/tests/test_models.py
  • src/omnimarket/nodes/node_swarm_endpoint_health_effect/contract.yaml
  • src/omnimarket/nodes/node_swarm_endpoint_health_effect/handlers/handler_swarm_endpoint_health.py
  • src/omnimarket/nodes/node_swarm_endpoint_health_effect/models/model_swarm_health_check_request.py
  • src/omnimarket/nodes/node_swarm_endpoint_health_effect/models/model_swarm_health_check_result.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/contract.yaml
  • src/omnimarket/nodes/node_swarm_fanout_effect/handlers/handler_swarm_fanout.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/metadata.yaml
  • src/omnimarket/nodes/node_swarm_fanout_effect/models/model_swarm_fanout_request.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/models/model_swarm_fanout_result.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/tests/test_handler_swarm_fanout.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/tests/test_models.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/__init__.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/contract.yaml
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/handlers/__init__.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/handlers/handler_swarm_fanout.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/metadata.yaml
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/__init__.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/enums.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_subtask.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_config.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_dispatch.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_endpoint.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_fanout_request.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_fanout_result.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_subtask_assignment.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/models/model_swarm_subtask_result.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/tests/__init__.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/tests/test_handler_swarm_fanout.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/tests/test_handler_swarm_fanout_queue.py
  • src/omnimarket/nodes/node_swarm_fanout_orchestrator/tests/test_models.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/__init__.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/contract.yaml
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/handlers/__init__.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/handlers/handler_swarm_fleet_discovery.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/metadata.yaml
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/__init__.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_request.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/models/model_fleet_discovery_result.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/tests/__init__.py
  • src/omnimarket/nodes/node_swarm_fleet_discovery_effect/tests/test_handler_swarm_fleet_discovery.py
  • src/omnimarket/nodes/node_swarm_registry_compute/contract.yaml
  • src/omnimarket/nodes/node_swarm_registry_compute/contracts/endpoint_registry.yaml
  • src/omnimarket/nodes/node_swarm_registry_compute/handlers/handler_swarm_registry.py
  • src/omnimarket/nodes/node_swarm_registry_compute/models/model_swarm_endpoint_selection_request.py
  • src/omnimarket/nodes/node_swarm_registry_compute/models/model_swarm_endpoint_selection_result.py
  • src/omnimarket/nodes/node_swarm_subtask_state_reducer/__init__.py
  • src/omnimarket/nodes/node_swarm_subtask_state_reducer/contract.yaml
  • src/omnimarket/nodes/node_swarm_subtask_state_reducer/handlers/__init__.py
  • src/omnimarket/nodes/node_swarm_subtask_state_reducer/handlers/handler_swarm_subtask_state.py
  • src/omnimarket/nodes/node_swarm_subtask_state_reducer/metadata.yaml
💤 Files with no reviewable changes (8)
  • src/omnimarket/nodes/node_swarm_fanout_effect/handlers/handler_swarm_fanout.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/contract.yaml
  • src/omnimarket/nodes/node_projection_registration/contract.yaml
  • src/omnimarket/nodes/node_swarm_fanout_effect/metadata.yaml
  • src/omnimarket/nodes/node_swarm_fanout_effect/models/model_swarm_fanout_result.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/models/model_swarm_fanout_request.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/tests/test_models.py
  • src/omnimarket/nodes/node_swarm_fanout_effect/tests/test_handler_swarm_fanout.py

@jonahgabriel
jonahgabriel force-pushed the hotfix/omn-12245-delegation-projection-counts branch from 3169559 to b6632bd Compare May 27, 2026 21:14
@github-actions

github-actions Bot commented May 27, 2026 •

Copy link
Copy Markdown

✅ Architectural Review — PASSED

Errors: 0
Warnings: 0

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

No architectural violations found.

Powered by node_pr_review_bot

@github-actions

github-actions Bot commented May 27, 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

@github-actions

github-actions Bot commented May 27, 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)

@jonahgabriel
jonahgabriel force-pushed the hotfix/omn-12245-delegation-projection-counts branch from 41bcada to 8fa014d Compare May 27, 2026 21:54
@jonahgabriel
jonahgabriel added this pull request to the merge queue May 27, 2026
Merged via the queue into dev with commit 3750340 May 27, 2026
101 of 102 checks passed
@jonahgabriel
jonahgabriel deleted the hotfix/omn-12245-delegation-projection-counts branch May 27, 2026 22:08
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.

2 participants