Skip to content

refactor(memory): confine raw profile SQLite, guard the tool_memory tools, collapse three re-export shims - #5470

Merged
senamakel merged 22 commits into
tinyhumansai:mainfrom
senamakel:memory-consolidate
Aug 10, 2026
Merged

senamakel merged 22 commits into
tinyhumansai:mainfrom
senamakel:memory-consolidate

Conversation

@senamakel

@senamakel senamakel commented Aug 9, 2026

Copy link
Copy Markdown
Member

What

The follow-up pass to #5446, closing the three items that PR explicitly deferred.

1. profile_conn — raw SQLite confined behind a typed ProfileStore

MemoryClient::profile_conn() handed out an Arc<Mutex<rusqlite::Connection>> to three
domains outside the memory family, two of which wrote SQL inline at the call site. New
memory/store/profile_store.rs is now the only typed door onto user_profile; every one of
the 11 non-test call sites (agent/learning/{startup,tools,schemas}.rs,
memory/sync/composio/providers/profile.rs) is re-pointed, and profile_conn() is narrowed
from pub(crate) to pub(in crate::openhuman::memory) with exactly one caller left —
profile_store()'s own body. FacetCache survives as a learning-side newtype because
FacetClass is agent vocabulary that must not migrate into the memory family.

Read this before believing the title. This is a confinement win, not a guard win.
The profile/facet tables have no capability family in the tinycortex_api contract, so reads
and writes through ProfileStore still run beneath all seven of MemoryGuard's policy steps:
no tier check, no source-scope predicate, no taint stamping, no redaction, no budget, no audit
event. What changed is the door's shape — raw SQLite reachable from three domains became one
typed store whose confinement the compiler enforces. Actually putting profile data under
policy needs a fourteenth capability family in vendor/tinycortex (out of scope here), or a
GuardPolicy half-measure that would make the readonly tier start rejecting the boot-time
learning rebuild loop — a behaviour change that deserves its own PR. The module docs and
docs/specs/memory-guard-allowlist.md say this in the same words; please don't let the diff
stat talk you out of it.

Related, also not fixed here: user_profile has no taint column, so provider-sourced
identities still land untainted.

2. tool_memory agent tools routed through the guard

memory/tool_memory/tools/{list,put}.rs went via active_memory_client() +
tool_memory_store(client.memory_handle()). They now resolve active_memory_guard() and go
through as_tool_memory(). list is 1:1 — memory::tool_memory::ToolMemoryRule is
tinycortex_api::tool_memory::ToolMemoryRule, so same rules, same order, same serialization.
put needs a read-back after the write because the contract method returns unit while the
tool answers with the stored rule; that read-back is exact, not lossy, and a concurrent
delete in the window errors rather than fabricating a rule.

Two intended behaviour changes, both consequences of actually being guarded:

  • memory_tools_put now passes through admit_writeSecurityPolicy::enforce_write_tier,
    so it is refused under the readonly autonomy tier. It previously succeeded.
  • Both tools now depend on the bound driver advertising Capability::ToolMemory.
    tool_memory_store(memory_handle()) worked over any Arc<dyn Memory>; against a
    non-advertising driver these two tools now error where they used to function.

The four ops/tool_memory.rs handlers (tool_rule_put/get/*_json/*_for_prompt) are not
re-pointed — they have no contract twin — and their allowlist entries stay with their existing
reasons.

3. M8c — three re-export shims collapsed

Host-only import rewrites, no crate change and no gitlink bump: the memory_diff types shim,
the goals GoalsDoc/GoalItem shim, goals/store.rs onto the crate engine, and the
conversations type/function shim. Pure relocation — the dropped async on the goals wrappers
offloads nothing that was offloaded before (they were bare engine::f(..).map_err(to_string),
no spawn_blocking), and error text is preserved at every call site.

Expect grep -rn "tinycortex::" src/openhuman/ to go up. Deleting a pub use shim
re-points importers at tinycortex:: directly. That is the shim leaving, not coupling
arriving.

Bypass ratchet

bypass_allowlist_tests.rs: 52 → 49 entries. −4 .profile_conn(, −4 tool_memory,
+4 .profile_store(, +1 client.rs .profile_conn( (kept so the needle stays live and a
future re-widening is still watched). The profile slice is net +1 on its own — that is the
honest accounting of a confinement-not-policy change, and the module docs say so. All six lint
tests green; grep "out of scope for M4\|deferred to M5" over src/ and docs/ is now empty.

Two things about the merge base you should know

  • origin/main does not compile its own lib tests. 394fabb92 left the
    core::event_buscore::bus migration half-done: memory/guard/audit.rs,
    memory/binding.rs and memory/guard/provider_tests.rs still named the deleted module.
    Nothing on this branch could be verified until that was fixed, so f14819bc6 does it. The
    two provider tests observed denials over a raw_receiver() that no longer exists; since the
    global BUS is a no-op under cargo test, audit.rs gains a #[cfg(test)] recorder seam
    with a watermark, preserving both assertions.
  • 9836f679a is a 69-file cargo fmt of the merge base, which was unformatted. It is
    isolated in its own commit so the substantive diff stays readable — skip it in review.
    e13f7b1a9 likewise only regenerates the stale app/src-tauri/Cargo.lock.

Verification

Two independent adversarial passes ran over this branch. Both found the same single blocker —
tests/learning_phase4_integration_test.rs stopped compiling when FacetCache::new changed
shape, invisible to cargo test --lib and to CI Lite's changed-file lane — which is fixed
here (ProfileStore::for_tests widened from #[cfg(test)] to #[doc(hidden)] pub, because
integration tests link the lib without cfg(test)).

check result
cargo check (lib) 0 errors, 0 warnings
cargo check --tests 0 errors
cargo test --test learning_phase4_integration_test 2 passed
cargo test --lib openhuman::memory 1489 passed, 1 failed — pre-existing
cargo test --lib core:: 762 passed, 5 failed — pre-existing
cargo check --no-default-features (slim) pass — no feature-gate drift
scripts/check-kernel-floor.sh pass — dep ratchet did not move
cargo fmt --check (root + vendor/tinycortex) clean

Every failure above was reproduced byte-identically on an origin/main scratch worktree
(with f14819bc6 cherry-picked, since main otherwise cannot build its lib tests at all — the
most favourable possible reading for main). guard_explicit_scope_argument_wins_over_the_ambient_one
fails on main with the same panic, and families.rs / families_tests.rs / policy.rs and
the vendor/tinycortex gitlink are byte-identical to main on this branch.

cargo check --manifest-path app/src-tauri/Cargo.toml fails on both this branch and main
(E0432: unresolved import openhuman_core::core::event_bus in
app/src-tauri/src/whatsapp_data/mod.rs) — the shell has the same half-done migration. This
branch does not fix it; flagging it because it means the desktop shell is currently broken on
main.

Non-vacuity was proved for the new tests by breaking the production code and observing the
failure: reverting put.rs::execute to its pre-branch form made the readonly-tier test fail
and fired the bypass ratchet naming both needles; flipping key LIKE ?2 to key = ?2 made
the legacy-SQL oracle test fail on pattern="skill:gmail:%:email".

Not in this PR

  • store/namespace_store/ (~11.3k LOC) — 55% of all remaining movable mass and the only item
    needing a real schema/migration port into the crate. Its golden-parity harness pins table
    names via hardcoded &'static [&str] constants, so the constants and the schema must not
    change in the same commit or the test passes vacuously. Own sandwich.
  • agent/harness/archivist/lifecycle.rs writes user_profile via profile::profile_upsert
    on an injected connection and is covered by neither bypass needle. Inert today (no
    production ArchivistHook::new). A profile::profile_upsert( needle would surface it for
    one allowlist entry — worth a follow-up.
  • M6/M7 (HTTP adapter, portability RPC).

Note on the history

The auto-commit hook fires in this worktree and checkpointed several deliberate
break-then-restore edits made while proving test non-vacuity (50ee06732f65e8aeb2, and
62067fae9/17b775513). Net source effect is zero — git diff between the pairs is empty —
but they are churn. Squash-merge.

Summary by CodeRabbit

  • New Features

    • Memory rule updates now respect readonly access levels.
    • Memory writes provide clearer validation errors and confirm saved data.
  • Bug Fixes

    • Prevented unauthorized memory-tool writes.
    • Improved consistency for profile and facet storage operations.
  • Refactor

    • Standardized conversation, goals, and memory-diff storage access.
    • Simplified internal storage pathways while preserving existing behavior.
  • Tests

    • Added coverage for readonly protection, profile storage, facet operations, and memory-tool workflows.
    • Expanded validation of guarded access and storage behavior.

senamakel and others added 20 commits August 9, 2026 11:50
Co-authored-by: Medulla <medulla@tinyhumans.ai>
…rd and binding

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Delete src/openhuman/memory/diff/types.rs, which was a 19-line
pub-use of tinycortex::memory::diff. Importers now name the crate
module directly. Pure re-point: type identity is unchanged.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
memory::goals re-exported the crate goal types under a second
spelling; every external caller already named tinycortex_api::goals
directly. The one internal consumer (ops.rs) now does too, so the
host converges on a single path. No type or signature change.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
The host store was six async wrappers, each engine::f(..) plus
map_err(to_string). Call sites (ops, tools, enrich, the embedded
driver) now call tinycortex::memory::goals::store directly and carry
the same to_string() mapping inline, so error text and control flow
are byte-identical; the wrappers were never async in substance, so
dropping .await changes nothing observable.

Mapping the now-typed engine MemoryError onto the contract's
Invalid/NotFound is a behaviour change and stays a follow-up; the
driver's module docs record that.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
memory::conversations re-exported 16 crate items under a host path.
All ~25 consumers now name tinycortex::memory::conversations
directly, so the host module is only what it actually owns: the
event-bus persistence subscriber and the spawn_blocking wrappers
(tinyhumansai#5156), both of which stay. Pure re-point; no signature or type
change.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
When a tool name is not provided in the put request, the operation now returns an appropriate error instead of panicking or producing undefined behavior. This ensures the API remains robust against incomplete input.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The put tool was inadvertently removed from the tool memory module, breaking the ability to store new entries. This change restores the tool's implementation, ensuring that put operations function correctly again.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The put tool was calling `active_memory_client` from the `ops` module, but the function has been moved to the `helpers` module. This change updates the import path so the tool can find and use the correct function.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The put tool now uses the active memory guard and calls `put_tool_rule`, which returns unit instead of the stored rule. To preserve the tool's contract of returning the stored rule, the rule is read back by its generated id after insertion, ensuring the response includes the normalised tool name and refreshed timestamps.

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

The SQL query in the profile store was using a LIKE operator with a key pattern, but the parameter being passed is an exact key value, not a pattern. Changed the operator to an equality check to ensure the query correctly matches the exact key rather than interpreting it as a pattern, which could lead to incorrect or missed matches.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Changed the key comparison in the profile existence check from an exact match to a LIKE pattern match, ensuring that the query correctly handles key patterns that may contain wildcards or partial matches as intended by the surrounding logic.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The lockfile now includes the tinybus and tinybus-macros packages as dependencies of the main application, while removing the unused cmake crate and an unnecessary indexmap dependency from serde_json. This reflects the addition of the tinybus event bus library to the project.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
The `for_tests` constructor was gated behind `#[cfg(test)]`, which made it invisible to integration tests in `tests/` because those link the library compiled without `cfg(test)`. The attribute is replaced with `#[doc(hidden)]` so the method is always compiled and linkable, while still being kept out of the public documentation.

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

Update the integration test harness and a standalone test to pass a ProfileStore instance to FacetCache instead of a raw connection, ensuring the cache uses the store layer that will be required by the production code path.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
Remove the now-unused `crate::core::bus::BUS` imports across unit and integration tests, as the bus is no longer referenced directly in these test modules. This cleans up dead imports and reduces noise in the test code.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
This reverts commit 62067fa.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Moved the `ProfileStore` import after the `profile` submodule imports to follow Rust's convention of importing parent modules after their children, resolving a compiler warning about out-of-order imports.

Auto-committed-on: dragonfly
Co-authored-by: Medulla <medulla@tinyhumans.ai>
@senamakel
senamakel requested a review from a team August 9, 2026 11:02
@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 741c26d7-3fdc-46e9-adfb-39bf329d0f08

📥 Commits

Reviewing files that changed from the base of the PR and between c653135 and b826009.

📒 Files selected for processing (5)
  • docs/specs/memory-guard-allowlist.md
  • src/openhuman/memory/bypass_allowlist_tests.rs
  • src/openhuman/memory/diff/mod.rs
  • src/openhuman/memory/store/mod.rs
  • src/openhuman/tools/ops.rs

📝 Walkthrough

Walkthrough

The PR adds a typed ProfileStore, routes tool-memory operations through MemoryGuard, removes host-owned memory API shims, and updates production and test call sites to use tinycortex namespaces.

Changes

Memory boundary and ownership migration

Layer / File(s) Summary
Typed profile access and guarded tools
src/openhuman/memory/store/*, src/openhuman/agent/learning/*, src/openhuman/memory/sync/composio/providers/profile.rs, docs/specs/memory-guard-allowlist.md
ProfileStore now owns typed profile and facet operations. Learning and Composio paths use it instead of raw connections.
Guarded tool-memory operations
src/openhuman/memory/tool_memory/tools/*, src/openhuman/memory/ops/tool_memory.rs
Tool-memory listing and writing use MemoryGuard. Writes enforce readonly rejection, normalize through read-back, and add guarded tests.
Memory module ownership migration
src/openhuman/memory/conversations/*, src/openhuman/memory/diff/*, src/openhuman/memory/goals/*
Conversation, diff, and goals APIs now reference tinycortex modules. Host-side shims and re-exports are removed.
Dependent call-site migration
src/openhuman/**, tests/*
Agent, channel, desktop, security, subconscious, thread, and integration-test call sites use the updated conversation and diff namespaces.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ToolHandler
  participant MemoryGuard
  participant ToolMemoryStore
  ToolHandler->>MemoryGuard: request tool-memory capability
  MemoryGuard->>ToolMemoryStore: enforce tier and write rule
  ToolMemoryStore-->>MemoryGuard: return generated rule identifier
  MemoryGuard-->>ToolHandler: return normalized persisted rule
Loading

Possibly related PRs

Suggested labels: rust-core, memory

Suggested reviewers: m3ga-mind

Poem

A rabbit guards the memory gate,
With typed paws it stores each trait.
Tool rules hop through guarded ground,
Tinycortex paths now abound.
Old shims curl up out of sight—
Clean burrows, compiled right!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 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 PR's three primary refactors: profile SQLite confinement, guarded tool-memory access, and re-export shim removal.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot added memory Memory store, memory tree, recall, summarization, and embeddings in src/openhuman/memory/. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. labels Aug 9, 2026

@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: 3

Caution

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

⚠️ Outside diff range comments (1)
src/openhuman/security/credentials/ops.rs (1)

488-488: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Offload conversation purges from async auth flows.

Both changed call sites invoke synchronous TinyCortex conversation deletion inside async authentication/revalidation paths. A large pre-login workspace can block the executor and slow login/revalidation. Use an existing blocking wrapper such as memory::conversations::blocking::purge_threads and await it before continuing.

  • src/openhuman/security/credentials/ops.rs#L488-L488: offload the first-login purge before writing session storage.
  • src/openhuman/desktop/app_state/ops.rs#L514-L514: offload the pending-session revalidation purge before returning the reloaded configuration.
🤖 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/security/credentials/ops.rs` at line 488, Offload the
synchronous conversation purge from both async authentication flows: in
src/openhuman/security/credentials/ops.rs#L488-L488, replace
conversations::purge_threads in the first-login path with the existing blocking
wrapper and await it before writing session storage; apply the same change in
src/openhuman/desktop/app_state/ops.rs#L514-L514 for pending-session
revalidation, awaiting completion before returning the reloaded configuration.
🧹 Nitpick comments (4)
src/openhuman/memory/goals/tools.rs (1)

50-50: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Keep synchronous goals storage off tool executor tasks.

Line 50, Line 99, Line 151, and Line 199 call synchronous TinyCortex storage from async tool methods. A slow filesystem or mutation-lock wait can block the agent tool loop. Run the store operation through a blocking boundary and preserve the current ToolResult mapping. The published goals store documents synchronous filesystem operations and serialized mutations; verify the locked 0.1.0 API before merging. (docs.rs)

Also applies to: 99-99, 151-151, 199-199

🤖 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/memory/goals/tools.rs` at line 50, Update the async tool
methods containing the storage calls at load, create, update, and delete to
execute TinyCortex store operations through an async blocking boundary,
preventing synchronous filesystem or mutation-lock work from running on the tool
executor. Verify the locked TinyCortex 0.1.0 API and preserve each method’s
existing ToolResult success and error mapping.
src/openhuman/memory/goals/ops.rs (1)

35-37: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Keep synchronous goals storage off async RPC tasks.

Line 35, Line 42, Line 59, Line 66, Line 92, and Line 104 call synchronous TinyCortex storage from async RPC functions. Concurrent mutations can also wait on the process-wide store lock. Use one blocking helper for these calls and keep the existing RpcOutcome and error mappings. The published goals store documents synchronous filesystem operations and serialized mutations; verify the locked 0.1.0 API before merging. (docs.rs)

Also applies to: 42-42, 59-60, 66-67, 92-92, 104-104

🤖 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/memory/goals/ops.rs` around lines 35 - 37, Move the synchronous
TinyCortex storage calls in the affected async RPC functions into a shared
blocking helper, covering load and mutation operations at the referenced call
sites. Preserve each function’s existing RpcOutcome construction and error
mapping, and use the locked TinyCortex 0.1.0 API while ensuring concurrent
mutations remain serialized without blocking async RPC tasks.
src/openhuman/memory/driver/embedded/goals.rs (2)

56-56: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Keep goal storage off the async executor.

Line 56 and Line 67 call synchronous TinyCortex file APIs from async MemoryGoals methods. A slow filesystem or the process-wide mutation lock can block a runtime worker and delay unrelated memory requests. Use the existing blocking boundary or spawn_blocking for both calls, then map the result to host_error. The published TinyCortex goals store documents synchronous filesystem operations and a process-wide mutation lock; verify the locked 0.1.0 API before merging. (docs.rs)

Also applies to: 67-67

🤖 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/memory/driver/embedded/goals.rs` at line 56, Move both
synchronous TinyCortex calls in the async MemoryGoals methods, including
store::load at line 56 and the call at line 67, behind the existing blocking
boundary or spawn_blocking. Await the blocking operation, then preserve the
current result mapping to host_error for failures.

56-67: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Move synchronous goals-store I/O off async tasks.

The goals API currently calls TinyCortex store::load, store::save, add, edit, and delete synchronously from async fn paths. Run these calls through a shared blocking boundary, then preserve each caller’s error/response mapping. This addresses the embedded driver, enrichment load, list/add/edit/delete RPCs, reflection fallback loads, and tool callers.

🤖 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/memory/driver/embedded/goals.rs` around lines 56 - 67, The
synchronous TinyCortex goals-store operations must not run directly on async
tasks. Route store::load/save/add/edit/delete through the shared blocking
boundary while preserving each caller’s existing error and response mapping:
embedded driver goals load/set_goals in
src/openhuman/memory/driver/embedded/goals.rs:56-67; enrichment loading in
src/openhuman/memory/goals/enrich.rs:69-69; goals RPC operations in
src/openhuman/memory/goals/ops.rs:35-66 and 92-104; and tool callers in
src/openhuman/memory/goals/tools.rs:50-52, 99-102, 151-154, and 199-202.
🤖 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 `@docs/specs/memory-guard-allowlist.md`:
- Around line 118-120: Update the confinement statement in
memory-guard-allowlist.md to limit compiler-enforced coverage to the
profile_conn() and ProfileStore paths. Retain
agent/harness/archivist/lifecycle.rs::profile::profile_upsert as a documented
uncovered exception until it is removed or incorporated into the guard model,
and adjust the nearby test reference wording to match.

In `@src/openhuman/memory/conversations/mod.rs`:
- Around line 17-18: Restore the public re-export in the conversations module by
adding register_conversation_persistence_subscriber from the private bus module
to its public API. Keep bus private and expose the existing function through
memory::conversations.

In `@src/openhuman/memory/guard/audit.rs`:
- Around line 137-161: Add a per-operation correlation value to the audit
recorder and propagate it through the refusal publication and query paths,
updating `watermark`/`denied_for_since` or their callers so results match both
the driver ID and the originating operation. Ensure parallel tests sharing a
driver ID cannot observe or satisfy assertions with another operation’s records.

---

Outside diff comments:
In `@src/openhuman/security/credentials/ops.rs`:
- Line 488: Offload the synchronous conversation purge from both async
authentication flows: in src/openhuman/security/credentials/ops.rs#L488-L488,
replace conversations::purge_threads in the first-login path with the existing
blocking wrapper and await it before writing session storage; apply the same
change in src/openhuman/desktop/app_state/ops.rs#L514-L514 for pending-session
revalidation, awaiting completion before returning the reloaded configuration.

---

Nitpick comments:
In `@src/openhuman/memory/driver/embedded/goals.rs`:
- Line 56: Move both synchronous TinyCortex calls in the async MemoryGoals
methods, including store::load at line 56 and the call at line 67, behind the
existing blocking boundary or spawn_blocking. Await the blocking operation, then
preserve the current result mapping to host_error for failures.
- Around line 56-67: The synchronous TinyCortex goals-store operations must not
run directly on async tasks. Route store::load/save/add/edit/delete through the
shared blocking boundary while preserving each caller’s existing error and
response mapping: embedded driver goals load/set_goals in
src/openhuman/memory/driver/embedded/goals.rs:56-67; enrichment loading in
src/openhuman/memory/goals/enrich.rs:69-69; goals RPC operations in
src/openhuman/memory/goals/ops.rs:35-66 and 92-104; and tool callers in
src/openhuman/memory/goals/tools.rs:50-52, 99-102, 151-154, and 199-202.

In `@src/openhuman/memory/goals/ops.rs`:
- Around line 35-37: Move the synchronous TinyCortex storage calls in the
affected async RPC functions into a shared blocking helper, covering load and
mutation operations at the referenced call sites. Preserve each function’s
existing RpcOutcome construction and error mapping, and use the locked
TinyCortex 0.1.0 API while ensuring concurrent mutations remain serialized
without blocking async RPC tasks.

In `@src/openhuman/memory/goals/tools.rs`:
- Line 50: Update the async tool methods containing the storage calls at load,
create, update, and delete to execute TinyCortex store operations through an
async blocking boundary, preventing synchronous filesystem or mutation-lock work
from running on the tool executor. Verify the locked TinyCortex 0.1.0 API and
preserve each method’s existing ToolResult success and error mapping.
🪄 Autofix

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 Plus

Run ID: 08579b46-69d6-4011-a082-f6f7c03b2bf6

📥 Commits

Reviewing files that changed from the base of the PR and between 8774fe4 and fd3c88d.

⛔ Files ignored due to path filters (1)
  • app/src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (130)
  • docs/specs/memory-guard-allowlist.md
  • src/core/bus.rs
  • src/core/jsonrpc.rs
  • src/core/mod.rs
  • src/openhuman/agent/artifacts/store_tests.rs
  • src/openhuman/agent/bus.rs
  • src/openhuman/agent/harness/session/runtime_tests.rs
  • src/openhuman/agent/harness/session/turn/tools.rs
  • src/openhuman/agent/harness/subagent_runner/ops/graph.rs
  • src/openhuman/agent/learning/README.md
  • src/openhuman/agent/learning/cache.rs
  • src/openhuman/agent/learning/cache_tests.rs
  • src/openhuman/agent/learning/extract/signature.rs
  • src/openhuman/agent/learning/profile_md_renderer.rs
  • src/openhuman/agent/learning/prompt_sections.rs
  • src/openhuman/agent/learning/prompt_sections_tests.rs
  • src/openhuman/agent/learning/schemas.rs
  • src/openhuman/agent/learning/stability_detector.rs
  • src/openhuman/agent/learning/startup.rs
  • src/openhuman/agent/learning/tools.rs
  • src/openhuman/agent/orchestration/run_ledger_finalize.rs
  • src/openhuman/agent/orchestration/run_ledger_finalize_tests.rs
  • src/openhuman/agent/orchestration/tools/spawn_async_subagent.rs
  • src/openhuman/agent/orchestration/tools/spawn_subagent.rs
  • src/openhuman/agent/orchestration/tools/spawn_worker_thread.rs
  • src/openhuman/agent/orchestration/tools/tools_e2e_tests.rs
  • src/openhuman/agent/orchestration/tools/worker_thread.rs
  • src/openhuman/agent/task_session.rs
  • src/openhuman/agent/tinyagents/tools.rs
  • src/openhuman/agent/triage/escalation.rs
  • src/openhuman/agent/triage/evaluator.rs
  • src/openhuman/agent/triage/events.rs
  • src/openhuman/channels/bus.rs
  • src/openhuman/channels/host/adapters.rs
  • src/openhuman/channels/proactive.rs
  • src/openhuman/channels/providers/telegram/approval_surface.rs
  • src/openhuman/channels/providers/telegram/approval_surface_tests.rs
  • src/openhuman/channels/providers/telegram/bus.rs
  • src/openhuman/channels/providers/telegram/bus_tests.rs
  • src/openhuman/channels/providers/telegram/remote_control.rs
  • src/openhuman/channels/routes_tests.rs
  • src/openhuman/channels/runtime/dispatch/processor.rs
  • src/openhuman/channels/runtime/test_support.rs
  • src/openhuman/channels/tests/health.rs
  • src/openhuman/channels/tests/runtime_dispatch.rs
  • src/openhuman/config/ops/agent.rs
  • src/openhuman/cron/bus.rs
  • src/openhuman/cron/scheduler_tests.rs
  • src/openhuman/desktop/app_state/ops.rs
  • src/openhuman/desktop/notifications/bus.rs
  • src/openhuman/flows/bus.rs
  • src/openhuman/flows/ops.rs
  • src/openhuman/flows/ops_tests.rs
  • src/openhuman/inference/provider/factory_tests.rs
  • src/openhuman/inference/provider/openhuman_backend_model.rs
  • src/openhuman/inference/provider/ops/http_error.rs
  • src/openhuman/inference/provider/ops_tests.rs
  • src/openhuman/integrations/composio/ops/direct_mode.rs
  • src/openhuman/integrations/task_sources/bus.rs
  • src/openhuman/meet/backend_bot/calendar.rs
  • src/openhuman/memory/agent/memory_loader.rs
  • src/openhuman/memory/binding.rs
  • src/openhuman/memory/bypass_allowlist_tests.rs
  • src/openhuman/memory/conversations/blocking.rs
  • src/openhuman/memory/conversations/bus.rs
  • src/openhuman/memory/conversations/mod.rs
  • src/openhuman/memory/diff/mod.rs
  • src/openhuman/memory/diff/ops.rs
  • src/openhuman/memory/diff/rpc.rs
  • src/openhuman/memory/diff/tools.rs
  • src/openhuman/memory/diff/types.rs
  • src/openhuman/memory/driver/embedded/diff.rs
  • src/openhuman/memory/driver/embedded/goals.rs
  • src/openhuman/memory/global.rs
  • src/openhuman/memory/goals/enrich.rs
  • src/openhuman/memory/goals/mod.rs
  • src/openhuman/memory/goals/ops.rs
  • src/openhuman/memory/goals/store.rs
  • src/openhuman/memory/goals/tools.rs
  • src/openhuman/memory/guard/audit.rs
  • src/openhuman/memory/guard/mod.rs
  • src/openhuman/memory/guard/provider_tests.rs
  • src/openhuman/memory/ops/sync.rs
  • src/openhuman/memory/ops/tool_memory.rs
  • src/openhuman/memory/store/client.rs
  • src/openhuman/memory/store/client_tests.rs
  • src/openhuman/memory/store/mod.rs
  • src/openhuman/memory/store/profile_store.rs
  • src/openhuman/memory/store/profile_store_tests.rs
  • src/openhuman/memory/sync/composio/bus.rs
  • src/openhuman/memory/sync/composio/providers/profile.rs
  • src/openhuman/memory/sync_events.rs
  • src/openhuman/memory/sync_pipeline_e2e_tests.rs
  • src/openhuman/memory/tinycortex/sync.rs
  • src/openhuman/memory/tool_memory/tools/list.rs
  • src/openhuman/memory/tool_memory/tools/put.rs
  • src/openhuman/memory/tree/tree_runtime/bus.rs
  • src/openhuman/security/approval/gate.rs
  • src/openhuman/security/credentials/bus.rs
  • src/openhuman/security/credentials/ops.rs
  • src/openhuman/security/credentials/session_support.rs
  • src/openhuman/security/devices/bus.rs
  • src/openhuman/security/egress/emit_tests.rs
  • src/openhuman/security/keyring_consent/policy.rs
  • src/openhuman/skills/bus.rs
  • src/openhuman/skills/ops_create.rs
  • src/openhuman/skills/webhooks/bus.rs
  • src/openhuman/subconscious/profiles/memory.rs
  • src/openhuman/subconscious/profiles/memory_tests.rs
  • src/openhuman/subconscious/session.rs
  • src/openhuman/subconscious/user_thread.rs
  • src/openhuman/threads/ops.rs
  • src/openhuman/threads/ops_tests.rs
  • src/openhuman/threads/welcome_migration.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/voice/bus.rs
  • src/openhuman/web_chat/event_bus.rs
  • tests/agent_harness_e2e.rs
  • tests/calendar_grounding_e2e.rs
  • tests/composio_list_tools_stack_overflow_regression.rs
  • tests/config_auth_app_state_connectivity_e2e.rs
  • tests/json_rpc_e2e.rs
  • tests/learning_phase4_integration_test.rs
  • tests/monitor_agent_e2e.rs
  • tests/personality_e2e.rs
  • tests/raw_coverage/memory_core_threads_raw_coverage_e2e.rs
  • tests/subconscious_conversation_e2e.rs
  • tests/subconscious_fullstack_e2e.rs
  • tests/subconscious_triggers_e2e.rs
  • tests/transcript_search_e2e.rs
💤 Files with no reviewable changes (2)
  • src/openhuman/memory/diff/types.rs
  • src/openhuman/memory/goals/store.rs

Comment thread docs/specs/memory-guard-allowlist.md Outdated
Comment on lines +118 to +120
SQL statement against `user_profile` is inside the memory family, and the
compiler enforces that; `client_tests.rs::profile_conn_is_confined_to_the_memory_family`
restates the rule in a form that names the offending file.

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Narrow the profile-confinement claim.

Line 118 says every user_profile SQL statement is inside src/openhuman/memory. Line 142 documents agent/harness/archivist/lifecycle.rs::profile::profile_upsert writing through an injected connection outside that family. The document is internally inconsistent, even if that path is currently inert.

State that compiler-enforced confinement applies to the profile_conn() and ProfileStore paths. Keep profile_upsert documented as an uncovered exception until it is removed or included in the guard model.

Suggested wording
-Every SQL statement against `user_profile` is inside the memory family, and the compiler enforces that;
+SQL reached through `profile_conn()` and `ProfileStore` stays inside the memory family, and the compiler enforces that for this path;
🤖 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 `@docs/specs/memory-guard-allowlist.md` around lines 118 - 120, Update the
confinement statement in memory-guard-allowlist.md to limit compiler-enforced
coverage to the profile_conn() and ProfileStore paths. Retain
agent/harness/archivist/lifecycle.rs::profile::profile_upsert as a documented
uncovered exception until it is removed or incorporated into the guard model,
and adjust the nearby test reference wording to match.

Comment on lines 17 to 18
pub mod blocking;
mod bus;

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.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Restore the persistence-subscriber re-export.

bus is private. This module no longer exposes register_conversation_persistence_subscriber. Host startup code therefore cannot access the retained persistence integration through memory::conversations.

Add pub use bus::register_conversation_persistence_subscriber;.

🤖 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/memory/conversations/mod.rs` around lines 17 - 18, Restore the
public re-export in the conversations module by adding
register_conversation_persistence_subscriber from the private bus module to its
public API. Keep bus private and expose the existing function through
memory::conversations.

Comment thread src/openhuman/memory/guard/audit.rs Outdated
Comment on lines +137 to +161
/// How many refusals have been recorded so far, process-wide.
///
/// Take this before driving the code under test and pass it to
/// [`denied_for_since`] — sibling tests run in parallel, reuse the same
/// driver ids, and must not see each other's rows.
pub(crate) fn watermark() -> usize {
DENIED.lock().map(|log| log.len()).unwrap_or(0)
}

/// Refusals for `driver_id` recorded at or after `watermark`.
/// Non-draining: the log is shared, so nothing may consume from it.
pub(crate) fn denied_for_since(
watermark: usize,
driver_id: &str,
) -> Vec<(String, String, String)> {
DENIED
.lock()
.map(|log| {
log.iter()
.skip(watermark)
.filter(|(id, _, _)| id == driver_id)
.cloned()
.collect()
})
.unwrap_or_default()

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Isolate audit records per test operation.

Lines 139-161 do not isolate parallel test activity when sibling tests use the same driver ID. A sibling can append a matching denial after the watermark and before denied_for_since. The refusal test can then pass without its own operation publishing. The success test can also fail from an unrelated denial.

Add a per-operation correlation value to the recorder and query it. Alternatively, serialize tests that inspect this process-wide recorder.

🤖 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/memory/guard/audit.rs` around lines 137 - 161, Add a
per-operation correlation value to the audit recorder and propagate it through
the refusal publication and query paths, updating `watermark`/`denied_for_since`
or their callers so results match both the driver ID and the originating
operation. Ensure parallel tests sharing a driver ID cannot observe or satisfy
assertions with another operation’s records.

# Conflicts:
#	src/openhuman/agent/triage/escalation.rs
#	src/openhuman/agent/triage/events.rs
#	src/openhuman/inference/provider/factory_tests.rs
#	src/openhuman/inference/provider/ops_tests.rs
#	src/openhuman/memory/guard/audit.rs
#	src/openhuman/memory/guard/provider_tests.rs
@senamakel

Copy link
Copy Markdown
Member Author

Merged upstream/main (c7e15ba04) in — the earlier all-red CI was not this PR. Every failing job died at actions/checkout with fatal: No url found for submodule path 'app/src-tauri/vendor/tauri-cef' in .gitmodules: main at the time (8774fe4a1) carried two orphan gitlinks with no matching .gitmodules stanzas, reintroduced by the conflict resolution in 4d7a817f7. #5469 has since removed them, so this re-run should be clean.

Four files conflicted, all in the core::event_buscore::bus migration: memory/guard/{audit,provider_tests}.rs, inference/provider/{factory,ops}_tests.rs, plus agent/triage/{escalation,events}.rs. Resolved in upstream's favour throughout, and this PR's f14819bc6 stopgap is dropped as a result — upstream's version asserts strictly more. Ours recorded denials through a #[cfg(test)] seam at the call site, which would have passed even if BUS.publish were broken; upstream subscribes to the real bus, so it proves the event actually arrives. That was the right trade even though it costs determinism (upstream polls with a sleep).

Post-merge, everything that was previously red is green:

check before after
cargo test --lib openhuman::memory 1489 passed, 1 failed 1490 passed, 0 failed
cargo test --lib core:: 762 passed, 5 failed 768 passed, 0 failed
cargo check --tests 0 errors 0 errors
cargo test --test learning_phase4_integration_test 2 passed 2 passed
bypass ratchet (6 lint tests) pass pass
cargo check --no-default-features pass pass
scripts/check-kernel-floor.sh pass pass
cargo fmt --check clean clean

The six failures I had classified as pre-existing were indeed upstream's, and upstream's own repairs cleared them — so the "pre-existing" column in the PR description is now stale in this PR's favour.

@tinysweeper tinysweeper 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.

Requesting changes: 1 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0394 · 394,087 in / 139,242 out · 329,629 cached (84%) · z-ai/glm-5.2
critique:    $0.0267 · 154,358 in / 106,200 out · 131,371 cached (85%) · z-ai/glm-5.2
security:    $0.0078 · 131,963 in / 22,660 out  · 112,822 cached (85%) · z-ai/glm-5.2
tests:       $0.0014 · 36,167 in  / 2,186 out   · 28,919 cached (80%)  · z-ai/glm-5.2
description: $0.0022 · 37,911 in  / 5,472 out   · 28,311 cached (75%)  · z-ai/glm-5.2

self.store.list_all()
}

/// List active facets belonging to a specific class.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high critique likely

Update the class-filter list method to use store

The class-filter method between list_all and get is not in the diff, so it is unchanged. Its body previously used self.conn (the only field the old struct had), but the struct now has store: ProfileStore and no conn field. The unchanged method therefore references a field that no longer exists and will not compile. It needs to be converted to self.store.list_active_by_class(...) (or the equivalent ProfileStore method) like the siblings above and below it.

[RULE] untrusted-repo-rules ·

),
];
for (facet_id, key, value) in rows {
store

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high critique likely

Seeded facets use Workflow but the legacy oracle filters facet_type = 'skill'

The seeded rows are inserted with FacetType::Workflow, but legacy_like_query filters WHERE facet_type = 'skill'. On this seed data that legacy query can never match, so it returns false for every case. skill_identity_matches_agrees_with_the_legacy_like_query then asserts store.skill_identity_matches(...) == legacy for all cases, and immediately afterward asserts store.skill_identity_matches("skill:%:%:email", "user@example.com") is true. Those cannot both hold: if skill_identity_matches also filters by facet_type = 'skill' it returns false and the non-vacuity assertion fails; if it does not (e.g. it only matches on the key prefix), it returns true on the cross-toolkit case where legacy is false and the equality assertion fails. The seed should almost certainly insert these rows as FacetType::Skill, not FacetType::Workflow, so that the legacy 'skill' filter can actually hit.

**[RULE] ** ·


use crate::openhuman::agent::task_board::TaskBoardCard;
use crate::openhuman::memory::conversations::{
use tinycortex::memory::conversations::{

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high critique uncertain

Dropped openhuman segment when switching to external crate path

The import path was changed from crate::openhuman::memory::conversations to tinycortex::memory::conversations, dropping the openhuman segment. Since this file lives under src/openhuman/agent/, the crate's module tree almost certainly still has openhuman as a parent module, meaning the public path would be tinycortex::openhuman::memory::conversations (if the external-name self-reference is even intended). The new path as written likely fails to resolve, or resolves to a different item than the original import. If the intent was to switch from the internal crate:: prefix to the external crate name, the openhuman segment should still be present.

[RULE] Report only problems this pull request introduces. ·

pub mod blocking;
mod bus;

pub use bus::register_conversation_persistence_subscriber;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high critique uncertain

Removing the pub use re-exports breaks any caller still on the old import path

The diff removes the pub use tinycortex::memory::conversations::{ … } re-export that the prior module doc explicitly said existed so that "the ~30 host consumers … keep their import paths … unchanged." If any caller still imports these types through openhuman::memory::conversations::* (or through openhuman::memory's own re-export of this module), removing the pub use will break compilation. I can only see this one file, so I cannot confirm whether every consumer was migrated to name tinycortex::memory::conversations directly as the new doc claims; if any were missed, this change breaks them.

**[RULE] ** ·

@@ -511,7 +511,7 @@ async fn activate_revalidated_user_dir(user_id: &str) -> Result<Config, String>
);
if previous_active.is_none() {
let pre_ws = crate::openhuman::config::pre_login_user_dir(&root_dir).join("workspace");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium critique likely

Verify tinycortex crate path resolves and matches adjacent internal path

The diff changes the crate path for purge_threads from crate::openhuman::memory::conversations to tinycortex::memory::conversations, but the immediately preceding line still accesses config via the internal path crate::openhuman::config::pre_login_user_dir. If memory has been extracted into an external tinycortex crate while config remained in the internal openhuman module tree, the two-line span is consistent and this is fine. But if tinycortex is not a declared dependency, or if memory still lives under crate::openhuman::, this change will not compile. The repository's own rules consistently reference src/openhuman/ module paths and never mention a tinycortex crate, which makes the path switch suspect. At minimum the adjacent-line inconsistency should be confirmed: the author should verify that tinycortex::memory::conversations::purge_threads resolves and that the mismatch with crate::openhuman::config on the line above is intentional rather than a half-applied refactor.

[RULE] correctness ·


use super::source::ChunkStoreItemSource;
use super::types::*;
use tinycortex::memory::diff::types::*;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium critique uncertain

Import switched from local super::types to external crate path

The import is changed from the local module (super::types, i.e. openhuman::memory::diff::types) to an external crate path (tinycortex::memory::diff::types). If the local types module defines or re-exports types that differ from — or are a superset of — what tinycortex provides, ops.rs will either fail to compile or silently use distinct types that its callers (which still reference openhuman::memory::diff::types through super::types) do not expect. Even when names match, two types from different crates are not interchangeable in Rust, so any function in ops.rs that returns or accepts these types would be returning a different type than the rest of the openhuman::memory::diff module expects. This is only safe if super::types was a pure re-export of tinycortex::memory::diff::types, which the diff does not establish.

[RULE] ops.rs handlers return RpcOutcome&lt;T&gt; and delegate from schemas.rs. ·

@tinysweeper

tinysweeper Bot commented Aug 10, 2026

Copy link
Copy Markdown

What this change touches

63 files, +889 -404 across 4 components. The code graph knows nothing about these files yet — normal for newly added files, and a cold index otherwise.

flowchart LR
  n0["src/openhuman<br/>56 files +817 -364<br/>6 findings"]:::blocking
  n1["docs/specs<br/>1 file +58 -24"]:::changed
  n2["tests<br/>5 files +13 -13"]:::changed
  n3["tests/raw_coverage<br/>1 file +1 -3"]:::changed
  classDef changed fill:#0d4429,stroke:#238636,color:#e6edf3
  classDef impacted fill:#161b22,stroke:#6e7681,color:#c9d1d9
  classDef flagged fill:#5a1e02,stroke:#d93f0b,color:#ffffff
  classDef blocking fill:#67060c,stroke:#f85149,color:#ffffff
Loading

Green: changed. Grey: untouched, reached through an import or a call. Orange: has findings. Red: has a finding that blocks the merge.

Component Files Lines Findings
src/openhuman changed 56 +817 -364 6 (high)
docs/specs changed 1 +58 -24
tests changed 5 +13 -13
tests/raw_coverage changed 1 +1 -3
Changed files

src/openhuman

  • src/openhuman/agent/harness/subagent_runner/ops/graph.rs
  • src/openhuman/agent/learning/README.md
  • src/openhuman/agent/learning/cache.rs
  • src/openhuman/agent/learning/cache_tests.rs
  • src/openhuman/agent/learning/profile_md_renderer.rs
  • src/openhuman/agent/learning/prompt_sections.rs
  • src/openhuman/agent/learning/prompt_sections_tests.rs
  • src/openhuman/agent/learning/schemas.rs
  • src/openhuman/agent/learning/stability_detector.rs
  • src/openhuman/agent/learning/startup.rs
  • src/openhuman/agent/learning/tools.rs
  • src/openhuman/agent/orchestration/tools/spawn_async_subagent.rs
  • …and 44 more files

docs/specs

  • docs/specs/memory-guard-allowlist.md

tests

  • tests/learning_phase4_integration_test.rs
  • tests/personality_e2e.rs
  • tests/subconscious_fullstack_e2e.rs
  • tests/subconscious_triggers_e2e.rs
  • tests/transcript_search_e2e.rs

tests/raw_coverage

  • tests/raw_coverage/memory_core_threads_raw_coverage_e2e.rs

tinysweeper 0.1.0

@tinysweeper tinysweeper Bot added the priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition. label Aug 10, 2026
@senamakel
senamakel merged commit b4803c2 into tinyhumansai:main Aug 10, 2026
12 of 17 checks passed
senamakel added a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
…e\n\nrefactor(memory): confine raw profile SQLite, guard the tool_memory tools, collapse three re-export shims\n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

memory Memory store, memory tree, recall, summarization, and embeddings in src/openhuman/memory/. priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition. 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.

1 participant