Skip to content

refactor(cron): move the scheduler-gate decision into tinymemory-api - #6807

Merged
senamakel merged 77 commits into
tinyhumansai:mainfrom
senamakel:vendor-extract-w3-leftovers
Sep 30, 2026
Merged

senamakel merged 77 commits into
tinyhumansai:mainfrom
senamakel:vendor-extract-w3-leftovers

Conversation

@senamakel

@senamakel senamakel commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Summary

This is part of the Wave 3 leftovers. It moves the pure scheduler-gate decide function into tinymemory-api, next to the types it operates on. Net change: −380 lines (24 added, 404 deleted).

Scheduler gate decide → tinymemory_api::host (tinymemory#172)

Evaluated and not moved

  • platform/cost/catalog.rs: it is OpenHuman's routed-model table. It is tied to ModelRegistryEntry, includes a product special case (tiered minimax-m3 pricing), and would have to be reconciled with tinyagents-registry's own seed table without changing any cost numbers.
  • platform/proc_metrics: it samples host-process RSS/PSS for the rss-bench and library_profile bins. No vendor crate is a clear owner.
  • repeated_failure.rs: the generic escalation ladder is already upstream (NoProgressTracker). What remains is OpenHuman's recovery-policy table and its host markers.
  • security/{pii,prompt_injection}: pure code, but documented as application threat-model policy, so it stays.

Verification

  • cargo check --tests -p openhuman -p openhuman-cli --features "$(bash scripts/ci/product-features.sh)" is clean, as are the app manifest and embed/tinyhumans.
  • Full lib suite: 9884 passed, 1 failed (the known goals test).
  • tinymemory-api: 128 tests pass, 24 of them for the scheduler gate. fmt and clippy -D warnings are clean.
  • CI scripts: check-submodule-monotonic (tinymemory moved forward), check-feature-forwarding and check-gated-test-allowlist pass. check-module-pins passes tinymemory through its updated exemption.

Failures that are already on main

These reproduce on main, and every one of them was also checked at an earlier baseline:

  • Lib suite: agent::goals::tools::tests::set_persists_to_the_workspace_store_and_answers_goal_and_text, fixed in test(goals): read structured goal tool results via output() #6803.
  • raw_coverage_all: the MCP test tool_registry_entries_include_connected_mcp_client_tools.
  • agent_harness_e2e: orchestrator_advertises_direct_mcp_tools, orchestrator_cannot_install_a_skill_through_the_raw_registry_tool and orchestrator_hands_skill_installs_to_skill_setup_directly. These fail identically at e80051674e, the test: drop 45 quarantined raw-coverage files, dedupe vendor-covered tests, repoint vendor pins #6781 merge, which is before any of the vendor-extraction PRs.
  • rust:layout: runtime_session.rs is 1994 lines against a limit of 1990. openhuman_backend_model{,_tests}.rs are 759 and 761 against 750.
  • check-agent-runtime-boundary: the existing violations in openhuman_backend_model.rs, json_schema/ops.rs and tools/impl/meta/mod.rs.
  • check-module-pins: tinychannels.

Summary by CodeRabbit

  • Refactor
    • Scheduler pause and resume behavior remains unchanged, including how power, CPU usage, and operating mode affect scheduling.
    • Signal sampling continues to provide the information used for scheduler decisions.
  • Documentation
    • Updated scheduler-gate documentation to reflect where policy decisions and signal types are defined.

M3gA-Mind and others added 30 commits September 30, 2026 14:59
…deck

useUnroutedApprovals treated a polled pending row as unrouted whenever
its request_id was not *currently* in pendingApprovalByThread. Deciding
from a chat card clears that entry at once, while the polled rows keep
the park until the next poll (up to 15 s), so the answered park was
rendered again above the composer and its decide failed with
"already decided or expired".

Remember every request id a chat card has shown and keep excluding it:
a chat-owned park is never unrouted.

Closes tinyhumansai#6799
Updated the pinned commit for the tinyagents subproject to include the latest changes from its upstream repository.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commits for the tinyagents, tinybox, and tinyflows vendored dependencies to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commits for the tinybox and tinyvoice vendor dependencies to their latest versions.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit for the tinymemory vendored dependency to incorporate upstream fixes or improvements.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit for the tinymemory vendored dependency to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commits for the tinyagents and tinyvoice vendor dependencies to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commits for the tinychannels and tinymemory vendor submodules to their latest versions.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit of the tinyjuice vendored dependency to incorporate upstream fixes or improvements.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the tinymcp submodule to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit for the tinymemory vendored dependency to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the lock file to reflect upgraded versions of tinytools, wacore, waproto, and whatsapp-rust crates, along with the addition of new dependencies such as bon, buffa, and compact_str. The arrayref and typed-builder crates have been removed as they are no longer required.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the tinyconnectors vendored dependency to incorporate upstream fixes or improvements.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Record the instant when a file read operation starts and pass it to the file state recording function, enabling future tracking of read duration. Also update the network tools to extract the validated URL from the new structured validation result instead of returning the entire object, ensuring downstream code receives the expected string type.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit for the tinyruntime vendored dependency to include recent upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Advance the pinned commits for the tinydocs and tinyruntime vendor submodules to incorporate upstream fixes and improvements.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the vendor/tinycomputer subproject to include recent changes, as indicated by the new commit hash.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test was calling `res.text()` to retrieve the response body for error reporting and JSON parsing, but the correct method for accessing the response output is `output()`. This change fixes the test to use the proper accessor, ensuring the assertion message and payload parsing work correctly.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
This change adds the tinycomputer library as a vendored dependency to ensure consistent builds and avoid reliance on external package availability during development and deployment.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the vendored tinysearch dependency to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit of the tinyskills vendor dependency to include recent changes. The submodule now points to a dirty commit reflecting local modifications.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the pinned commit for the tinyskills vendor dependency to a newer revision, incorporating upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the vendor/tinyhosts submodule to a newer revision, incorporating upstream changes from the dependency.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Updated the pinned commit for the tinymemory vendored dependency to include recent changes. The new commit hash reflects the latest upstream state, ensuring the project uses an up-to-date version of the library.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
…eToolCall

Removed the locally defined ToolCall struct from the provider types module and replaced all usages with the NativeToolCall type from the tinytools_agent dialect crate. This eliminates duplicated type definitions and aligns the codebase with the shared tool-call representation used across the agent system, reducing maintenance overhead and ensuring consistent serialization behavior.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a new scheduler gate module that provides policy-based access control and signal handling for the cron subsystem. The gate enforces scheduling policies and manages signal propagation, enabling more flexible and secure cron job management.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
…pi decision logic

The README now reflects that the `Policy` and `Signals` types live in the vendored `tinymemory-api` crate rather than local modules, and the import order in `gate.rs` is adjusted accordingly. The CI pin-exemption entry is updated to cover the new `host::scheduler_gate_decide` module added on top of the existing v1.17.0 pin.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Removed a duplicate `reason` field from the tinymemory module pin exemption entry in the module-pin-exemptions.json file. The entry had two identical reason strings explaining why the pin was acceptable, and the second one was redundant.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Removed a trailing comma from the reason field in the tinymemory exemption entry to fix a JSON formatting inconsistency.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
@tinysweeper tinysweeper Bot added the priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later. label Sep 30, 2026
senamakel and others added 27 commits September 30, 2026 16:38
…red-result

test(goals): read structured goal tool results via output()
refactor(tools): move the filesystem tools into tinytools-std behind an FsGate seam
Updated the pinned commit for the tinyagents vendored subproject to incorporate upstream changes.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
…l-card

fix(approvals): keep an answered chat approval out of the background deck
…ments

Update the lockfile to reflect bumped crate versions across the workspace, including tinybox-core, tinybox-jail, tinychannels, and several others, along with a shift from windows-sys 0.60.2 to 0.61.2 for multiple dependencies. A downgrade of windows-core from 0.62.2 to 0.58.0 and itertools from 0.14.0 to 0.13.0 is also applied, and tinychannels-runtime gains a new thiserror dependency.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The harness context ladder module was inadvertently removed during a previous refactor, breaking the agent's ability to manage context progression. This change restores the module and its integration with the ops module, ensuring the agent can correctly handle context ladder operations.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
…e for wrap-up detection

The wrap-up fired flag was previously stored as a raw `AtomicBool`, which made it impossible to correlate the flag with the specific run instance that set it. This change replaces the `AtomicBool` with a `FinalCallWrapUpMiddleware` that tracks the run instance ID, and passes the instance ID through to `finalize_turn_outcome` so it can check whether the wrap-up was fired for the correct run rather than using a global atomic load.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Reordered import statements in 33 files to follow the convention of grouping external crate imports before internal crate imports, and moved `#[cfg(test)]` attributes to appear directly before the items they guard. This is a purely cosmetic change that standardises import ordering without altering any runtime behaviour.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update several internal crates to their latest versions, including tinytools from 0.4.1 to 0.5.0 and its dependent crates, along with various windows-sys dependency adjustments. Also add fs2 and tokio dependencies to tinybox-core and update base64 from 0.22.1 to 0.23.1 across tinychannels crates.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Several functions in the audio capture, always-on capture, and hotkey listener modules were returning non-string error types that could not be propagated through the existing `Result<_, String>` signatures. This change wraps those errors with `.map_err(|e| e.to_string())` so that all error paths consistently produce a human-readable string, matching the expected interface and preventing compilation failures when the underlying library changes its error type.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Co-authored-by: Medulla <medulla@tinyhumans.ai>
chore(vendor): repoint all vendor modules to their merged upstream main
park_for_approval turned GateOutcome::Deny into Prompted { approved: false },
which carries no reason, so the harness told the model only "tool call was
not approved". After a Deny the model asked the user to approve again, or
reached the same result through shell.

The GateOutcome -> GateDecision mapping moves into decision_for_outcome. A
refusal is now a Deny whose text names no human and no timeout and rules out
other routes. Approvals and the audit id are unchanged; the middleware path
and the gate's own reason text are untouched.

Closes tinyhumansai#6808
gate_decision allows every command class while [autonomy] enabled = false,
the default; it is not tied to the full tier.
…lass

The [policy-denied] marker classifies as a policy failure with a zero
recovery budget in repeated_failure, which pauses the turn before the model
can answer. approval_gate_deny_flow and approval_gate_timeout caught it: the
turn ended with the no-progress summary instead of the model's reply. The
unmarked text classifies as Unknown, as the harness fallback did, so the
model gets the reason and still answers this turn.
…ason

approval_gate_deny_flow and approval_gate_timeout checked only the turn's
final text, which a scripted model produces whatever it was sent. They now
also assert the follow-up request carries the gate's refusal and not the
reason-less "tool call was not approved" fallback.
…et its pins

- Warn band: files past 725 lines are listed (without failing) so the
  margin shows in the author's own PR log.
- Scope: drop the name-based prune of `api`/`bin`/`core`/`lib.rs`/`main.rs`/
  `rpc` at the top of `crates/openhuman-core/src`. Only `core/` and `lib.rs`
  still exist; the eight oversized `core/` files are pinned at their current
  size instead of being skipped.
- Ratchet: a pinned file below its pin fails with the value to lower it to, or
  asks for the entry to be removed once it fits the 750-line limit. Pins are
  lowered to today's sizes and the three that already fit are removed.
- Duplicate pins: `subagent_host/lifecycle.rs` (1304, 1318) and
  `subagent_host/ops/runner.rs` (1793 twice) were each listed twice; a Map
  keeps the last one. Each is now listed once and the gate fails on a repeat.

Closes tinyhumansai#6310
…umansai#6313)

mcp_registry_list_tools reported every failure as "not connected; connect
it first via mcp_clients_connect". Three things were wrong with that:

- mcp_clients_connect is an RPC method. An agent's connect tool is
  mcp_registry_connect, so the remedy was an instruction the model could
  not follow.
- tinymcp answers NotConnected for any id without a live connection, so a
  registry qualified name passed as server_id, or an id that was never
  installed, was reported as "not connected" too. The model then tried to
  connect a server that was already connected, or did not exist.
- Every other error class was discarded in favour of the same text.

On NotConnected, read the installs back through status(). An installed id
reports its real status and last error. A qualified name installed once
resolves to that install's server_id. An unknown id is refused as unknown
and points at the status call. The remedy is chosen by caller: the agent
tool names mcp_registry_connect/mcp_registry_status, while the RPC keeps
mcp_clients_*. Any other error passes through verbatim.

The host-side read-back works around a tinymcp defect (list_tools does not
distinguish UnknownServer from NotConnected); filed as tinyhumansai#6815.

Closes tinyhumansai#6313
tinyhumansai#6313)

The tinyhumansai#6313 case itself: the server is connected and the caller passes its
registry qualified name. Served by OpenHuman's own MCP endpoint on an
ephemeral loopback port, so nothing leaves the machine. On the unfixed
code it fails with the reported message: "is not connected; connect it
first via mcp_clients_connect".
…nsai#6313)

The read-only planner carries mcp_registry_list_tools and
mcp_registry_status but not mcp_registry_connect, so naming the connect
tool in an agent refusal repeated tinyhumansai#6313 for the planner: an instruction
it cannot follow. The agent refusal now says the server has to be
connected and names only mcp_registry_status, which every belt that
lists tools carries. The RPC surface still names mcp_clients_connect.

refusals_name_only_tools_on_every_listing_belt pins this against the
built-in agent definitions: every mcp_* name an agent refusal contains
must be on the belt of every agent with mcp_registry_list_tools. With
the connect tool put back it fails for the planner.
…-messages

refactor(agent): adopt tinytools NativeToolCall in place of the host ToolCall shim
…l fix)

Picks up tinyhumansai/tinyskills#15: a catalog GitHub blob sourceUrl
naming any .md other than SKILL.md now resolves to the SKILL.md in the
same directory instead of installing that file.

Gitlink-only; tinyskills stays 0.2.4 with no dependency change, so
neither Cargo.lock changes.

Closes tinyhumansai#6309
…s-6313

fix(mcp): make list_tools refusals name what the caller can do (tinyhumansai#6313)
…ills-6309

chore(vendor): bump tinyskills to d59fdd6 (non-SKILL.md blob sourceUrl fix)
fix(ci): make the Rust layout gate warn early, cover core/, and ratchet its pins
…eaches-model

fix(security_gate): give a refused approval a reason the model can read
…main

Co-authored-by: Medulla <medulla@tinyhumans.ai>
@senamakel
senamakel merged commit d80ca12 into tinyhumansai:main Sep 30, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

priority: p2 Soon. Real but survivable — a rough edge, a gap, a thing that will bite later.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants