Skip to content

feat(core): compile-time flows feature gate (#4797)#4912

Merged
M3gA-Mind merged 17 commits into
tinyhumansai:mainfrom
oxoxDev:feat/4797-flows-feature-gate
Jul 16, 2026
Merged

feat(core): compile-time flows feature gate (#4797)#4912
M3gA-Mind merged 17 commits into
tinyhumansai:mainfrom
oxoxDev:feat/4797-flows-feature-gate

Conversation

@oxoxDev

@oxoxDev oxoxDev commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Adds a compile-time Cargo flows feature (default-ON) gating the openhuman::flows + tinyflows + rhai_workflows domains, composing with the runtime DomainSet::flows flag from feat(core): DomainSet on CoreBuilder + DomainRegistration filter seam (feature-gate prerequisite) #4796.
  • Default build is byte-identical — every change is cfg-off-only, so the desktop/CLI app is unchanged. Slim builds opt out via cargo build --no-default-features --features "<gates without flows>".
  • The only gate in this epic that sheds real dependencies — 5 crates: tinyflows, jaq-core, jaq-std, jaq-json, rhai. Proven, not argued: cargo tree -i <crate> returns nothing on the slim build and all 5 resolve on default.
  • Leaf-gate, zero stub files. Nothing inside flows/, tinyflows/, or rhai_workflows/ changed.
  • 25 flow tools + RhaiTool gated; 8 pre-existing test sites cfg'd.

Problem

#4795 wants one compile-time feature gate per subsystem family so slim harness builds drop code and deps; #4796 shipped the runtime DomainSet axis. This PR adds the compile-time half for the flows family.

Two scope realities the issue statement under-specified, both confirmed by a call-graph sweep:

  • "Sheds the rhai scripting engine" is true only at the feature level. rhai is not a direct dependency of this crate — it arrives transitively via tinyagents/repl. So the gate must be flows = ["dep:tinyflows", "tinyagents/repl"], and the direct tinyagents dep drops repl. The tinyagents crate itself cannot be shed: 26+ domains consume it.
  • The tool count is 25 + RhaiTool, not 14. The issue's 14 counted names in a const table, not registrations.

Solution

  • Cargo.toml: flows = ["dep:tinyflows", "tinyagents/repl"] added to default; tinyflows made optional; the direct tinyagents dep no longer enables repl.
  • Leaf-gate with no stub files. #[cfg(feature = "flows")] sits on the module declarations and on each registration site — controller, subscriber, boot reconcile, agent tools, and the workflow_builder / flow_discovery built-ins. No stub.rs anywhere, deliberately: every externally-reached symbol in this family is a registration site, and registration sites want absence. A stub that registers a controller which then errors is the opposite of the DoD — the namespace would still appear in /schema.
  • Tests (src/core/all_tests.rs, ops_tests.rs): directional on/off coverage for controller + tool registration. 8 pre-existing test sites cfg'd for the disabled config — jsonrpc_tests.rs, builtin_definitions.rs, definition_tests.rs, and the loader tests (4 of these were not in the original plan).
  • App forwarding (app/src-tauri/Cargo.toml): the openhuman_core dep is default-features = false, so flows is added explicitly to keep the domain in the shipped desktop app. Verified with cargo tree -e features -i openhuman.
  • CI: no functional change needed — the rust-feature-gate-smoke lane in ci-lite.yml is a deny-by-default allow-list (--no-default-features --features tokenjuice-treesitter), so a new default-ON gate is excluded automatically and the disabled combination is already covered. The only edit is a step-label rename ("Check core builds with the voice gate disabled""...with the default domain gates disabled"), since the lane now covers more than voice.

When off: the flows RPC namespace is absent from /schema and its methods return a clean JSON-RPC unknown-method (-32000); the 25 flow tools + RhaiTool are absent from the tool belt; tinyflows + jaq-* + rhai leave the build.

Submission Checklist

If a section does not apply to this change, mark the item as N/A with a one-line reason. Do not delete items.

  • Tests added or updated (happy path + at least one failure / edge case) per Testing Strategy — directional on/off registration tests in both feature configs, plus 8 pre-existing sites cfg'd for the disabled build.
  • N/A: no instrumented changed lines — the diff is compile-config only (#[cfg] attrs, a Cargo feature, a doc block); diff-cover reports no coverable lines. The directional gate tests cover the on/off behaviour. — Diff coverage ≥ 80%
  • N/A: compile-time build-config change, no user-facing feature row — Coverage matrix updated
  • N/A: no matrix rows affected — All affected feature IDs from the matrix are listed in the PR description under ## Related
  • No new external network dependencies introduced (mock backend used per Testing Strategy) — no deps added; tinyflows is an existing dep made optional.
  • N/A: default build is byte-identical, so no release-cut surface changes — Manual smoke checklist updated if this touches release-cut surfaces (docs/RELEASE-MANUAL-SMOKE.md)
  • Linked issue closed via Closes #NNN in the ## Related section

Impact

  • Desktop / CLI / mobile / web: no behaviour change — default keeps flows on and the build is byte-identical.
  • Slim builds: drop the flows domain, its 25 tools + RhaiTool, and 5 crates (tinyflows, jaq-core, jaq-std, jaq-json, rhai). This is the epic's only real binary-size win so far.
  • Security: reduced attack surface in slim builds — the rhai script engine is gone entirely rather than merely unreachable.
  • Migration / compatibility: none. Additive and default-preserving.

Related


AI Authored PR Metadata (required for Codex/Linear PRs)

Linear Issue

  • Key: N/A — GitHub-issue driven, no Linear ticket.
  • URL: N/A

Commit & Branch

  • Branch: feat/4797-flows-feature-gate
  • Commit SHA: b25121bb3d3d59d7c6e37107da9861a87c7fce82 (8 commits, 16 files, +204/-10)

Validation Run

  • N/A: no frontend changes — pnpm --filter openhuman-app format:check
  • N/A: no frontend changes — pnpm typecheck
  • Focused tests: scoped enabled-config tests pass; directional gate tests pass in both configs.
  • Rust fmt/check (if changed): cargo fmt clean · enabled cargo check 0 errors · disabled cargo check --no-default-features --features tokenjuice-treesitter 0 errors · clippy clean in both directions.
  • N/A: manifest-only change to app/src-tauri/Cargo.toml (one dep line), no Tauri Rust source touched — forwarding verified via cargo tree -e features -i openhuman — Tauri fmt/check (if changed)

Boot smoke (both directions, 2 runs for repeatability) — both configs built, linked, booted, and served /rpc:

  • Gate ON: flows namespace present in /schema; probe openhuman.flows_list{"result":{"logs":["flows listed"],"result":[]}}.
  • Gate OFF: namespace absent from /schema; the method returns a clean JSON-RPC unknown-method (-32000); the process survives.

Validation Blocked

  • command: cargo test --no-default-features
  • error: 2 pre-existing failures on main today — group_mapping_smoke and harness_excludes_gated_namespaces, both asserting the voice namespace uncfg'd (fallout from the merged voice gate feat(core): feature gate — voice #4803). CI cannot see them: the feature-gate smoke lane runs cargo check, which never compiles test code.
  • impact: Not introduced by this PR and not fixed by it. This PR cfg'd its own asserts and left voice's alone; the voice asserts are a separate, epic-level fix that is pending. Scoped enabled-config tests and both-direction cargo check are green.

Behavior Changes

  • Intended behavior change: new default-ON flows compile-time gate. Default build unchanged.
  • User-visible effect: none by default. Slim builds omit the flows domain, its 25 tools + RhaiTool, and 5 crates.

Parity Contract

  • Legacy behavior preserved: yes — every change is cfg-off-only, so the default build is byte-identical.
  • Guard/fallback/dispatch parity checks: gate ON reproduces current registration exactly (verified by boot smoke against the live /rpc); gate OFF yields absence at every registration site — no half-registered controller, no stub that registers-then-errors. Composes with, and does not replace, the runtime DomainSet::flows guard from feat(core): DomainSet on CoreBuilder + DomainRegistration filter seam (feature-gate prerequisite) #4796.

Duplicate / Superseded PR Handling

Summary by CodeRabbit

  • New Features
    • Added a compile-time flows option (now included in default builds) to enable workflow/flow capabilities and related tooling.
  • Bug Fixes
    • Prevented Flows controllers, JSON-RPC subscribers, cron reconciliation, and flow/workflow tools and built-in agents from registering when flows is disabled, improving slim build behavior.
  • Tests
    • Updated and added feature-gated unit, integration, and E2E coverage to ensure flows namespaces/endpoints and tool/agent sets appear only when enabled.
  • Documentation
    • Documented the flows feature gate matrix and clarified CI’s cargo check-only limitation for disabled-feature behavior.

oxoxDev added 8 commits July 15, 2026 17:54
Gates the flows automation domains at compile time, composing with the
runtime DomainSet::flows axis from tinyhumansai#4796. Default-ON, so the desktop
build is unchanged.

Makes `tinyflows` optional and moves `tinyagents`'s `repl` feature
behind the gate: `repl` is the only thing pulling `rhai`, and it is
consumed solely by `rhai_workflows`. A slim build therefore sheds
tinyflows + jaq-core/jaq-std/jaq-json + rhai. `tinyagents` itself
cannot be shed — 26+ domains consume it.
…tinyhumansai#4797)

Leaf-gate: no stub facade. Every symbol reached from outside these three
modules is a registration site, and registration sites want ABSENCE — a
stub returning `Err("flows disabled")` would register a controller that
then fails at runtime, the opposite of the intended unknown-method
behaviour. Call sites carry their own #[cfg] instead.
…tinyhumansai#4797)

Three core-side registration sites for the flows domain:
- all.rs: the flows controller push (keeps its DomainGroup::Flows tag —
  that is the orthogonal runtime axis).
- jsonrpc.rs: the FlowTriggerSubscriber registration. The existing
  `if plan.flows` runtime guard does not help here — the type path must
  still resolve for the block to compile.
- services.rs: reconcile_schedule_triggers_on_boot.

Each disabled path keeps a debug log, per the logging convention.
…ansai#4797)

Gates the four glob re-exports and, per element, the 25 flows-owned tools
in the default registry — the same construct the voice gate already uses
on elements of this vec!. Also gates the rhai_workflows tool, whose
engine the gate sheds via tinyagents/repl.

`const FLOWS: &[&str]` in tool_group() stays UNgated: it is an inert
&str table referencing no flows types, so the tool-group classification
keeps working (and its tests keep passing) in a slim build.
…built-ins (tinyhumansai#4797)

This module is always compiled, so the two BuiltinAgent entries' prompt_fn
paths break without a cfg. Gating the element also drops its include_str!
of the agent TOML — correct: a slim build must not advertise an agent
whose entire tool belt is absent.

#[cfg] on const-slice elements is stable (attributes on array-literal
elements) and verified in both directions here.
…inyhumansai#4797)

The CI smoke lane runs `cargo check` only, never
`cargo test --no-default-features` — so CI stays green while the
disabled-build test suite breaks. Six pre-existing sites hard-assert
that flows exists and fail (or panic) once the gate lands:

- all_tests.rs: `full_ns.contains("flows")`, `group_for_namespace`,
  and two `.expect("a flows.* method exists")` vehicles.
- jsonrpc_tests.rs: the transport-layer gated-method vehicle.
- builtin_definitions.rs + definition_tests.rs: built-in agent id and
  max-iterations tables listing the two flows agents.

Adds directional tests: controllers registered when the feature is on,
absent when off (one namespace — tinyflows registers no controllers and
rhai_workflows is AgentOnly), plus a tools test proving all 25 flow
tools and rhai_workflows leave the registry when the gate is off.
SecurityPolicy::default() is Supervised, so the rhai assertion is real.
…nsai#4797)

The shell sets default-features = false, so without this the shipped app
would silently lose the entire Flows surface. Multi-line array so the
sibling gates append cleanly.
…nsai#4797)

Adds the gate-table row and the leaf-gate rationale (why registration
sites want absence, not a stub).

Corrects the issue's dep claim: the gate does NOT shed tinyagents (26+
domains consume it). "Sheds the rhai scripting engine" is true only at
the feature level — rhai arrives via tinyagents/repl, which flows now
owns. Also notes that compiling clean is not proof of a dep shed, and
records the disabled-build test gap for future gates.

The ci-lite smoke lane needs no functional change: its
`--features tokenjuice-treesitter` is an explicit allow-list, so a new
default-ON gate is excluded automatically. Only the stale step name
("the voice gate disabled") is corrected.
@oxoxDev
oxoxDev requested a review from a team July 15, 2026 14:33
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 27 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

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.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4d287f96-afd7-4881-bb8a-e861bab51b15

📥 Commits

Reviewing files that changed from the base of the PR and between da5c867 and 73b3493.

📒 Files selected for processing (13)
  • .github/workflows/ci-lite.yml
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/core/all.rs
  • src/core/all_tests.rs
  • src/core/jsonrpc.rs
  • src/openhuman/agent/harness/definition_tests.rs
  • src/openhuman/agent_registry/agents/loader.rs
  • src/openhuman/mod.rs
  • src/openhuman/tools/mod.rs
  • src/openhuman/tools/ops.rs
  • tests/json_rpc_e2e.rs
📝 Walkthrough

Walkthrough

This change adds a compile-time flows feature gate, makes flow dependencies optional, and conditionally excludes flow modules, controllers, tools, agents, subscribers, cron reconciliation, and dependent tests from slim builds.

Changes

Flows feature gate

Layer / File(s) Summary
Feature and dependency contract
Cargo.toml, app/src-tauri/Cargo.toml
Adds the flows feature, makes tinyflows optional, separates tinyagents/repl, and enables flows for the Tauri application.
Leaf modules, tools, and agents
src/openhuman/mod.rs, src/openhuman/tools/*, src/openhuman/agent_registry/agents/loader.rs
Gates flow modules, re-exports, workflow tools, scripting support, and workflow agent definitions behind flows.
Core controller and runtime wiring
src/core/all.rs, src/core/jsonrpc.rs, src/core/runtime/services.rs
Conditionally registers Flows controllers, subscribers, and cron reconciliation, logging when the subscriber is unavailable.
Feature-specific validation and guidance
src/core/*_tests.rs, src/openhuman/**/*tests.rs, tests/json_rpc_e2e.rs, AGENTS.md, .github/workflows/ci-lite.yml
Updates feature-sensitive assertions, adds disabled-build absence tests, gates flow E2E tests, and documents the gate and testing requirements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related issues

  • tinyhumansai/openhuman#4795 — Tracks the broader feature-gating work implemented here.
  • tinyhumansai/openhuman#4801 — Covers the same compile-time removal pattern for subsystem controllers, tools, dependencies, and runtime registrations.

Possibly related PRs

Suggested labels: feature, rust-core

Poem

A rabbit hops where flow gates glow,
Tools hide when slim builds grow.
Controllers rest, subscribers sleep,
Cargo guards the paths they keep.
“Compile clean!” the bunny sings.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning Most flows-gating requirements are implemented, but the PR lacks evidence of the CoreBuilder DomainSet::flows flag and the disabled-combo CI smoke lane required by #4797. Add the CoreBuilder flows flag and wire a disabled-feature CI smoke job that compiles and boots the gate-off configuration.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding a compile-time flows feature gate.
Out of Scope Changes check ✅ Passed The changes stay focused on the flows gate, related tests, docs, and a workflow note, with no unrelated code paths introduced.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

@coderabbitai coderabbitai Bot added feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. labels Jul 15, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b25121bb3d

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/core/all.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (2)
src/openhuman/tools/ops.rs (1)

280-383: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Align runtime flow filtering with every gated tool.

When flows is compiled in but DomainSet::flows is disabled, tool_group only recognizes a subset of these tools. Names such as edit_workflow, validate_workflow, create_workflow, duplicate_flow, list_flow_runs, resume_flow_run, cancel_flow_run, list_connectable_toolkits, list_node_kinds, get_node_kind_contract, and rhai_workflows fall through to DomainGroup::Platform and remain callable.

Add every flow-owned tool to the FLOWS classification list and add a runtime test covering the full registry with flows disabled.

Suggested classification additions
 const FLOWS: &[&str] = &[
+    "edit_workflow",
+    "validate_workflow",
+   +    "get_flow_history",
+    "list_flow_runs",
+    "resume_flow_run",
+    "cancel_flow_run",
+    "create_workflow",
+    "duplicate_flow",
+    "list_connectable_toolkits",
+    "list_node_kinds",
+    "get_node_kind_contract",
+    "rhai_workflows",
 ];

Also applies to: 1097-1121

🤖 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/tools/ops.rs` around lines 280 - 383, Update the runtime flow
classification in tool_group so every flow-owned tool registered under the flows
feature—including edit_workflow, validate_workflow, create_workflow,
duplicate_flow, list_flow_runs, resume_flow_run, cancel_flow_run,
list_connectable_toolkits, list_node_kinds, get_node_kind_contract,
rhai_workflows, and the remaining flow tools—belongs to DomainGroup::Flows
rather than Platform. Add a runtime test that disables DomainSet::flows and
verifies the full registered flow-tool set is classified consistently and cannot
remain callable.
.github/workflows/ci-lite.yml (1)

359-386: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

CI still doesn't run the disabled-feature test suite — only cargo check.

The renamed step continues to run only cargo check (lib target, no --tests) against --no-default-features. New #[cfg(not(feature = "flows"))] tests introduced across this cohort (e.g. flows_controllers_absent_when_feature_off in src/core/all_tests.rs, default_tools_omits_flows_tools_when_feature_off in src/openhuman/tools/ops_tests.rs) — and any #[cfg]-on-expression compile errors in the test files — will never actually run in CI. As per coding guidelines: "Tests that assert the presence of feature-gated domains must be gated with the same Cargo feature. Run the disabled-feature test suite, not only cargo check."

🔧 Proposed addition
       - name: Check core builds with the default domain gates disabled
         run: bash scripts/ci-cancel-aware.sh cargo check --manifest-path Cargo.toml --no-default-features --features tokenjuice-treesitter
+
+      - name: Check disabled-gate test suite compiles and runs
+        run: bash scripts/ci-cancel-aware.sh cargo test --manifest-path Cargo.toml --no-default-features --features tokenjuice-treesitter --lib core::
🤖 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 @.github/workflows/ci-lite.yml around lines 359 - 386, Update the
rust-feature-gate-smoke step’s command to run the disabled-feature test suite,
not only the library build check. Preserve --manifest-path Cargo.toml,
--no-default-features, and --features tokenjuice-treesitter, and invoke the
appropriate cargo test flow so cfg-gated tests such as
flows_controllers_absent_when_feature_off and
default_tools_omits_flows_tools_when_feature_off are compiled and executed.

Source: Coding guidelines

🧹 Nitpick comments (1)
src/core/runtime/services.rs (1)

130-131: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Log the intentionally skipped reconciliation in slim builds.

When flows is disabled, this #[cfg] removes the reconciliation call without emitting any boot diagnostic. Add a stable [flows] debug message, consistent with the subscriber path in src/core/jsonrpc.rs, so operators can distinguish intentional feature omission from a missing or failed reconciliation path.

As per coding guidelines, changed Rust flows should log branches with stable grep-friendly prefixes.
[details]

Proposed change
 #[cfg(feature = "flows")]
 if let Err(e) =
     crate::openhuman::flows::ops::reconcile_schedule_triggers_on_boot(&config).await
 {
     log::warn!(
         "[flows] boot reconciliation of schedule-trigger cron jobs failed: {e}"
     );
 }
+#[cfg(not(feature = "flows"))]
+log::debug!(
+    "[flows] boot schedule-trigger reconciliation SKIPPED — flows feature disabled at compile time"
+);
🤖 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/core/runtime/services.rs` around lines 130 - 131, Update the cfg-gated
reconciliation flow around the `#[cfg(feature = "flows")]` branch to add a
slim-build `#[cfg(not(feature = "flows"))]` debug log with the stable `[flows]`
prefix. Match the existing subscriber-path logging convention in `jsonrpc.rs`,
and ensure the message clearly indicates reconciliation was intentionally
skipped because flows are disabled.

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 `@src/openhuman/agent/harness/definition_tests.rs`:
- Around line 377-381: Update the definition test fixture containing the flow
entries to remove #[cfg] attributes from expressions inside the slice literal.
Build the base entries separately, then conditionally append ("flow_discovery",
50) and ("workflow_builder", 50) through a cfg-controlled Vec/extend path so it
compiles on the pinned stable toolchain.

---

Outside diff comments:
In @.github/workflows/ci-lite.yml:
- Around line 359-386: Update the rust-feature-gate-smoke step’s command to run
the disabled-feature test suite, not only the library build check. Preserve
--manifest-path Cargo.toml, --no-default-features, and --features
tokenjuice-treesitter, and invoke the appropriate cargo test flow so cfg-gated
tests such as flows_controllers_absent_when_feature_off and
default_tools_omits_flows_tools_when_feature_off are compiled and executed.

In `@src/openhuman/tools/ops.rs`:
- Around line 280-383: Update the runtime flow classification in tool_group so
every flow-owned tool registered under the flows feature—including
edit_workflow, validate_workflow, create_workflow, duplicate_flow,
list_flow_runs, resume_flow_run, cancel_flow_run, list_connectable_toolkits,
list_node_kinds, get_node_kind_contract, rhai_workflows, and the remaining flow
tools—belongs to DomainGroup::Flows rather than Platform. Add a runtime test
that disables DomainSet::flows and verifies the full registered flow-tool set is
classified consistently and cannot remain callable.

---

Nitpick comments:
In `@src/core/runtime/services.rs`:
- Around line 130-131: Update the cfg-gated reconciliation flow around the
`#[cfg(feature = "flows")]` branch to add a slim-build `#[cfg(not(feature =
"flows"))]` debug log with the stable `[flows]` prefix. Match the existing
subscriber-path logging convention in `jsonrpc.rs`, and ensure the message
clearly indicates reconciliation was intentionally skipped because flows are
disabled.
🪄 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: 475a2ff6-040e-45ca-a431-a609b0c8e9f9

📥 Commits

Reviewing files that changed from the base of the PR and between 2dcaaba and b25121b.

📒 Files selected for processing (16)
  • .github/workflows/ci-lite.yml
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/core/all.rs
  • src/core/all_tests.rs
  • src/core/jsonrpc.rs
  • src/core/jsonrpc_tests.rs
  • src/core/runtime/services.rs
  • src/openhuman/agent/harness/builtin_definitions.rs
  • src/openhuman/agent/harness/definition_tests.rs
  • src/openhuman/agent_registry/agents/loader.rs
  • src/openhuman/mod.rs
  • src/openhuman/tools/mod.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs

Comment thread src/openhuman/agent/harness/definition_tests.rs
oxoxDev and others added 3 commits July 15, 2026 20:16
…ture-gate

# Conflicts:
#	.github/workflows/ci-lite.yml
#	AGENTS.md
#	Cargo.toml
#	app/src-tauri/Cargo.toml
…inyhumansai#4797)

The flows controllers are cfg-gated out of the slim build (src/core/all.rs),
so openhuman.flows_* become unknown JSON-RPC methods there. The eight flows
cases in tests/json_rpc_e2e.rs called them unconditionally and asserted
success, which would fail once the target compiles in the slim direction.

Gate the eight tests plus their four flows-only helpers so the disabled-build
suite skips them. Verified with voice on / flows off (isolating the
pre-existing voice test_seam gap tracked in tinyhumansai#4916):
  cargo check --no-default-features --features tokenjuice-treesitter,voice --test json_rpc_e2e
-> 0 errors, no unused-helper warnings. Default build unchanged.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 26ee61d665

ℹ️ 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".

Comment thread src/openhuman/tools/ops.rs
oxoxDev and others added 2 commits July 16, 2026 12:30
The runtime DomainSet post-filter (tinyhumansai#4796) uses tool_group() to drop tools
whose DomainGroup is disabled. The FLOWS classification list was missing 12
flow-owned tools (edit_workflow, validate_workflow, get_flow_history,
list_flow_runs, resume_flow_run, cancel_flow_run, create_workflow,
duplicate_flow, list_connectable_toolkits, list_node_kinds,
get_node_kind_contract, rhai_workflows), so with the flows feature compiled
in but DomainSet::flows disabled at runtime they fell through to Platform and
stayed callable — leaking the flows surface past the runtime gate.

List every flow-owned tool explicitly (now the same 26 names as the
compile-time #[cfg(feature = "flows")] registrations and
default_tools_omits_flows_tools_when_feature_off) and add a regression loop to
tool_group_classifies_gate_and_harness_families.
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer review changes (1 commit pushed, 3717f309d):

src/openhuman/tools/ops.rstool_group() FLOWS classification list.
Extended the FLOWS const from 14 to all 26 flow-owned tool names. It was missing edit_workflow, validate_workflow, get_flow_history, list_flow_runs, resume_flow_run, cancel_flow_run, create_workflow, duplicate_flow, list_connectable_toolkits, list_node_kinds, get_node_kind_contract, and rhai_workflows. Flows has no clean tool-name prefix (unlike wallet_/web3_/media_/mcp_), so any flow tool not in this exact list falls through to DomainGroup::Platform and stays callable under a custom DomainSet { platform: true, flows: false } — leaking the flows surface past the runtime DomainSet gate (#4796). This is orthogonal to (and complements) the compile-time gate this PR adds: when flows is compiled out the tools don't exist, but with it compiled in + runtime-disabled they were previously classified as Platform. The list now mirrors the #[cfg(feature = \"flows\")] registrations and default_tools_omits_flows_tools_when_feature_off. Verified each name against the tools' fn name() (builder_tools.rs, rhai_workflows/tools.rs).

src/openhuman/tools/ops_tests.rs — regression guard.
Replaced the two-name spot-check in tool_group_classifies_gate_and_harness_families with a loop asserting every one of the 26 flow tools classifies as DomainGroup::Flows, so a future flow tool added without a FLOWS entry fails the test instead of silently leaking.

Addresses the CodeRabbit "Align runtime flow filtering with every gated tool" comment. Replies to the other two CodeRabbit comments below.

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

@coderabbitai Declining the Critical inline comment on definition_tests.rs:377-381 ("#[cfg] inside the slice literal … won't compile on the pinned stable toolchain") — it's a false positive.

#[cfg] and #[cfg_attr] are special-cased: they are cfg-stripped during early expansion, before the stmt_expr_attributes gate applies, so they are accepted on stable in positions where arbitrary expression attributes are not — including array/slice-literal elements, match arms, struct-expr fields, and fn params. The web-search result the analysis leaned on is about the general stmt_expr_attributes feature (arbitrary attrs on expressions), which does not govern #[cfg] on element expressions.

Two independent proofs:

  1. CI already compiled it. Rust Quality (fmt, clippy), Rust Core Coverage, and Rust Tauri Coverage are all green on this PR. Those lanes compile the test targets with default features (flows ON), i.e. with these #[cfg(feature = \"flows\")] elements included in the literal. If the pattern didn't compile on the pinned toolchain, those lanes would have failed at compile time.
  2. Standalone rustc 1.97.0 (the pinned stable) compiles the exact pattern — both a &[(&str, usize)] slice literal and a for x in [ … ] array literal with a #[cfg]-gated element — with the feature off and on. No #![feature(stmt_expr_attributes)] required.

Same reasoning covers the sibling occurrences in builtin_definitions.rs, loader.rs, and all_tests.rs. Leaving these as-is.

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

@coderabbitai Re: the ci-lite.yml comment ("CI still doesn't run the disabled-feature test suite — only cargo check") — the gap is real and is even called out explicitly in this PR's own AGENTS.md addition ("Testing gotcha (applies to every gate)"). But I'm deferring the CI change to a dedicated infra PR rather than bundling it here, for three reasons:

  1. Scope + attribution. This is a compile-time feature-gate PR. Turning on cargo test --no-default-features in CI is a cross-cutting lane change that affects every existing gate (voice/web3/media), not just flows. If it surfaces a pre-existing broken disabled-build test (which has never run in CI before), that failure would be unrelated to this PR and shouldn't block/blame it.
  2. The suggested command is incomplete. --lib … core:: only runs core::* tests; it would not execute default_tools_omits_flows_tools_when_feature_off (which lives in openhuman::tools::ops_tests). A correct lane needs a broader filter, which is exactly the kind of thing that deserves its own reviewed PR.
  3. The new #[cfg(not(feature = \"flows\"))] tests were validated locally per the AGENTS.md instruction (cargo test --no-default-features --features tokenjuice-treesitter); they're not unverified.

Tracking this as a follow-up: add a disabled-feature test lane (covering all gates, correct filter) to ci-lite.yml in a standalone infra PR. Not blocking this one.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🤖 web_search executed:

Rust #[cfg] attribute on array literal element stable without stmt_expr_attributes feature

Length of output: 13248


This confirms the maintainer's technical claim: rust-lang/rust#32796 explicitly documents [1, #[cfg(unix)] 2, 3] being accepted on stable without any feature flag, since #[cfg]/#[cfg_attr] are stripped during early expansion, ahead of the stmt_expr_attributes gate that governs arbitrary expression attributes. Combined with the CI-green evidence, this is solid confirmation.

@M3gA-Mind Confirmed — you're right, and I've withdrawn that comment. Verified via rust-lang/rust#32796, which explicitly documents that [1, #[cfg(unix)] 2, 3] is accepted on stable with no feature flag, since #[cfg]/#[cfg_attr] are special-cased and stripped during early expansion, ahead of the stmt_expr_attributes gate that governs arbitrary attributes on expressions. That gate only applies to attributes other than cfg/cfg_attr in expression position, so the slice-literal, match-arm, and struct-field-expr cases you cited are all fine on stable.

Combined with your CI-green evidence and the standalone rustc 1.97.0 verification, this confirms the original flag was a false positive. Thanks for the thorough writeup — noting this for future reviews so I don't raise it again for the sibling occurrences or similar patterns.

(=^・ω・^=) ノ” confirmed and noted for next time


✏️ Learnings added
Learnt from: M3gA-Mind
URL: https://github.com/tinyhumansai/openhuman/pull/4912

Timestamp: 2026-07-16T08:29:50.636Z
Learning: In Rust, `#[cfg(...)]` and `#[cfg_attr(...)]` attributes are special-cased and stripped during early macro expansion, before the `stmt_expr_attributes` feature gate (which governs arbitrary attributes on expressions) applies. This means `#[cfg(feature = "...")]` on elements of array/slice literals, match arms, struct-expr fields, and fn params compiles fine on stable Rust without requiring `#![feature(stmt_expr_attributes)]`. Reference: https://github.com/rust-lang/rust/issues/32796. Do not flag `#[cfg(...)]` inside array/slice literal elements as requiring nightly/unstable features.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
AGENTS.md (1)

251-251: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Run the disabled-feature tools test in the documented check.

The core:: filter excludes default_tools_omits_flows_tools_when_feature_off in src/openhuman/tools/ops_tests.rs. Add an explicit invocation for that test, or remove the filter so the documented disabled-build validation actually covers flow tool omission.

Proposed change
 Run `GGML_NATIVE=OFF cargo test --lib --no-default-features --features tokenjuice-treesitter core::` locally before pushing any gate change.
+Also run `GGML_NATIVE=OFF cargo test --lib --no-default-features --features tokenjuice-treesitter default_tools_omits_flows_tools_when_feature_off`.
🤖 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 `@AGENTS.md` at line 251, Update the documented disabled-build validation
command to execute default_tools_omits_flows_tools_when_feature_off in
src/openhuman/tools/ops_tests.rs, either by adding an explicit invocation
alongside the existing core:: check or by removing the restrictive filter. Keep
the command’s other feature and environment settings unchanged.

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.

Outside diff comments:
In `@AGENTS.md`:
- Line 251: Update the documented disabled-build validation command to execute
default_tools_omits_flows_tools_when_feature_off in
src/openhuman/tools/ops_tests.rs, either by adding an explicit invocation
alongside the existing core:: check or by removing the restrictive filter. Keep
the command’s other feature and environment settings unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 31a221c9-261b-402b-a40e-82d15923ad68

📥 Commits

Reviewing files that changed from the base of the PR and between f14c34b and 3717f30.

📒 Files selected for processing (10)
  • .github/workflows/ci-lite.yml
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/core/all_tests.rs
  • src/core/jsonrpc_tests.rs
  • src/openhuman/agent_registry/agents/loader.rs
  • src/openhuman/tools/mod.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs
🚧 Files skipped from review as they are similar to previous changes (7)
  • .github/workflows/ci-lite.yml
  • app/src-tauri/Cargo.toml
  • src/core/jsonrpc_tests.rs
  • Cargo.toml
  • src/openhuman/agent_registry/agents/loader.rs
  • src/core/all_tests.rs
  • src/openhuman/tools/mod.rs

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 16, 2026
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

@M3gA-Mind, that's a reasonable call. Bundling a cross-cutting CI lane change (affecting voice/web3/media too) into a feature-gate PR does risk conflating unrelated failures with this PR's scope, and your point about the incomplete --lib … core:: filter is fair — a correct lane does need broader coverage (including openhuman::tools::ops_tests).

Not blocking this PR on it. Would you like me to open a follow-up GitHub issue to track adding the disabled-feature test lane to ci-lite.yml (covering all gates, with a correct test filter)? I can link back to this PR and comment thread if so.

✅ Action performed

Comments resolved and changes approved.

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer sync: merged current main (includes #4949, the fix for the red-main typecheck failure tracked in #4948 — the two ToolTimelineEntry fixtures in Conversations.render.test.tsx now carry the required seq property #4945 introduced). The Frontend Checks failure on this PR was inherited from main and not caused by this PR's changes. Merge was clean with no conflicts (this is a Rust feature-gate PR; the only frontend-touching change came straight from main's fix). No other changes.

# Conflicts:
#	AGENTS.md
#	Cargo.toml
#	app/src-tauri/Cargo.toml
#	src/core/all_tests.rs
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer conflict resolution: merged current main (now includes #4915, the meet gate #4800). All conflicts were the expected mechanical drift between sibling feature-gate PRs in the #4797#4800 series — each gate edits the same shared registration sites — and every one resolved to the union of both gates.

Cargo.toml (2 hunks) — (a) [features] default list: kept both new gates → ["tokenjuice-treesitter", "voice", "web3", "media", "meet", "flows"]; (b) feature definitions: kept both the flows = ["dep:tinyflows", "tinyagents/repl"] block (this PR) and the meet = [] block (main), with their full comment blocks.

app/src-tauri/Cargo.toml — forwarded-features list: kept both "flows" and "meet" (alongside the existing media/voice/tokenjuice-treesitter/web3), so both gates ship in the desktop app.

AGENTS.md (2 hunks) — (a) gate table: kept both the meet and flows rows; (b) prose: kept both the meet gate section (three-pattern writeup + wav carve-out) and the flows leaf-gate section (+ scope/testing notes).

src/core/all_tests.rs — the two sides had inserted their directional gate tests at the same spot and the auto-merge had collapsed the trailing braces. Restored both complete pairs: flows_controllers_registered/absent_when_feature_{on,off} and meet_controllers_registered/absent_when_feature_{on,off}, each with its own closing brace.

Auto-merged cleanly (no conflict): src/core/all.rs (both DomainGroup::Flows and DomainGroup::Meet registrations present, each #[cfg]-gated) and src/openhuman/mod.rs.

Semantic check: the two gates are independent domains and share no symbols. The flows gate is a leaf-gate with no stub.rs (verified: no flows/tinyflows/rhai_workflows stub files), so the sibling-stub-private-const trap (#4914) does not apply; meet's agent_meetings/stub.rs came from main already-green. No cross-gate assumption is invalidated. No AI attribution on the merge commit.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 16, 2026
…conflicts

Both sibling gates append their feature to the default set and add docs;
kept both: default now includes skills (from tinyhumansai#4913, merged) and flows (this PR).
AGENTS.md feature table + gate-pattern docs keep both the skills and flows sections.
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer sync: merged current main to resolve conflicts introduced when sibling gate #4913 (skills) merged.

Conflicts resolved (kept both sides — the two gates are additive, not competing):

  • Cargo.toml [features].default: now […, "meet", "skills", "flows"] — kept main's skills and this PR's flows.
  • AGENTS.md: kept both the skills and flows rows in the feature table, and both the skills gate-pattern doc block and this PR's flows leaf-gate doc block.

All Rust registration sites (tools/ops.rs, agent_registry/agents/loader.rs, src/core/all.rs, src/openhuman/mod.rs) auto-merged cleanly; verified no skills registrations from main were dropped and all flows cfg gates are intact. No code behavior changed — this is a pure conflict resolution. Letting CI re-run on the merged head.

@M3gA-Mind M3gA-Mind left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving — both conditions genuinely met, on the re-synced head.

CI: fully green — 19/19 lanes pass, zero pending, zero failing. Includes Rust Quality (fmt, clippy), Rust Feature-Gate Smoke (gates off), Rust Core Coverage, Rust Tauri Coverage, Frontend Checks, Test Inventory, and PR CI Gate.

Review state: no CHANGES_REQUESTED; CodeRabbit's earlier block is cleared.

Verified beyond CI:

  • A real defect was found and fixed here, not just a rubber stamp. CodeRabbit's "align runtime flow filtering with every gated tool" was correct: the runtime FLOWS list was incomplete, so ~26 flow tools (list_flow_runs, resume_flow_run, create_workflow, rhai_workflows, …) fell through to DomainGroup::Platform and stayed callable under DomainSet { platform: true, flows: false } — leaking the surface past the runtime gate. Each name was verified against the tools' actual fn name(), and ops_tests.rs now loops over all 26 as a regression guard rather than spot-checking two.
  • CodeRabbit's "#[cfg] in a slice literal won't compile on stable" (raised as Critical) was correctly declined as a false positive, with proof: #[cfg] is cfg-stripped before the stmt_expr_attributes gate, so it is stable on array/slice-literal elements — demonstrated both by the already-green Rust lanes compiling these files and by standalone rustc 1.97.0 (the pinned toolchain).
  • The "CI doesn't run the disabled-feature test suite" item was deferred with reason to a dedicated infra PR — it is a cross-cutting lane change affecting every gate, and the suggested core:: filter would not even run the new ops_tests test.
  • Re-synced onto current main (now includes #4913's skills gate and #4915's meet gate); conflicts resolved to the union — every gate's rows, feature lines, and registration entries retained.

Leaf-gate design is right: registration sites want absence, not a stub that registers a controller returning "flows disabled" — that would make flows.* a known method failing at runtime, the opposite of the intended unknown-method behaviour.

Not merging — that is the maintainer's call.

@M3gA-Mind

M3gA-Mind commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

@coderabbitai full review

Requesting a full re-review of the current head (73b3493a9). Your earlier reviews on this PR were dismissed by subsequent pushes, so the standing state does not reflect the tree.

What has changed since your last look:

  • Your "align runtime flow filtering with every gated tool" finding was correct and is fixed. The runtime FLOWS list was incomplete, so ~26 flow tools fell through to DomainGroup::Platform and stayed callable under DomainSet { platform: true, flows: false }. All 26 are now classified, and ops_tests.rs loops over the full set as a regression guard instead of spot-checking two.
  • Your "#[cfg] in a slice literal won't compile on stable" (Critical) was declined as a false positive, with reasoning posted in-thread: #[cfg] is cfg-stripped before the stmt_expr_attributes gate, so it is stable on array/slice-literal elements. Verified against the pinned rustc 1.97.0 and by the Rust lanes compiling these files green. Happy to be shown otherwise if you disagree.
  • Your "CI doesn't run the disabled-feature test suite" (Major) was deferred, not dismissed — it is a cross-cutting lane change affecting every gate, and the suggested core:: filter would not run the new ops_tests test. Tracked for a dedicated infra PR.
  • The branch has been re-synced onto current main (now including feat(core): compile-time skills feature gate (#4798) #4913's skills gate and feat(core): compile-time meet feature gate (#4800) #4915's meet gate); the resulting conflicts were resolved to the union across Cargo.toml, AGENTS.md, src/core/all.rs, and src/openhuman/tools/ops.rs.

All 19 CI lanes are green on this head, including Rust Feature-Gate Smoke (gates off).

@M3gA-Mind
M3gA-Mind merged commit b625d73 into tinyhumansai:main Jul 16, 2026
19 checks passed
M3gA-Mind added a commit to oxoxDev/openhuman that referenced this pull request Jul 16, 2026
…ate conflicts

tinyhumansai#4912 (flows) merged into main since the last sync, re-introducing sibling
drift. Kept all gates (additive, not competing):
- Cargo.toml [features].default: [..., "meet", "skills", "flows", "mcp"]
- AGENTS.md: kept skills + flows + mcp feature-table rows and the flows
  leaf-gate doc block alongside this PR's mcp gate section
- src/core/all_tests.rs: kept BOTH the mcp directional-gate tests
  (registered/absent) and main's flows directional-gate tests
  (registered/absent) — the conflict fused their shared trailing braces
- app/src-tauri/Cargo.toml auto-merged: forwards all 8 gates incl. flows + mcp
M3gA-Mind added a commit to M3gA-Mind/openhuman that referenced this pull request Jul 17, 2026
… feature

The tinyhumansai#4912 flows gate (merged after this branch was cut) put
`openhuman::tinyflows` behind `#[cfg(feature = "flows")]`, so the
gates-off build could not compile contract_gate.rs's unconditional
`tinyflows::caps` import (E0433 in the "Rust Feature-Gate Smoke (gates
off)" lane).

The contract gate's live-catalog lookup is sourced entirely from the
flows/tinyflows caps layer. With flows compiled out there is no catalog
source, so the gate simply has no fuller contract to surface and always
proceeds (the per-action Composio tool still runs; it just loses the
pre-execute contract nudge). Guard the import and the lookup/format
helpers on `feature = "flows"` in lockstep, restructure `consult` to
Proceed when the feature is off, and gate the flows-seeding unit tests
(contract_gate_tests.rs + the action_tool retry test) on the same
feature. No behavior change in the default (flows-on) build.
senamakel added a commit to M3gA-Mind/openhuman that referenced this pull request Jul 18, 2026
…humansai#4912)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
Co-authored-by: M3gA-Mind <elvin@tinyhumans.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(core): feature gate — flows/workflows

3 participants