Skip to content

fix(memory): bound ingestion queue to prevent OOM under runaway producers#2451

Open
M3gA-Mind wants to merge 6 commits into
tinyhumansai:mainfrom
M3gA-Mind:fix/memory-ingestion-bounded-queue
Open

fix(memory): bound ingestion queue to prevent OOM under runaway producers#2451
M3gA-Mind wants to merge 6 commits into
tinyhumansai:mainfrom
M3gA-Mind:fix/memory-ingestion-bounded-queue

Conversation

@M3gA-Mind
Copy link
Copy Markdown
Contributor

@M3gA-Mind M3gA-Mind commented May 21, 2026

Summary

  • Replace mpsc::unbounded_channel with mpsc::channel(512) in IngestionQueue — caps peak memory at a bounded upper limit under any producer burst.
  • submit() now uses try_send() and distinguishes TrySendError::Full (shed job, log warn, return false) from TrySendError::Closed (worker gone, existing behaviour).
  • Add start_worker_with_capacity for deterministic backpressure tests; start_worker_with_state delegates to it with the default 512 cap.
  • Export DEFAULT_QUEUE_CAPACITY from ingestion::mod so callers can reference the constant.

Problem

start_worker_with_state used mpsc::unbounded_channel, allowing a misbehaving skill or sync loop calling put_doc in a tight loop to enqueue indefinitely while the single-threaded worker drains one job at a time (seconds-to-minutes each). At typical doc sizes the channel would consume unbounded memory before the worker caught up — an OOM kill with no user-visible warning.

Solution

Bounded channel at capacity 512 absorbs realistic bursts (bulk Notion/Slack backfill, ~200-doc skill syncs) while hard-capping memory pressure. When full, submit() logs a warning and returns false; both existing call sites in client.rs already ignore the return value, so producer behaviour under normal load is unchanged.

Submission Checklist

  • Tests added: submit_when_full_returns_false and submit_when_worker_gone_returns_false in queue.rs
  • Diff coverage ≥ 80% — both new branches covered by tests; cargo test passes clean
  • Coverage matrix updated — N/A: behaviour-only change in Rust core, no new public RPC surface
  • All affected feature IDs from matrix listed under Related — N/A
  • No new external network dependencies
  • Manual smoke checklist updated — N/A: no release-cut surface changed
  • Linked issue closed via Closes #2442 in Related

Impact

  • Rust core only — no Tauri shell, no frontend changes.
  • Memory ingestion throughput unchanged for normal load; excess jobs are shed (logged) rather than queued unboundedly.
  • Desktop: macOS / Windows / Linux.

Related


AI Authored PR Metadata

Linear Issue

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: fix/memory-ingestion-bounded-queue
  • Commit SHA: COMMIT_SHA_PLACEHOLDER

Validation Run

  • pnpm --filter openhuman-app format:check
  • pnpm typecheck — N/A (Rust-only change)
  • Focused tests: cargo test -p openhuman queue — 2 new tests pass
  • Rust fmt/check: cargo fmt --all -- --check passes, cargo clippy -p openhuman clean
  • Tauri fmt/check: N/A (no Tauri shell changes)

Validation Blocked

  • command: N/A
  • error: N/A
  • impact: N/A

Behavior Changes

  • Intended behavior change: ingestion queue is now bounded at 512 slots
  • User-visible effect: none under normal load; under runaway producer, core stays alive and logs a warning instead of OOM-crashing

Parity Contract

  • Legacy behavior preserved: start_worker_with_state signature unchanged; both put_doc / store_skill_sync call sites unaffected
  • Guard/fallback/dispatch parity: Closed arm matches previous send error handling

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A
  • Canonical PR: this one
  • Resolution: N/A

Summary by CodeRabbit

  • Refactor

    • Ingestion queue migrated from unbounded to bounded with a sensible default capacity and configurable worker queue size; improved handling and distinct logging when the queue is full or when the worker is unavailable.
    • Default queue capacity is now exposed in the module's public API.
  • Tests

    • Added tests for queue backpressure, worker-unavailable rejection, and recovery after the queue drains.
  • Localization

    • Added German translations for MCP server UI and configuration texts.

Review Change Stack

@M3gA-Mind M3gA-Mind requested a review from a team May 21, 2026 14:16
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 21, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Switch ingestion from an unbounded to a bounded Tokio mpsc channel (DEFAULT_QUEUE_CAPACITY). IngestionQueue stores a bounded sender and capacity; submit uses try_send to surface Full vs Closed; worker startup accepts capacity. Tests exercise full, closed, and recovery scenarios. Also add German i18n entries for MCP Server UI.

Changes

Bounded ingestion queue with backpressure

Layer / File(s) Summary
Queue capacity constant and re-export
src/openhuman/memory/ingestion/queue.rs, src/openhuman/memory/ingestion/mod.rs
Adds DEFAULT_QUEUE_CAPACITY constant (512) and re-exports it from the ingestion module.
IngestionQueue internals (bounded sender + capacity field)
src/openhuman/memory/ingestion/queue.rs
IngestionQueue now stores a bounded tokio::sync::mpsc::Sender<IngestionJob> and a capacity: usize field.
Submit method with Full and Closed handling
src/openhuman/memory/ingestion/queue.rs
submit uses non-blocking try_send, treats Full and Closed separately, rolls back queue-depth on failure, logs distinct warnings, and returns false on rejection.
Worker startup refactoring with capacity parameter
src/openhuman/memory/ingestion/queue.rs
Adds start_worker_with_capacity which creates a bounded channel, spawns the worker with mpsc::Receiver, logs capacity, and has start_worker_with_state delegate to it.
Test helpers and backpressure coverage
src/openhuman/memory/ingestion/queue.rs
Adds test-only IngestionQueue::from_parts(capacity) and updates tests to cover closed-channel rejection, full-queue rejection (with depth rollback), and recovery after draining.

German i18n chunk

Layer / File(s) Summary
de-5 translation mappings
app/src/lib/i18n/chunks/de-5.ts
Insert new German translations for MCP Server UI: headings, actions, error messages, and common MCP client labels.

Sequence Diagram(s)

sequenceDiagram
  participant Producer
  participant IngestionQueue
  participant IngestionState
  participant IngestionWorker
  Producer->>IngestionQueue: submit(IngestionJob) via try_send
  IngestionQueue->>IngestionState: enqueue() (increment)
  IngestionQueue-->>Producer: return true (accepted) / false (Full or Closed)
  IngestionWorker->>IngestionQueue: receive job from bounded mpsc::Receiver
  IngestionWorker->>IngestionState: acquire() (process job)
  IngestionWorker-->>IngestionState: release() (decrement handled by enqueue/worker logic)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

I am a rabbit in the queue's soft light,
I nibble caps where once grew boundless blight.
Now bounded hops keep memory in play,
Backpressure hums and jobs politely stay.
Hooray — the worker dreams; the core sleeps tight. 🐰✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes out-of-scope changes: translation additions to app/src/lib/i18n/chunks/de-5.ts (MCP server i18n) are unrelated to the memory ingestion queue fix specified in issue #2442. Remove i18n changes from this PR and file a separate PR for the German translation additions, or explain the necessity of bundling them together in the description.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'fix(memory): bound ingestion queue to prevent OOM under runaway producers' accurately and concisely describes the main change: replacing an unbounded MPSC queue with a bounded one to address memory exhaustion risk.
Linked Issues check ✅ Passed The PR fully satisfies all coding requirements from issue #2442: replaces unbounded channel with bounded (512 capacity), implements try_send with distinct Full/Closed handling, exports DEFAULT_QUEUE_CAPACITY, and includes comprehensive test coverage.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@coderabbitai coderabbitai Bot added the rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. label May 21, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/openhuman/memory/ingestion/queue.rs (1)

137-140: ⚡ Quick win

Use debug! for this worker lifecycle log.

background worker started is diagnostic state-transition logging, so info! is noisier than the repo convention for this class of event.

As per coding guidelines, src/**/*.rs: Use log or tracing crate at debug or trace level for Rust diagnostic logs.

🤖 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/ingestion/queue.rs` around lines 137 - 140, Change the
lifecycle log from info to debug: replace the log::info! invocation that emits
"[memory:ingestion_queue] background worker started (capacity={})" with a debug!
call so this diagnostic state-transition uses debug level; ensure the debug
macro from the log/tracing crate is in scope (or import it) and keep the same
message and capacity argument, targeting the background worker startup code in
the ingestion queue (the line that currently calls log::info! with capacity).
🤖 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 `@src/openhuman/memory/ingestion/queue.rs`:
- Around line 44-49: The backpressure log currently hardcodes the default
capacity constant; change the queue handle to store the actual capacity used
when created (add a capacity field to IngestionQueue or the public handle
returned by start_worker_with_capacity), set that field inside
start_worker_with_capacity when you create the mpsc channel, and update every
TrySendError::Full log path (including the send path and the other occurrences
mentioned) to log self.capacity (or handle.capacity) instead of the
DEFAULT_QUEUE_CAPACITY constant so the message reflects the real configured
queue size.
- Around line 237-271: Add a new test that exercises the recovery path after
transient backpressure: create an IngestionState and an mpsc channel with
capacity >1, fill the channel slot directly (e.g.,
tx.try_send(make_dummy_job("filler"))), construct the IngestionQueue via
IngestionQueue::from_parts(tx, state.clone()), assert that queue.submit(...)
initially returns false due to Full, then drain the channel (receive the
buffered item from the receiver) and call queue.submit(...) again and assert it
now returns true and that state.snapshot().queue_depth reflects the enqueued
job; use make_dummy_job to create jobs and mirror the style of the existing
submit_when_full_returns_false test to prove recovery works.

---

Nitpick comments:
In `@src/openhuman/memory/ingestion/queue.rs`:
- Around line 137-140: Change the lifecycle log from info to debug: replace the
log::info! invocation that emits "[memory:ingestion_queue] background worker
started (capacity={})" with a debug! call so this diagnostic state-transition
uses debug level; ensure the debug macro from the log/tracing crate is in scope
(or import it) and keep the same message and capacity argument, targeting the
background worker startup code in the ingestion queue (the line that currently
calls log::info! with capacity).
🪄 Autofix (Beta)

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

Run ID: 25cb53a9-5666-4d71-a2b7-506169cc0971

📥 Commits

Reviewing files that changed from the base of the PR and between ec9708a and 05f577d.

📒 Files selected for processing (2)
  • src/openhuman/memory/ingestion/mod.rs
  • src/openhuman/memory/ingestion/queue.rs

Comment thread src/openhuman/memory/ingestion/queue.rs
Comment thread src/openhuman/memory/ingestion/queue.rs
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/openhuman/memory/ingestion/queue.rs (1)

250-274: ⚡ Quick win

Remove unused variables and misleading comment.

The tx and _rx created on lines 252-253 are never used for testing; the comment on line 254 says "Fill the channel slot" but the subsequent code creates different channels (tx2 for the Closed test, tx3 for the Full test). The unused tx is only dropped on line 273 to silence a warning, which makes the test harder to follow.

♻️ Simplify test by removing unused setup
 #[tokio::test]
 async fn submit_when_full_returns_false() {
     let state = IngestionState::new();
-    let (tx, _rx) = mpsc::channel::<IngestionJob>(1);
-    // Fill the channel slot with a dummy send so it's full.
     let (tx2, rx2) = mpsc::channel::<IngestionJob>(1);
     drop(rx2); // closed channel — worker gone

     // Test the Closed branch via from_parts with a closed receiver.
     let queue = IngestionQueue::from_parts(tx2, state.clone(), 1);
     assert!(!queue.submit(make_dummy_job("orphan")));
     assert_eq!(state.snapshot().queue_depth, 0);

     // Test the Full branch: capacity-1 channel, fill it, then try another.
     let state2 = IngestionState::new();
     let (tx3, _rx3) = mpsc::channel::<IngestionJob>(1);
     // Send one item to fill it (bypassing submit to avoid incrementing state).
     tx3.try_send(make_dummy_job("filler")).ok();
     let queue2 = IngestionQueue::from_parts(tx3, state2.clone(), 1);
     assert!(!queue2.submit(make_dummy_job("overflow")));
     // Depth should be 0 — enqueue was rolled back.
     assert_eq!(state2.snapshot().queue_depth, 0);
-
-    drop(tx); // silence unused warning
 }
🤖 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/ingestion/queue.rs` around lines 250 - 274, The test
submit_when_full_returns_false contains unused variables tx and _rx and a
misleading comment; remove the unused channel creation (tx, _rx) and the final
drop(tx) no-op, and update the comment that currently reads "Fill the channel
slot" to accurately describe the two separate setups (closed receiver via
tx2/rx2 and pre-filled channel via tx3) so readers can follow the Closed and
Full branches tested using IngestionQueue::from_parts and the
IngestionQueue::submit assertions against state and state2.
🤖 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.

Nitpick comments:
In `@src/openhuman/memory/ingestion/queue.rs`:
- Around line 250-274: The test submit_when_full_returns_false contains unused
variables tx and _rx and a misleading comment; remove the unused channel
creation (tx, _rx) and the final drop(tx) no-op, and update the comment that
currently reads "Fill the channel slot" to accurately describe the two separate
setups (closed receiver via tx2/rx2 and pre-filled channel via tx3) so readers
can follow the Closed and Full branches tested using IngestionQueue::from_parts
and the IngestionQueue::submit assertions against state and state2.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 894f5d0e-c39c-4dbd-b65e-06a085c368d0

📥 Commits

Reviewing files that changed from the base of the PR and between 05f577d and 3e9af60.

📒 Files selected for processing (1)
  • src/openhuman/memory/ingestion/queue.rs

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 21, 2026
@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

The test / Rust Core Tests (Windows — secrets ACL) failure is a CI infrastructure flake — the tests themselves passed 53/0 (all test result: ok) but the sccache action exited non-zero due to cache_write_errors: 495. The same check passed on PR #2452 which includes similar Rust core changes. Re-running the failed job.

Copy link
Copy Markdown
Contributor

@graycyrus graycyrus left a comment

Choose a reason for hiding this comment

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

Solid fix — bounded channel at 512 with proper try_send backpressure is exactly right for this. Tests cover all three paths (full, closed, recovery). Clean PR, one minor nit below.

File Change
queue.rs unbounded_channelchannel(512), sendtry_send with Full/Closed arms, capacity field, 3 tests
mod.rs Re-export DEFAULT_QUEUE_CAPACITY

mod tests {
use super::*;
use tokio::sync::mpsc;

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.

[minor] Dead channel — (tx, _rx) is created here but never used (just drop(tx) at the end to silence the warning). The comment on the next line ("Fill the channel slot…") is a leftover from an earlier draft and doesn't match the code. Safe to remove both the allocation and the stale comment.

@coderabbitai coderabbitai Bot added memory Memory store, memory tree, recall, summarization, and embeddings in src/openhuman/memory/. bug labels May 21, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 21, 2026
@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

Addressed the nit in two commits:

  • 82883f5e — removed the dead (tx, _rx) allocation and its stale comment
  • 19459fd7 — removed the residual drop(tx) at the end of the test body that 82883f5e had missed (caused a compile error in CI — fixed immediately)

Test compiles cleanly locally (cargo check passes). CI running now.

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 22, 2026
@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

The test / i18n Coverage failure is pre-existing main breakage, unrelated to this PR's Rust changes.

Root cause: commit 4e5eaa71 (feat(settings): add MCP server configuration panel) landed on main and added 18 settings.mcpServer.* / settings.developerMenu.mcpServer.* keys to en.ts but never added translations to any of the 12 locale files. Every PR whose CI merge commit includes that commit will hit this failure until translations are added.

This PR only touches src/openhuman/memory/ingestion/queue.rs (Rust) — zero i18n files changed.

The fix needs to come from the author of 4e5eaa71 or any contributor adding the missing keys to app/src/lib/i18n/{es,fr,de,pt,ru,id,it,…}.ts.

@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

All three CI failures on this PR share the same root cause (none introduced by this PR):

Failing job Failing test(s)
test / i18n Coverage pnpm i18n:check — 18 missing keys reported for every locale
test / Frontend Unit Tests coverage.test.ts > locale de defines every English key; I18nContext.test.tsx > keeps the German locale complete against English keys
Frontend Coverage (Vitest) same two tests, coverage run

Root cause: commit 4e5eaa71 (feat(settings): add MCP server configuration panel) added 18 settings.mcpServer.* / settings.developerMenu.mcpServer.* keys to en.ts and chunks/en-5.ts, and also added de to the LOCALES test array in coverage.test.ts, but did not add the corresponding keys to any locale's chunk files (de-5.ts, es-5.ts, fr-5.ts, etc.).

Every PR whose CI merge commit includes that commit will fail these checks until the translations are added to the locale chunk files. This PR's changes are purely in src/openhuman/memory/ingestion/queue.rs (Rust).

The fix belongs in app/src/lib/i18n/chunks/{de,es,fr,zh-CN,hi,ar,bn,pt,ru,id,it}-5.ts — adding the 18 MCP server keys, even as English-identical placeholders to unblock CI.

M3gA-Mind added 5 commits May 22, 2026 13:37
…cers

Replaces the unbounded mpsc channel in IngestionQueue with a bounded one
(DEFAULT_QUEUE_CAPACITY = 512). try_send now distinguishes Full (shed job,
log warn) from Closed (worker gone), and start_worker_with_capacity allows
tests to exercise backpressure deterministically.

Closes tinyhumansai#2442
- Store actual `capacity` field on `IngestionQueue` so the Full-path warn
  log reflects the real configured size instead of `DEFAULT_QUEUE_CAPACITY`
- Demote worker-start lifecycle log from `info!` to `debug!` per repo
  convention for diagnostic state-transition events
- Update `from_parts` (test helper) to accept a `capacity` argument
- Add `submit_recovers_after_backpressure` test: fills channel, asserts
  submit returns false, drains one slot, asserts subsequent submit returns
  true and queue_depth increments correctly
…l test

Removes the unused `(tx, _rx)` binding and its stale comment that was left
over from an earlier draft of the test. The two test cases (closed channel
and full channel) are fully expressed by `tx2/rx2` and `tx3/_rx3`.
Commit 82883f5 removed the dead (tx, _rx) allocation but missed the
accompanying drop(tx) at end of the test body, causing a compile error.
Commit 4e5eaa7 added 18 settings.mcpServer.* / settings.developerMenu.mcpServer.*
keys to en.ts and en-5.ts but omitted the German locale (de-5.ts). Every other
locale already has these keys. Adding English-identical placeholder strings so the
i18n coverage and locale-completeness unit tests pass while proper translations are
pending.
@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

Follow-up: fixed the i18n failures directly rather than waiting for a separate PR.

What I found: de-5.ts was the only locale chunk missing the 18 settings.mcpServer.* keys — all 10 other locales already had them. The omission was from commit 4e5eaa71 which added the German locale in the same batch but didn't fill in the MCP server section.

Fix (commit 6dedd4c9): Added the 18 keys to app/src/lib/i18n/chunks/de-5.ts as English-identical placeholder strings (matching what every other locale has). Branch was also rebased onto main to incorporate the German locale files that didn't exist when this branch was originally cut.

pnpm i18n:check exits 0 locally. coverage.test.ts and I18nContext.test.tsx pass locally. CI running now.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/openhuman/memory/ingestion/queue.rs (1)

250-270: 💤 Low value

Consider splitting test or renaming for clarity.

submit_when_full_returns_false actually tests both the Closed path (lines 253-259) and the Full path (lines 261-269), but the name only describes the Full scenario. Since submit_when_worker_gone_returns_false already covers the Closed case in isolation, the first half of this test is redundant.

You could either remove lines 252-259 (Closed is tested elsewhere) or rename this test to reflect both scenarios—but the coverage is correct as-is.

🤖 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/ingestion/queue.rs` around lines 250 - 270, The test
submit_when_full_returns_false mixes two cases (Closed and Full); either remove
the redundant Closed portion (the block using rx2/drop and
IngestionQueue::from_parts(tx2, state.clone(), 1)) since
submit_when_worker_gone_returns_false already covers the Closed path, or rename
the test to something like submit_when_closed_or_full_returns_false to reflect
both branches; update assertions/comments accordingly and keep the second block
that fills the channel (tx3.try_send(...), IngestionQueue::from_parts(tx3,
state2.clone(), 1), assert!(!queue2.submit(...)),
assert_eq!(state2.snapshot().queue_depth, 0)).
🤖 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.

Nitpick comments:
In `@src/openhuman/memory/ingestion/queue.rs`:
- Around line 250-270: The test submit_when_full_returns_false mixes two cases
(Closed and Full); either remove the redundant Closed portion (the block using
rx2/drop and IngestionQueue::from_parts(tx2, state.clone(), 1)) since
submit_when_worker_gone_returns_false already covers the Closed path, or rename
the test to something like submit_when_closed_or_full_returns_false to reflect
both branches; update assertions/comments accordingly and keep the second block
that fills the channel (tx3.try_send(...), IngestionQueue::from_parts(tx3,
state2.clone(), 1), assert!(!queue2.submit(...)),
assert_eq!(state2.snapshot().queue_depth, 0)).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 90108797-f45d-42af-9cf1-144608e6e021

📥 Commits

Reviewing files that changed from the base of the PR and between 19459fd and 6dedd4c.

📒 Files selected for processing (3)
  • app/src/lib/i18n/chunks/de-5.ts
  • src/openhuman/memory/ingestion/mod.rs
  • src/openhuman/memory/ingestion/queue.rs
✅ Files skipped from review due to trivial changes (1)
  • src/openhuman/memory/ingestion/mod.rs

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 22, 2026
subconscious.providerUnavailableTitle and subconscious.providerSettings
were present in all other locale chunk-3 files but absent from de-3.ts.
Adding English-identical placeholder strings to unblock i18n coverage.
@M3gA-Mind
Copy link
Copy Markdown
Contributor Author

One more batch of missing German keys found and fixed (commit 713cabb2):

  • subconscious.providerUnavailableTitle → 'Subconscious is paused'
  • subconscious.providerSettings → 'AI settings'

These belonged in de-3.ts (chunk 3 had 357/359 keys). Again, all other locales already had them. pnpm i18n:check exits 0 locally after both fixes. CI running now.

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

Labels

bug 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Memory ingestion queue is unbounded — buggy producer can OOM the core

2 participants