# TinyCortex Migration — Current-State Audit & Consolidated Plan (2026-07-22) **Status:** **DONE** on `feat/tinycortex-migration-2026-07-22`. [CI Full run 29925645209](https://github.com/senamakel/openhuman/actions/runs/29925645209) is green, including the final gate and every Linux, macOS, and Windows desktop shard (companion to `tinyagents-migration-plan-2026-07-22.md`; supersedes the *status/phasing* in `tinycortex-memory-migration-plan.md`, `tinycortex-migration-spec.md`, `tinycortex-api-gap-audit.md`, and `tinycortex-parity-checklist.md` — those docs' ownership splits, gap lists, and parity dimensions remain the reference detail. `tinycortex-drift-ledger.md` stays the row-level ledger but its anchors are stale — see §2). **Scope:** finish moving the remaining generic memory-engine code from `src/openhuman/` into the vendored `tinycortex` crate (`vendor/tinycortex`), delete the in-tree duplicates and staging code, migrate/retire the affected tests, and clean up every dangling doc/code reference. **Method:** fresh four-way audit — (1) the crate surface, (2) the core memory domains, (3) the periphery + the `src/openhuman/tinycortex/` seam, (4) the docs/tests/git history — against the working tree at `main` (`5b8a9f269`, 2026-07-22). --- ## 1. Executive summary **The engine migration is essentially done and the docs don't know it.** All five `docs/tinycortex-*` docs self-describe a "W1–W2 landed; W3 partial" state, but git shows the full W-track landed: W1 seam (#4526), W2 type re-export (#4529), the W3 chunk-store cutover chain (#4532–#4559), W4 queue flip (#4781), W5 vector+scoring (#4790), the W7 long-tail shims (#4785–#4789), **engine-migration completion (#4794)**, **engine test port into the crate (#4820)**, and post-completion feature work (persona/coding-session ingest #4863) on top. The drift ledger's D1–D3 rows are all CLOSED. What remains is not "migrate the engine" but five bounded packages (§5): 1. **Housekeeping** — the pin/tag story is broken (crate has *no git tags* despite the Cargo.toml comment demanding tag-lockstep), the host CI vendor suite omits the `persona` feature the host enables, and there are ~8 broken/stale references including a seam module doc naming files that were never created. 2. **Delete `memory_store/unified/`** — the explicitly "staging for removal" tier (~5k LOC + ~3.7k test LOC), gated by the G1 `sqlite_conn()` escape hatch. 3. **W-SYNC completion** — `memory_sync/` (17.7k LOC, the largest remaining host mass) still runs the host provider pipelines while the crate now ships a full `memory::sync` Composio engine; the D4 ledger rows gate the flip. 4. **Embedding-provider dedupe** — host `embeddings/` adapters and `memory_tree/score/embed/` providers now duplicate what `tinyagents::harness::embeddings` ships since tinyagents #58 (this package lands in **tinyagents**, not tinycortex — the crates split the job). 5. **Shim retirement + funnel decision** — the compatibility shims left behind by W3–W7, and a policy call on the fact that domains import `tinycortex::memory::*` directly while the seam's re-export facade has **zero** consumers. --- ## 2. Ground truth: pins, versions, and discrepancies (fix first) | Fact | Value | Where | | --- | --- | --- | | Host requirement | `tinycortex = { version = "0.1", features = ["git-diff", "persona", "sync"] }` | root `Cargo.toml:116` | | Path override | `[patch.crates-io] tinycortex = { path = "vendor/tinycortex" }` | `Cargo.toml:682` | | Vendored crate | `0.1.1`, edition 2021, **MIT** (not GPL — unlike tinyagents), repo `tinyhumansai/tinycortex` | `vendor/tinycortex/Cargo.toml` | | Submodule HEAD | `daaaf6ba` (`heads/main`, dependabot-era, ~50+ commits past every SHA the docs cite) | `git submodule status` | | Tags | **none exist** — `git describe --tags` fails; yet host `Cargo.toml:115` says "Keep the version pin in lockstep with the submodule tag" | submodule | | Docs' claimed pin | gitlink `a8e10f7` (exists in history, long since passed) | drift ledger / spec anchors | | Nested dep | tinycortex requires `tinyagents = { version = "2", path = "vendor/tinyagents" }`, **its own nested submodule pinned at v2.0.0** | `vendor/tinycortex/Cargo.toml:69` | | Host tinyagents req | `2.1` | root `Cargo.toml:107` | | Fork patch | `[patch."https://github.com/senamakel/tinyagents"]` exists *for tinycortex's sake* ("temporarily pins the embedding API port while tinyagents #58 is pending" — #58 is now merged at the tinyagents submodule HEAD) | `Cargo.toml:685-691` | | Host CI vendor suite | `cargo test --manifest-path vendor/tinycortex/Cargo.toml --features git-diff,sync` — **omits `persona`**, which the host enables | `.github/workflows/ci-lite.yml:859` | Version skew summary: three different tinyagents expectations (host `2.1`, tinycortex `2`, nested submodule `2.0.0`) resolve only via path patches. The tinyagents plan's WP-0 (bump `vendor/tinyagents` to v2.1.0) should be executed together with bumping tinycortex's *nested* `vendor/tinyagents` so both crates share one trait identity at one version, after which the `senamakel` patch block and its "temporarily pins" comment can likely be retired. --- ## 3. What the crate already ships `tinycortex 0.1.1` exposes a single `memory` module — the engine "ported from OpenHuman" — with features `tokio`, `git-diff` (git2-backed `memory::diff`), `providers-http` (reqwest embedding/LLM providers, host does **not** enable), `sync` (live Composio + workspace-scan engine), `persona` (doc-06 persona distillation). Modules: `store` (content/vectors/kv/entity_index/safety+PII), `chunks`, `sources` (+readers), `score` (embed/extract/signals), `tree` (+runtime, bucket/document seal, flavoured trees), `queue` (SQLite job queue + tokio runtime), `retrieval` (hybrid search, MMR, rerank), `entities`, `graph`, `goals`, `tool_memory`, `conversations`, `archivist`, `ingest` (canonicalize→chunk→score→tree), `diff`, `sync` (composio clickup/github/linear/notion/slack/gmail), `providers`, `persona` (readers for claude_code/codex/git history), `fsutil`. Host-facing extension points (~20 public traits) with the seam's current implementations in parentheses: `Memory`, `MemoryStore`, `EmbeddingBackend` + `Embedder` (`SeamEmbedder`), `ChatProvider` (`SeamChatProvider`), `Summariser` (`HostSummariser`), `SealObserver` + seal-time `Embedder` bridge (`seal.rs`), `TreeJobSink` (`HostTreeJobSink`), `QueueDelegates` (`HostQueueDelegates`), `SourceReader`, `SelfIdentity`, `EntityOccurrenceIndex`, `SnapshotItemSource`, `GoalsGenerator`, `ConversationEventBus`/`ChannelEventHandler`, `PersonaStateStore`, and the sync seams `SyncStateStore` / `SyncEventSink` / `SkillDocSink` / `LocalDocumentSink` / `ExternalSourceReader` / `SyncPipeline` / `ActionExecutor` / `IncrementalSource` (`sync.rs`, `HostSyncAdapter`). The crate consumes `tinyagents::harness::embeddings::{EmbeddingModel, format_embedding_signature}` in `store/vectors/embedding.rs` — that is the whole tinyagents dependency (the W-EMB decision made real by tinyagents #58). Crate CI: fmt, clippy `-D warnings`, build+test `--all-features`, doc build with warnings denied, plus a per-feature matrix (`core`, `tokio`, `git-diff`, `sync`, all). Offline by convention; Composio/live tests are wiremock-mocked or env-key-gated. --- ## 4. Audit: what remains host-side ### 4.1 Per-domain state (crate-backed file counts via `use tinycortex::`) | Domain | Files / LOC | Crate-backed | State | | --- | --- | --- | --- | | `memory/` | 69 / 18.0k | 3 | Orchestration + policy + RPC layer (by design "no SQLite here"). Predominantly host: `read_rpc/`, `schema*/`, `rpc_models`, agent tools, sync orchestration, tree *policy*. Stays, minus shim cleanup. | | `memory_store/` | 54 / 17.7k | 15 | Sub-stores flipped to crate (chunks, content, vectors, kv, entities, trees, safety/PII per W3/W7 markers). **`unified/` (~5k + ~3.7k tests) is README-marked "Staging for removal"** — documents/query/segments/events/profile await per-kind flips. `factories.rs` (config/provider selection) stays host. | | `memory_tree/` | 47 / 10.3k | 16 | Largest crate-backed surface; engine parts delegate. Host keeps RPC (`tree/rpc.rs` 1,387, `retrieval/rpc.rs`), CLI, bus subscriber, `health/` doctor (G5, host-retained by decision), and `score/embed/` **providers** (~1.9k — see WP-3). | | `memory_queue/` | 7 / 1.4k | 2 | W4 flipped: `worker.rs` delegates claim→dispatch→settle to `tinycortex::memory::queue::run_once` via `HostQueueDelegates`; per-kind handlers deleted. Host keeps worker pool, scheduler tick, `scheduler_gate` throttle, SQLite glue. Done, minus the `memory::jobs` re-export shim. | | `memory_search/` | 8 / 0.8k | 2 | W5 flipped: `scoring.rs`/`vector/mmr.rs` are near-empty shims over crate `WeightProfile`/`retrieval::mmr`. Host keeps the three agent tools. Done. | | `memory_tools/` | 9 / 1.4k | 3 | W7 flipped: types/store/prompt are shims over `tool_memory::{types,store,render}`. Host keeps `capture.rs` (`PostTurnHook`) + put/list tools. Done. | | `memory_archivist/` | 1 / 44 | 1 | Pure W7 shim over `memory::archivist`. Done. | | `memory_conversations/` | 2 / 0.9k | 2 | W7 shim over `memory::conversations`; host keeps `bus.rs` event-bus glue (+ a `tinychannels` legacy-message conversion). Done. | | `memory_diff/` | 7 / 2.0k | 11 uses | W7 flipped: engine crate-owned; host keeps RPC/tools + `DomainEvent::MemoryDiff*` publishing. Done. | | `memory_goals/` | 6 / 0.9k | 4 uses | W7 flipped: types/store crate-owned (byte-identical `MEMORY_GOALS.md`); host keeps agent wiring. Done. | | `memory_sources/` | 16 / 5.0k | 12 uses | Product registry (config-persisted connectors) with crate readers underneath. Host by design. | | `memory_sync/` | **73 / 17.7k** | 5 uses | **The largest remaining mass.** Host Composio provider pipelines (gmail/slack/github/notion/linear/clickup) still run host-side while the crate's `memory::sync` ships the same provider engine. W-SYNC seam (`sync.rs`, 679) is landed; the host flip (W-SYNC.3) has not happened. See WP-2. | | `embeddings/` | 13 / 3.1k | **0** | Bridges **tinyagents** (9 files), not tinycortex. Post-#58, the host per-provider adapters duplicate crate `harness::embeddings` providers. See WP-4. | | `agent_memory/`, `subconscious/` (memory parts), `learning/` (memory parts) | — | 0 | Host product consumers of the memory stack; no crate duplication. Stay. | Consumer counts (host memory tiers are deeply embedded and *stay* host, so these are context, not deletion blockers): `memory::` 166 files, `memory_store::` 132, `memory_tree::` 67, `memory_queue::` 18, `memory_tools::` 11, `memory_search::` 3. ### 4.2 The seam — `src/openhuman/tinycortex/` (11 files, ~3.2k LOC) `config.rs`, `embeddings.rs`, `chat.rs`, `summariser.rs`, `ingest.rs`, `seal.rs`, `sync.rs` (679), `queue_driver.rs` (1,007), `persona.rs` (446), `parity.rs` (`#[cfg(test)]` format pins), `mod.rs`. Healthy and intentionally host-owned. Two findings: - **The seam is not the funnel.** `mod.rs` re-exports crate types (`MemoryEntry`, `MemoryTaint`, `RecallOpts`, …) as the intended type-unification funnel, but **zero** files import `crate::…::tinycortex::` re-exports — every memory domain imports `tinycortex::memory::*` directly. Either convention works; pick one and record it (WP-5). Direct crate imports are simpler and match how `tinyagents` is consumed; if so, shrink the facade instead of promoting it. - **Stale internal doc:** `mod.rs:28-30` names sibling adapters `sinks.rs` and `bus.rs` that were never created (their roles landed as `ingest.rs`/`seal.rs`/`sync.rs`). `queue_driver.rs:21-26` still says "This brick is additive: nothing is flipped yet" — the flip landed in #4781. Coupling is bidirectional by design (seam reaches back into `memory_store`/`memory_tree`/`memory_sync` to do host work inside crate callbacks); not a defect, but `queue_driver.rs`'s 11 host imports will thin as WP-1/WP-3 shims retire. ### 4.3 Broken/dangling references (resolved in WP-0) | Resolved issue | Resolution | | --- | --- | | Missing TinyAgents companion-spec link | Replaced with the existing July 22 migration plan. | | Missing standalone deletion-ledger link | Replaced with §2 of the TinyCortex migration spec. | | Wrong agent-harness documentation path | Pointed at the architecture subdirectory. | | Never-landed golden-workspace generator | Removed after the post-cutover parity decision descoped synthetic pre-cutover fixtures. | | Wrong raw-coverage test path | Corrected to the `tests/raw_coverage/` location. | | Stale line anchors `Cargo.toml:82`, `src/openhuman/mod.rs:130` | `tinycortex-migration-spec.md` §0.4 (actual: `Cargo.toml:116`, `mod.rs:140`) | | Never-created seam sibling names | Replaced with the adapters that actually landed. | | Developer-specific absolute path in crate docs | Replaced with repository-relative paths. | Also stale-in-place: all five docs' status headers (pre-#4794), the drift ledger's pin anchors, and the crate migration doc's claim that "TinyCortex will not own memory sync" (superseded by the plan's §8 sync-inclusive amendment and the crate's shipped `sync` module — the *scheduler/credentials/ RPC* stay host, the *engine* is crate; restate the boundary in one place). ### 4.4 Test inventory - **In-crate (done):** engine coverage was ported by #4820; the crate runs its own suite offline (wiremock Composio mock; live tests env-gated). W8's CI wiring exists: `ci-lite.yml:859` runs the vendor suite on submodule-pointer changes — **but with `--features git-diff,sync` only; `persona` is untested in host CI while enabled in the host build.** - **Dies with WP-1:** `memory_store/unified/*_tests.rs` (~3.7k LOC: `documents_tests` 1,275, `query_tests` 1,000, `profile_tests` 763, `segments_tests` 393, `events_tests` 287) go with the unified tier; port any still-unique assertions to the per-kind crate backends first. - **Retargets with WP-2:** the memory_sync suites (389 inline tests across 35 files + provider `*_tests.rs`: github 655, gmail 301+354, slack 180, linear 172, clickup 155, notion 119) — post-flip, provider *engine* behavior is crate-tested; host keeps orchestration/bus/config tests. Integration: `memory_sync_pipeline_e2e.rs` (570), `memory_golden_parity_e2e.rs` (275), `raw_coverage/memory_sync_*` retarget to the crate-backed path. - **Golden parity harness:** comparators 1 & 5 green; 2/3/4 TODO; `frontmatter_parity` Layer-1 asserter pending; fixture generator script missing. Decide finish-vs-descope in WP-0 (post-cutover, parity pins matter mainly for `MemoryTaint`/on-disk stability — keep those, consider dropping the rest). - **Stays host:** `json_rpc_e2e.rs` memory sections, `memory_sources_e2e` (837), `memory_tree_summarizer_e2e` (583), `memory_roundtrip_e2e`, `memory_graph_sync_e2e`, `memory_fast_retrieve_e2e`, `autocomplete_memory_e2e`, `memory_artifacts_e2e`, the 15 `raw_coverage/memory_*` modules, and all subconscious/learning suites. --- ## 5. The plan — five work packages Same conventions as the tinyagents companion plan: WP-0 first (hygiene, unblocks honest review), then largely independent packages; drift-ledger rows before deletions; failing-before/passing-after regression tests; small validated commits on feature branches per submodule. ### WP-0 — Version/tag + CI + docs housekeeping (no engine behavior change) 1. **Establish the tag discipline the Cargo comment promises:** tag `vendor/tinycortex` (e.g. `v0.1.1` at the current release point, or cut `v0.2.0` at HEAD), and record the bump workflow the plan prescribed (`chore(vendor): bump tinycortex …` — zero such commits exist in host history). Alternatively amend the comment to describe reality (main-tracking submodule). Either is fine; the current state (comment demands tags, none exist) is the worst option. 2. **Align the nested tinyagents:** when the tinyagents plan's WP-0 bumps `vendor/tinyagents` to v2.1.0, bump `vendor/tinycortex/vendor/tinyagents` in lockstep and update tinycortex's `tinyagents = "2"` if needed; then evaluate retiring the `[patch."…senamakel/tinyagents"]` block and its obsolete "while tinyagents #58 is pending" comment (#58 is merged). 3. **Close the persona CI hole:** add `persona` to the vendor-suite features in `.github/workflows/ci-lite.yml:859` (and confirm the crate's own feature-matrix covers `persona`, which today it does not list either). 4. **Docs refresh:** update the five docs' status headers to post-#4794/#4820 reality; update drift-ledger anchors (pin `daaaf6ba`+tag, note #4794/#4820/ #4863); document the `persona` feature + seam (currently invisible in all five docs); restate the sync ownership boundary once (engine=crate, scheduler/credentials/RPC/bus=host) and fix the crate-side migration doc's contradictory "will not own sync" line + its absolute local path. 5. **Fix the §4.3 broken references**, including the two code-adjacent ones: correct the seam module inventory and the queue-driver's stale pre-flip description. 6. **Golden-parity decision:** finish comparators 2/3/4 + `frontmatter_parity` + the fixture script, **or** descope to the security-relevant pins (`MemoryTaint` byte-identity, chunk/vector on-disk format) with the decision recorded in the parity checklist. **Exit:** pins/tags/CI/docs agree with the tree; `grep` for the phantom paths comes back clean. ### WP-1 — Retire `memory_store/unified/` (the "staging for removal" tier) 1. Inventory the five remaining unified facets (documents, query, segments, events, profile — ~5k LOC) against their per-kind crate backends; flip callers facet-by-facet (the W3 sub-store pattern, already proven for chunks/content/vectors/kv/entities/trees/safety). 2. The blocker is **G1** (`sqlite_conn()` escape hatch, ~312 refs at audit time): re-audit the current count, then either land the crate-side access the gap audit sketched or explicitly re-scope G1 to the host-retained namespace-document tables and record it. 3. Decide the fate of the 10-table host-retained `UnifiedMemory` namespace-document tier: keep host (spec's standing decision) but move it out of `unified/` into a clearly-named home so "staging for removal" can actually be removed. 4. Tests: port unique assertions from the ~3.7k LOC of `unified/*_tests.rs` to per-kind backends (crate-side where engine behavior, host-side where glue), then delete with the code. **Exit:** `memory_store/unified/` gone or reduced to the renamed host tier; `memory_store/` ≈ 9–10k LOC of glue + host tier; `memory_roundtrip_e2e` + `memory_golden_parity_e2e` + full mock-suite green. ### WP-2 — W-SYNC.3: flip `memory_sync/` onto the crate sync engine The seam (`sync.rs`: `ExternalSourceReader`, `SkillDocSink`, `LocalDocumentSink`, `SyncStateStore`, `SyncEventSink`) is landed; the crate ships the Composio engine incl. per-provider modules. Remaining: 1. Close the **D4.1–D4.4** drift rows (ledger requires this before the flip). 2. Flip provider-by-provider (gmail first — the crate already carries the Gmail 413-page fix #73), keeping host-side: scheduler/periodic trigger, credentials, `config.toml` source registry (`memory_sources/`), event-bus publishing (`ChannelMessageReceived` et al.), RPC/status surface, and redaction/`source_scope` gating. 3. Dedupe post-processing: host `providers/*/post_process*` vs crate provider modules — upstream generic normalization, keep host product policy. 4. Tests per §4.4: engine behavior moves to crate suites (wiremock Composio), host keeps orchestration/bus/e2e; `memory_sync_pipeline_e2e` retargets. **Exit:** `memory_sync/` shrinks from 17.7k toward ~6–8k LOC of orchestration/product glue; D4 rows CLOSED; no duplicated provider parsing. ### WP-3 — Embedding-provider dedupe (lands in *tinyagents*, coordinated here) Two host clusters now duplicate `tinyagents::harness::embeddings` (post-#58: openai/cohere/voyage/ollama/cloud + rate-limit/retry-after): 1. `src/openhuman/embeddings/` adapters (`openai/voyage/cohere/ollama/ cloud_adapter.rs`, `provider_trait.rs`) → construct crate `EmbeddingModel`s directly; host keeps `rpc.rs` (1,479), `schemas.rs`, `catalog.rs`, `factory.rs` (config/BYOK selection, #4056 dimension gating). 2. `memory_tree/score/embed/{openai_compat,ollama,cloud,factory}.rs` (~1.9k) → same crate models via the seam's `SeamEmbedder`/`EmbedderBridge`. Because tinycortex consumes the same `EmbeddingModel` trait, this single change serves both crates — it is the concrete payoff of the W-EMB decision. Sequence after WP-0's tinyagents version alignment. **Exit:** one embedding-provider implementation per provider across the workspace; `embeddings_rpc_e2e` (822) + `ollama_embeddings_fallback_e2e` (234) green against the crate-backed path. ### WP-4 — Shim retirement + funnel decision 1. **Funnel policy:** adopt direct `tinycortex::memory::*` imports as the convention (matches reality and the tinyagents precedent), shrink the seam `mod.rs` facade to the types host code genuinely re-brands (`MemoryTaint` stays pinned by parity tests) — or the reverse; either way, record it in the spec and stop carrying both. 2. Retire compatibility shims whose consumers can move: `memory_tree/tools.rs` (points at `memory`), `memory_store/trees` legacy paths, the `memory_queue`→`memory::jobs` re-export, `memory_archivist` (44-line shim — move its 2 call sites and delete the domain), and the W5/W7 near-empty shims once import counts hit zero (`memory_search/scoring.rs`, `vector/mmr.rs`, `memory_tools/{types,store}.rs`). 3. Thin `queue_driver.rs` (1,007) as WP-1 removes its `memory_store` reach-backs. **Exit:** shim count measurably down (each deletion = one commit with its import-migration); seam ≤ ~2.5k LOC; no module whose entire body is a re-export except deliberate facades recorded in the spec. ### WP-5 — Exit gate - Full suite: `scripts/test-rust-with-mock.sh` (incl. the 15 `raw_coverage/memory_*` modules), vendor suite `cargo test --manifest-path vendor/tinycortex/Cargo.toml --features git-diff,sync,persona`, slim disabled build (`--no-default-features --features tokenjuice-treesitter` — memory domains are ungated but the standing repo rule applies), `pnpm rust:check`. - Drift ledger: D4 CLOSED; new rows for every WP-1/WP-2 deletion; the spec's §2 deletion-ledger skeleton filled in with actuals. - Docs: the five tinycortex docs + `src/openhuman/memory*/README.md` files + `gitbooks/developing/architecture.md` reflect the post-flip reality; this plan stamped done. ### Execution record (2026-07-22) | Package | Result | | --- | --- | | WP-0 | TinyAgents unified at 2.1 across OpenHuman, TinyCortex, and TinyFlows; obsolete fork patch removed; TinyCortex CI covers `persona`; docs and phantom references repaired. TinyCortex intentionally tracks reviewed upstream commits rather than nonexistent tags. | | WP-1 | G1 count is zero. The ten-table namespace/document product tier is host-owned, so the complete `unified/` directory was renamed to `namespace_store/` instead of deleted as engine duplication. Its 153 targeted tests pass. | | WP-2 | The live default path was already TinyCortex-backed. D4 is CLOSED; dead Gmail duplicate removed; remaining provider task/profile projections explicitly classified as product policy. Provider tests pass (301). | | WP-3 | Concrete provider transports deduplicated into TinyAgents. The memory tree now uses a thin `ProviderEmbedder`; Ollama's 8k context/batch and missing-model guidance moved upstream before the host client was deleted. TinyAgents embedding tests pass (38); host library check passes. | | WP-4 | Archivist, search scoring/MMR, tool-memory type/store, tree-tool, jobs-alias, and unused seam type facades retired. Direct crate imports are canonical. Seam production code is 2,229 LOC (below the 2.5k exit target). | | WP-5 | Local focused validation is recorded above; the slim `--no-default-features --features tokenjuice-treesitter` build also passes. [CI Full run 29925645209](https://github.com/senamakel/openhuman/actions/runs/29925645209) is green: core quality and full tests, TinyCortex, Tauri, frontend, mock-backend Rust E2E, Playwright, three desktop builds, every launched desktop shard, and the final gate. Two first-attempt Linux jobs ended without uploaded logs; rerunning only failed jobs passed the Linux build, Rust integration suite, and all eight Linux shards. | --- ## 6. Risks and standing gotchas - **`MemoryTaint` is security-critical.** The type is proven byte-identical host↔crate and fails closed to `ExternalSync`; the parity pins in `tinycortex/parity.rs` are the regression guard — whatever WP-0 decides about the golden harness, **keep these**. - **Redaction and `source_scope` gating stay host.** WP-2 must not let crate sync code become a path around host redaction or the source allowlist — review the `SyncEventSink`/`LocalDocumentSink` implementations for every provider flipped. - **On-disk compat:** chunk/vector formats, `MEMORY_GOALS.md` byte-identity, and the P5 fresh-DB divergence (3 legacy inline-embedding columns in `mem_tree_chunks`) — migrations of user data must be forward-only and tested against a pre-migration workspace fixture. - **MIT vs GPL:** tinycortex is MIT (tinyagents is GPL-3.0) — moving host code *down* into tinycortex relicenses it; fine for our own code, but keep the "no product policy / no keys / nothing openhuman-branded as API" rule, and don't move anything derived from GPL-only sources into the MIT crate. - **Two Cargo worlds + nested submodule:** vendor bumps now touch up to three lockfiles (root, `app/src-tauri`, and tinycortex's own) and two submodule pointers (`vendor/tinycortex`, `vendor/tinycortex/vendor/tinyagents`). CI clones with `submodules: recursive` for the vendor suite — verify after any bump. - **Event-bus surface:** `memory_sync` publishes 7 distinct `DomainEvent` variants; the WP-2 flip must keep publishing them from host callbacks (the crate has no event bus by design). --- ## 7. Quick reference — disposition of every audited module | Module | Verdict | | --- | --- | | `memory_store/unified/` | DELETE after per-kind flips; host tier re-homed (WP-1) | | `memory_store/` sub-stores, `factories.rs` | DONE (crate-backed) / STAYS (host glue) | | `memory_sync/` provider engines | FLIP to crate `memory::sync` (WP-2) | | `memory_sync/` scheduler, bus, RPC, credentials | STAYS | | `embeddings/` per-provider adapters | REPLACE with `tinyagents::harness::embeddings` models (WP-3) | | `embeddings/` rpc/schemas/catalog/factory | STAYS | | `memory_tree/score/embed/` providers | REPLACE via seam + crate models (WP-3) | | `memory_tree/` engine files | DONE (crate-backed); RPC/CLI/bus/health STAY | | `memory_queue/`, `memory_search/`, `memory_tools/`, `memory_diff/`, `memory_goals/`, `memory_conversations/` | DONE — retire residual shims when import counts reach zero (WP-4) | | `memory_archivist/` | DELETE the 44-line shim after moving 2 call sites (WP-4) | | `memory/` (orchestration/RPC/tools/tree-policy) | STAYS | | `memory_sources/` | STAYS (product registry over crate readers) | | `agent_memory/`, `subconscious/`, `learning/` | STAYS (consumers, no duplication) | | Seam `src/openhuman/tinycortex/` | STAYS, shrinks; fix stale module docs (WP-0), thin `queue_driver.rs` (WP-4) | | Golden-parity harness | FINISH or DESCOPE by decision (WP-0); `MemoryTaint`/format pins KEEP |