12 KiB
TinyAgents Drift Ledger (Phase 0)
Purpose. The TinyAgents migration spans inference, tools, and
agent_orchestration, while the OpenHuman host will keep evolving. This ledger
records the baseline used for the port plan and tracks which host-side drift must
be upstreamed, retained, or deleted before each phase cuts over.
- DRIFT -> tinyagents PR - generic engine behavior absent from the crate; port upstream before deleting the host copy.
- HOST-OWNED - OpenHuman product policy, RPC, config, credentials, UI, local runtime, or integration glue. No upstream action.
- CONSOLIDATE / DELETE - duplicate host implementation already covered by TinyAgents primitives; delete only after the seam proves the crate-backed path.
- CLOSED - resolved by a submodule/version bump or a completed cutover.
Gate rule: no phase deletes host code until every open row for that phase is either upstreamed and bumped, reclassified host-owned, or covered by a crate-backed seam test.
Anchors
| Thing | Value |
|---|---|
| Host repo | tinyhumansai/openhuman |
| Host branch | docs/tinyagents-port-plan |
| Host audit base | 42ce5c0e9 (origin/main, 2026-07-04) |
| Plan commit | 24f200e49 (docs: TinyAgents port plan) |
| TinyAgents submodule | vendor/tinyagents -> tinyhumansai/tinyagents |
| Phase 0 target | v1.6.0 / e72036d847b589044aa9a4add1b34544b92a293d |
| Current host pin | v1.7.1 / 3e81e493 |
Baseline Snapshot
Recorded from docs/tinyagents-port-plan after the Phase 0 version alignment
work started. Counts include Rust files only.
| Host module | Rust files | LOC | Test fns | Plan disposition |
|---|---|---|---|---|
src/openhuman/inference/ |
116 | 53,023 | 1,101 | Provider consolidation and small generic ports |
src/openhuman/tools/ |
94 | 38,553 | 877 | Tool model reconciliation, then builtin family ports |
src/openhuman/agent_orchestration/ |
64 | 25,769 | 262 | Sub-agent lifecycle consolidation onto TinyAgents graph/orchestration |
src/openhuman/tinyagents/ |
25 | 15,219 | 101 | Host seam; shrinks but remains OpenHuman-owned |
Phase 0 Drift Rows
| # | Area | Status | Evidence / action |
|---|---|---|---|
| P0-1 | Version skew: host required tinyagents = 1.5.0 while the intended engine baseline was v1.6.0 |
CLOSED | Phase 0 first aligned the host to v1.6.0; the current Phase 1 host pin is now v1.7.1 in root Cargo.toml, both lockfiles, and vendor/tinyagents (3e81e493). |
| P0-2 | ToolCompleted outcome was reconstructed through OpenHuman's ToolFailureMap side channel |
CLOSED | src/openhuman/tinyagents/observability.rs consumes TinyAgents 1.6 duration_ms, output_bytes, and error; ToolFailureMap now only preserves OpenHuman's richer classified failure and legacy fallback fields. |
| P0-3 | TinyAgents 1.6 event constructor shape changed for local observability tests | CLOSED | Local constructors in src/openhuman/tinyagents/observability.rs include ModelCompleted.started_at_ms and the expanded ToolCompleted fields. |
| P0-4 | invoke_stream adoption in src/openhuman/tinyagents/mod.rs |
CLOSED | TinyAgents PR tinyagents#21 shipped context-preserving invoke_stream_in_context in v1.7.0; follow-up PR tinyagents#28 made that stream Send and shipped in v1.7.1. OpenHumanTinyAgentModel::invoke now drives invoke_stream_in_context when progress streaming is enabled, consuming terminal AgentStreamItems while the existing EventSink bridge continues to mirror progress. Local validation for #28 in the submodule: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; timeout 120s cargo test invoke_stream_in_context_stream_is_send; timeout 120s cargo test invoke_stream_in_context_unsubscribes_channel_listener. GitHub release run 28729225952 passed TinyAgents format, clippy, tests, package, tag, and crates.io publish for v1.7.1. |
| P0-5 | SHA-256 prompt fingerprint / prompt-cache drift guard | CLOSED | src/openhuman/tinyagents/middleware.rs now stamps PromptCacheSegmentMiddleware segment ids and ModelRequest::prompt_fingerprint with SHA-256 over canonical JSON. Tool-cache identity includes the full serialized ToolSchema list, not just tool names, matching TinyAgents 1.6 PromptBuilder::fingerprint expectations. Added prompt_cache_segments_fingerprint_full_tool_schema as the local regression guard. |
| P0-6 | Idempotent redaction middleware vs journal.rs double-redaction |
CLOSED | Audit found no OpenHuman install of TinyAgents RedactionMiddleware. Model-facing tool output is scrubbed once by CredentialScrubMiddleware; durable event persistence is separately wrapped by journal.rs RedactingSink over openhuman_redaction_secrets(). These protect different surfaces, so there is no crate/host double-redaction seam to collapse in Phase 0. |
Phase 1 Drift Rows
| # | Area | Status | Evidence / action |
|---|---|---|---|
| P1-1 | SchemaCleanr provider schema normalization |
CLOSED | TinyAgents PR tinyagents#20 shipped in v1.7.0. Host src/openhuman/tools/schema.rs now re-exports tinyagents::harness::tool::{CleaningStrategy, SchemaCleanr, GEMINI_UNSUPPORTED_KEYWORDS}, keeping the old OpenHuman import path stable while deleting the in-tree implementation. Local TinyAgents validation before merge: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; timeout 120s cargo test schema_. |
| P1-2 | current_time / resolve_time builtin tool pilot |
RELEASED / HOST WRAPPER RETAINED | TinyAgents PR tinyagents#22 shipped in v1.7.0 with optional tools feature exports. Host wrappers remain in place until Phase 2 reconciles ToolResult, permission, access, and timeout semantics enough to adopt crate builtin tools. Local TinyAgents validation before merge: cargo fmt --check; timeout 240s cargo clippy --features tools --all-targets -- -D warnings; timeout 180s cargo test --features tools time_. |
| P1-3 | model_context.rs generic context-window patterns |
CLOSED | TinyAgents PR tinyagents#23 shipped in v1.7.0. Host context_window_for_model now checks OpenHuman tier aliases and the cost catalog first, then delegates generic raw-model fallback to tinyagents::harness::model::context_window_for_model_id. Local TinyAgents validation before merge: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; timeout 120s cargo test context_window_patterns_cover_common_provider_families; timeout 120s cargo test o1_o3_context_patterns_require_segment_boundaries. |
| P1-4 | error_classify.rs generic provider failure classifiers |
RELEASED / HOST CALL-SITE PENDING | TinyAgents PR tinyagents#24 shipped in v1.7.0 with harness::retry::{ProviderFailureClass, classify_provider_failure, classify_provider_error, structured_http_status, parse_retry_after_ms} and shared OpenAI retryability classification. Host retry/failure call-site swaps remain pending because OpenHuman-specific session, billing-envelope, and backend phrase rules stay host-side. Local TinyAgents validation before merge: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; timeout 120s cargo test provider_failure; timeout 120s cargo test structured_http_status; timeout 120s cargo test retry_after_parser_accepts_integer_float_and_space_separators; timeout 120s cargo test classify_provider_error_reads_structured_error_fields. |
| P1-5 | First-class reasoning channel host cutover | CLOSED | TinyAgents v1.6.0 already carries typed reasoning via ContentBlock::Thinking, ContentBlock::RedactedThinking, MessageDelta::reasoning, and stream reconstruction that preserves thinking blocks. OpenHuman now writes new non-streaming reasoning_content into ContentBlock::Thinking instead of ProviderExtension, while still reading legacy ProviderExtension reasoning from persisted transcripts and continuing to echo ChatMessage::extra_metadata for provider replay. Local validation: cargo fmt --check passed; two targeted cargo test --lib --manifest-path Cargo.toml ... attempts for the new conversion tests timed out during host test compilation before executing, so runtime verification is deferred to GitHub runners. |
| P1-6 | Git-worktree WorkspaceIsolation provider |
RELEASED / HOST WRAPPER RETAINED | TinyAgents PR tinyagents#25 shipped in v1.7.0. OpenHuman's wrapper remains for global event-bus emissions, OutsideWorkspace, and host policy mapping; adapter deletion waits for a focused wrapper-thinning pass. Local TinyAgents validation before merge: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; targeted worktree tests for create/list/status/diff/remove plus overlap and sanitize filters. |
| P1-7 | Tool display metadata and timeout semantics | RELEASED / HOST TRAIT RETAINED | TinyAgents PR tinyagents#26 shipped in v1.7.0. Host ToolPolicy projection now fills the new ToolRuntime.timeout field, but OpenHuman's Tool trait still owns richer legacy display/timeout semantics until the Phase 2 tool model reconciliation. Local TinyAgents validation before merge: cargo fmt --check; timeout 180s cargo clippy --all-targets -- -D warnings; timeout 120s cargo test display_; timeout 120s cargo test tool_policy_deserializes_without_display_metadata; timeout 120s cargo test timeout_policy_uses_richer_timeout_semantics. |
Host Validation Notes
Local host validation is intentionally bounded because full suites are deferred
to GitHub runners. cargo fmt --check passed after the v1.7.1 host changes.
Targeted timeout 240s cargo test --lib --manifest-path Cargo.toml schema_
and timeout 240s cargo test --lib --manifest-path Cargo.toml context_window
timed out during host compilation before executing the filtered tests. A bounded
timeout 240s cargo check --lib --manifest-path Cargo.toml first exposed the
non-Send stream cutover issue and the new ToolRuntime.timeout field; after
filling ToolRuntime.timeout, TinyAgents v1.7.1 closed the stream Send
blocker and the host re-applied the invoke_stream_in_context cutover. A fresh
bounded timeout 240s cargo check --lib --manifest-path Cargo.toml then timed
out before completion with warning output only and no post-cutover compiler
error emitted before the cap.
Phase Gates
| Phase | Gate rows | Status |
|---|---|---|
| Phase 0 - version alignment | P0-1, P0-2, P0-3, P0-4, P0-5, P0-6 | CLOSED |
| Phase 1 - quick upstream ports | SchemaCleanr, error classification, model context, reasoning channel, worktree isolation, display metadata, time tools | PARTIAL HOST CUTOVER |
| Phase 2 - tool model and builtin families | ToolResult structure, permission model, ToolAccess, edit tracking, filesystem/network/time tools | NOT STARTED |
| Phase 3 - provider consolidation | OpenAI-compatible provider cutover, retry ownership, backend envelope split | NOT STARTED |
| Phase 4 - orchestration consolidation | TaskStore/SteeringRegistry lifecycle, status vocabulary, session durability | NOT STARTED |
| Phase 5 - workflow/team generic slices | Validation/scheduling slice evaluation | NOT STARTED |
| Phase 6 - cleanup and docs | Transitional shim deletion and architecture docs | NOT STARTED |
Closing Procedure
- For a DRIFT -> tinyagents PR row, branch inside
vendor/tinyagents, port the generic change with crate-native tests, merge/release upstream, then bump the host submodule and version pin together. - For a HOST-OWNED row, document the boundary and keep the logic in OpenHuman behind the seam.
- For a CONSOLIDATE / DELETE row, add or update the seam proof first, cut the live path to TinyAgents, then delete the duplicate host implementation.
- Update this ledger in the same host PR that closes or reclassifies a row.