Skip to content

Connector syncs stopped feeding the memory tree after the TinyCortex migration #5473

Description

@yh928

Summary

96c370314 (#4794) deleted the per-provider source.rs modules that batch-ingested each connector's synced items into the memory tree. The replacement pipeline writes to the base namespace store only, so the summary tree has received nothing from Gmail, Slack, Notion, GitHub, Linear, or ClickUp since. Reconnect the tree-ingest side on the new engine.

Problem

The migration replaced the connector sync pipeline and did not carry over its tree-ingest half. Deleted in that commit:

memory_sync/composio/providers/gmail/source.rs      ← "Batch-ingest the page's new
memory_sync/composio/providers/gmail/ingest.rs         messages into the memory tree"
                             slack/source.rs           (ingest_page_into_memory_tree_with_outcome)
                             notion/source.rs
                             github/source.rs
                             linear/source.rs
                             clickup/source.rs

Nothing replaced them. tree_summarizer_ingest has no production caller — only the RPC handler and the CLI — so on the current tree the only way to add tree content is an explicit operator call.

Observed on a live instance:

gmail base namespace current — syncs run several times a day, documents and chunks landing continuously
gmail tree source 620 chunks, newest content dated 2026-07-14, nothing since
conversations:agent tree source still growing (chat has its own path)

The sync audit log shows the connector itself is healthy: 6 syncs on the observation day, 13 items on a manually triggered one. The items reach skill-gmail; they never reach mem_tree_chunks.

Note this is the same commit that removed the only caller of the Composio response reshape (restored separately via ReshapingExecutor). Two halves of the sync path came off in the same migration; only one has been put back.

Solution (optional)

Reconnect tree ingestion in the new pipeline — memory::tinycortex::sync is where the connector run now lives — rather than reviving the deleted modules. The old code ingested per page with a partial-ingest outcome (item_ids_ingested) that drove the cursor, so the replacement needs the same property: a short ingest must not advance the cursor past items that were never stored.

Worth deciding as part of this:

  • Scope. All six connectors regressed together. Doing one and leaving five is the state we are already in.
  • Backfill. Existing installs have a gap between the migration and the fix. A re-ingest of already-synced documents would close it; doing nothing leaves a permanent hole in the tree.
  • Cost. Tree ingest means sealing, which means summarization calls. On a large mailbox a naive backfill is expensive, and the summarizer is consent-gated when local AI is off.

Acceptance criteria

  • Synced connector items reach the tree — a Gmail sync adds mem_tree_chunks rows for the newly ingested messages.
  • All six connectors — gmail, slack, notion, github, linear, clickup.
  • Partial ingest does not advance the cursor — the property the deleted item_ids_ingested outcome carried.
  • Regression coverage — a test that fails if the sync path stops writing tree chunks, so this cannot come off silently a third time.
  • Backfill decided — implemented, or explicitly declined with the gap documented.
  • Diff coverage ≥ 80% — the implementing PR meets the changed-lines coverage gate.

Related

  • 96c370314 (refactor(memory): complete TinyCortex engine migration #4794) — the migration that dropped it.
  • src/openhuman/memory/tinycortex/sync.rs — where the connector run lives now.
  • src/openhuman/memory/sources/status.rs — reports MAX(timestamp_ms) as "Last chunk", which is the content date, not the write time; that is why the freeze read as "22 days ago" rather than "stopped at the migration".

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

priority: p1Next. Wrong behaviour a user will hit, or a security weakness behind a condition.

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions