chore(deps): update vendored runtime crates - #5081
Conversation
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 27 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughAdds engine-topology compatibility validation for conditional fan-in graphs, applies it across workflow authoring and execution paths, rejects incompatible saved sub-workflows, updates proposal gating, and expands legacy-flow, resolver, end-to-end, dependency, and middleware coverage. ChangesWorkflow compatibility enforcement
Dependency and middleware alignment
End-to-end contract coverage
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ProposalTool
participant WorkflowOps
participant CompatibilityValidator
participant SubWorkflowResolver
participant FlowCompiler
ProposalTool->>WorkflowOps: validate and build proposal
WorkflowOps->>CompatibilityValidator: check graph topology
CompatibilityValidator->>SubWorkflowResolver: inspect referenced child graphs
SubWorkflowResolver-->>CompatibilityValidator: return compatible or rejected graph
CompatibilityValidator-->>WorkflowOps: return errors or success
WorkflowOps->>FlowCompiler: compile compatible workflow
Possibly related PRs
Suggested labels: Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/openhuman/flows/ops.rs (1)
3361-3365: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winLog the compatibility-gate rejection before returning. The new
ensure_engine_compatible(&flow.graph)?gate fails closed but propagates its error silently — unlikeflows_validate(which emits a debug) and every other error branch in these two functions (whichtracing::warn). A legacy flow that suddenly stops running/resuming will leave no grep-friendly trace attarget: "flows"explaining why.
src/openhuman/flows/ops.rs#L3361-L3365: log the rejection (e.g.tracing::warn!(target: "flows", flow_id = %flow_id, %error, "[flows] flows_run: rejected — unsupported engine topology")) before returning the error.src/openhuman/flows/ops.rs#L3618-L3620: emit the equivalentflows_resumewarn includingflow_idandthread_id.As per coding guidelines: "Use verbose, grep-friendly diagnostics for new or changed flows, including entry/exit, branches, external calls, retries, state transitions, and errors."
🤖 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/openhuman/flows/ops.rs` around lines 3361 - 3365, Log compatibility-gate failures before propagating them: in src/openhuman/flows/ops.rs lines 3361-3365, update the flows_run path around ensure_engine_compatible to emit a target "flows" warning including flow_id and the error, then return the error; in lines 3618-3620, add the equivalent flows_resume warning including flow_id and thread_id before returning.Source: Coding guidelines
🤖 Prompt for all review comments with 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.
Inline comments:
In `@tests/json_rpc_e2e.rs`:
- Around line 15065-15091: Update poll_team_members_status to accept the
expected member IDs or count, and require the agent_team_get response to contain
exactly that expected set before checking every member has the want status.
Update its callers for the Alice-and-Bob scenario so the poll cannot succeed
when only one member is returned.
---
Nitpick comments:
In `@src/openhuman/flows/ops.rs`:
- Around line 3361-3365: Log compatibility-gate failures before propagating
them: in src/openhuman/flows/ops.rs lines 3361-3365, update the flows_run path
around ensure_engine_compatible to emit a target "flows" warning including
flow_id and the error, then return the error; in lines 3618-3620, add the
equivalent flows_resume warning including flow_id and thread_id before
returning.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: d81902b2-2b3e-4816-ac8d-ddda326e4b63
⛔ Files ignored due to path filters (2)
Cargo.lockis excluded by!**/*.lockapp/src-tauri/Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (19)
Cargo.tomlsrc/openhuman/flows/ops.rssrc/openhuman/flows/ops_tests.rssrc/openhuman/tinyagents/middleware.rstests/agent_harness_e2e.rstests/json_rpc_e2e.rstests/personality_e2e.rstests/raw_coverage/agent_harness_leftovers_raw_coverage_e2e.rstests/raw_coverage/agent_prompts_subagent_raw_coverage_e2e.rstests/raw_coverage/agent_round26_raw_coverage_e2e.rstests/raw_coverage/agent_session_round24_raw_coverage_e2e.rstests/raw_coverage/composio_credentials_state_raw_coverage_e2e.rstests/raw_coverage/inference_agent_raw_coverage_e2e.rstests/raw_coverage/memory_raw_coverage_e2e.rstests/raw_coverage/memory_threads_raw_coverage_e2e.rsvendor/tinyagentsvendor/tinychannelsvendor/tinyflowsvendor/tinyjuice
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8c7830f6af
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if ports.len() < 2 { | ||
| continue; |
There was a problem hiding this comment.
Treat single-output routers as conditional
When a switch has only one wired case (or a condition only wires one branch), ports.len() is 1 so this guard skips the node as if it were unconditional, even though the runtime still makes a routing decision and may emit no matching successor/default. A graph such as trigger -> outer switch(case) -> inner switch(case) -> A plus an unconditional C -> merge still has a predecessor behind nested conditional routing, but it now passes validation/run guards and can hit the same silent fan-in data-loss path this compatibility check is intended to block. Please classify router node kinds as branchers even when only one output edge is present.
Useful? React with 👍 / 👎.
| pub(crate) fn validate_and_migrate_graph(graph_json: Value) -> Result<WorkflowGraph, String> { | ||
| let graph = migrate_and_deserialize_graph(graph_json)?; | ||
| tinyflows::validate::validate(&graph).map_err(|e| e.to_string())?; | ||
| ensure_engine_compatible(&graph)?; |
There was a problem hiding this comment.
Apply the compatibility gate to edited graphs too
Putting the new engine-compatibility check only in validate_and_migrate_graph leaves already-deserialized authoring paths out of sync: edit_workflow applies graph ops to a WorkflowGraph, runs tinyflows::validate::validate_all, and then calls build_builder_proposal without ever hitting this helper. In that path an agent can get a normal workflow_proposal and write an unsafe nested-fan-in graph back to a draft, only for save/run to fail later. Please run engine_compatibility_errors from the shared graph-level gate used after validate_all as well.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 54f6beb38a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let reaches_from_port = |port: &str| { | ||
| reaches_via_port(graph, &candidate.id, port, predecessor, &fan_in.id) | ||
| }; | ||
| let any_port_reaches = ports.iter().any(|port| reaches_from_port(port)); |
There was a problem hiding this comment.
Count branchers that feed the fan-in directly
When the fan-in edge comes directly from a router branch, e.g. outer.true -> inner, inner.true -> merge, and another unconditional predecessor also feeds merge, the immediate predecessor is the router node (inner) itself. This check only asks whether each candidate port can reach predecessor, so inner.true is tested for reaching inner and the inner brancher is never counted; the same gap lets a direct route.main -> merge branch bypass the main-port rejection. Those graphs still hit the unsafe nested/main-labelled fan-in path this guard is meant to fail closed on, so the check needs to treat candidate.id == predecessor with a matching fan-in edge as controlled by that candidate port.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with 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.
Inline comments:
In `@src/openhuman/flows/ops.rs`:
- Around line 3642-3653: Update the compatibility-rejection branch in
flows_resume to mark the existing run as failed before returning the
ensure_engine_compatible error, using the same store::record_run and
finish_flow_run_row cleanup performed by other failure branches. Add a focused
flows_resume test for an engine-incompatible checkpoint that verifies the
rejection and asserts the persisted run reaches terminal failed status.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 64240e41-516c-4841-948e-b3eb9b354a27
📒 Files selected for processing (5)
src/openhuman/flows/builder_tools.rssrc/openhuman/flows/builder_tools_tests.rssrc/openhuman/flows/ops.rssrc/openhuman/flows/ops_tests.rstests/json_rpc_e2e.rs
🚧 Files skipped from review as they are similar to previous changes (1)
- tests/json_rpc_e2e.rs
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: aebc836a18
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Author-time validation cannot protect definitions persisted by an older | ||
| // OpenHuman build. Re-check immediately before compilation so an upgrade | ||
| // fails explicitly instead of silently committing incomplete merge data. | ||
| if let Err(error) = ensure_engine_compatible(&flow.graph) { |
There was a problem hiding this comment.
Validate resolved sub-workflow graphs too
When a pre-upgrade unsafe flow is only reached through a sub_workflow node, this guard checks the parent flow.graph and then installs capabilities whose OpenHumanWorkflowResolver::resolve loads the child via load_flow_graph without running ensure_engine_compatible. A safe parent that references a legacy nested-fan-in child by workflow_id can therefore still execute the exact topology this change is trying to fail closed on, including from the new run/resume boundary. Please apply the same compatibility check to resolved child graphs before returning them to TinyFlows.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 20883087e9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let every_port_deterministically_reaches = ports.len() >= 2 | ||
| && ports.iter().all(|port| { |
There was a problem hiding this comment.
Count switches without defaults as conditional
Here ports is just the set of outgoing edges, so a switch with two wired case labels that both reconverge passes every_port_deterministically_reaches even when it has no default edge. In that case an unmatched switch value emits no successor, so a graph like outer switch(case1/case2 -> inner) -> inner branch -> fan-in is still behind nested conditional routing but is treated as unconditional by this new guard. Please only apply the all-ports reconvergence exception when the router's runtime choices are exhaustive (e.g. condition true/false, or a switch with a default), otherwise count the switch as controlling the fan-in.
Useful? React with 👍 / 👎.
| let referenced_compatibility_errors = referenced_workflow_compatibility_errors(config, graph); | ||
| if !referenced_compatibility_errors.is_empty() { | ||
| return referenced_compatibility_errors; |
There was a problem hiding this comment.
Gate first-draft proposals against saved children
The new saved-child compatibility check only runs inside run_builder_gates, but the registered propose_workflow tool still has its own validation sequence in src/openhuman/flows/tools.rs and never calls this helper. When an initial proposal contains a sub_workflow with a literal workflow_id pointing to a legacy graph with this unsupported topology, the agent gets a normal workflow_proposal even though revise_workflow/save_workflow/strict validation would reject the same graph. Please route ProposeWorkflowTool through the shared gate/build proposal path or add the referenced-child check there.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0a4cbbcafb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| NodeKind::Switch => ports.contains("default"), | ||
| _ => true, | ||
| }; | ||
| let every_port_deterministically_reaches = ports.len() >= 2 |
There was a problem hiding this comment.
Treat default-only switches as exhaustive
When a nested path contains a switch whose only outgoing edge is default, runtime always chooses that edge, so it is not an additional conditional brancher. The ports.len() >= 2 guard makes every_port_deterministically_reaches false even though the switch was already classified as exhaustive, so a graph like outer condition -> default-only switch -> A plus another predecessor into a merge is rejected as unsupported_nested_conditional_fan_in. This blocks valid workflows; special-case default-only switches or drop the port-count guard for exhaustive routers.
Useful? React with 👍 / 👎.
| ensure_engine_compatible(graph) | ||
| .map_err(|error| format!("workflow_id '{id}' is engine-incompatible: {error}"))?; |
There was a problem hiding this comment.
Recursively check saved sub-workflow references
The fresh gap is a workflow_id inside the resolved child: ensure_engine_compatible only checks the loaded graph plus inline children, so a legacy chain parent -> saved child -> unsafe saved grandchild returns the child to TinyFlows and can run nodes before that nested sub_workflow before the grandchild resolver rejects. That means stored graphs are not fail-closed at the run/resume boundary when the incompatible topology is one saved-reference hop deeper; apply the same saved-reference traversal used by authoring gates before returning the resolved graph.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 39a4506dcd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Author-time validation cannot protect definitions persisted by an older | ||
| // OpenHuman build. Re-check immediately before compilation so an upgrade | ||
| // fails explicitly instead of silently committing incomplete merge data. | ||
| if let Err(error) = ensure_engine_compatible(&flow.graph) { |
There was a problem hiding this comment.
Preflight referenced sub-workflows before starting runs
When a legacy saved parent is itself compatible but contains a literal sub_workflow.workflow_id pointing to an incompatible saved child, this new run-boundary guard only checks flow.graph (plus inline children). The saved-reference traversal runs later in the resolver, so any parent nodes before that sub-workflow, including http_request, tool_call, or code, can already execute before the run fails; apply the same referenced-workflow compatibility check here and in the matching resume guard before compiling/executing.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0445a204b3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Write the accepted structural edit back to the draft (the durable | ||
| // working copy), so it survives across turns/reloads even if a later | ||
| // binding/connection/contract gate flags something to fix next. | ||
| write_edit_to_draft()?; |
There was a problem hiding this comment.
Check saved children before writing the draft
When an edit adds a literal sub_workflow.workflow_id that points at a legacy incompatible flow, the graph-only engine_compatibility_errors(&edited) above passes because it cannot resolve saved workflows. This line then writes the edited graph into the draft before build_builder_proposal runs run_builder_gates and rejects the saved child, leaving a durable draft that save/run paths will refuse even though the tool returned an error. Run the referenced-workflow compatibility check before this writeback, or skip writeback for that gate, so rejected engine-incompatible edits do not poison the working copy.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d679eeaa41
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let Some(edge) = outgoing.next() else { | ||
| return false; | ||
| }; | ||
| if edge.from_port != "main" || outgoing.next().is_some() { |
There was a problem hiding this comment.
Allow deterministic main fan-out in compatibility proof
When an exhaustive nested router reconverges through a normal node that has two main fan-out edges (for example one edge toward the fan-in predecessor and one side edge), that predecessor still always runs because same-port edges are unconditional fan-out. This outgoing.next().is_some() check makes deterministically_reaches return false for that path, so otherwise-exhaustive routers get counted as controlling the fan-in and valid workflows are rejected as unsupported_nested_conditional_fan_in. Please keep following main fan-out (or prove that at least one main successor reaches the target) instead of treating any extra main edge as nondeterministic.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Line 7401 in 6502cdc
In default builds that include TinyCortex, the lockfile still pulls two tinyagents crate identities: OpenHuman/TinyFlows use tinyagents 2.1.0, but tinycortex still depends on tinyagents 2.0.0. That defeats the single-crate/trait-identity guarantee documented in Cargo.toml for the TinyCortex tinyagents patch, so any TinyCortex API that names tinyagents traits/types can no longer interoperate with the host's 2.1 adapters and the binary still carries both runtimes. Please update the vendored TinyCortex dependency/pin so the lock contains only the 2.1 tinyagents package.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| pub(crate) fn validate_and_migrate_graph(graph_json: Value) -> Result<WorkflowGraph, String> { | ||
| let graph = migrate_and_deserialize_graph(graph_json)?; | ||
| tinyflows::validate::validate(&graph).map_err(|e| e.to_string())?; | ||
| ensure_engine_compatible(&graph)?; |
There was a problem hiding this comment.
Gate default saves against referenced unsafe children
When a graph uses sub_workflow.config.workflow_id, this graph-only compatibility check cannot inspect the saved child, and the normal canvas/create/update path still persists through flows_create/flows_update without strict (checked FlowCanvasPage → createFlow/updateFlow). In that scenario a user can save a new parent that points at a legacy incompatible child, then every run fails later in ensure_execution_compatible; the new author-time validation only covers inline children or strict/agent paths. Please run the config-aware compatibility gate before persisting graph changes, while still keeping metadata-only edits of legacy graphs available.
Useful? React with 👍 / 👎.
Summary
mainrevisions; TinyCortex was already current.mainbecause its TinyAgents 2.1 dependency is required to preserve a single graph/checkpointer trait identity.bytes1.12.1, andmail-parser0.11.5.main-labelled branch ports and legacy stored graphs at run/resume boundaries.Problem
^1.7constraint rejected it.Solution
mainand initialize the new optional transcript sequence field in raw-coverage fixtures.Submission Checklist
Impact
9a0603abecause that is already the latestmainrevision.Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
chore/update-vendor-submodules5b28cafceValidation Run
agent_harness_e2etarget passed 18/18; the agent-team live-run E2E (including exact expected-member reconciliation), exact Composio contract-gate raw-coverage test, and TokenJuice host-floor middleware tests passed; root check andopenhuman-corebuild passed; merged-mainraw_coverage_alland v0.62.0personality_e2ecompile successfully.cargo check --manifest-path app/src-tauri/Cargo.tomlpassed.openhuman.update_checksuccessfully.Validation Blocked
command:N/Aerror:N/Aimpact:N/ABehavior Changes
Parity Contract
Duplicate / Superseded PR Handling
Summary by CodeRabbit
Bug Fixes
Improvements
Tests