Follow-ups deferred from the 2026-07 audit remediation (#12). These are the performance and memory-growth findings that were verified during the audit but intentionally not fixed in that PR — either they need design work beyond a minimal patch or they're low-priority cold paths.
Deferred from the hot-path package (need design decisions)
Deferred from the memory-growth package (unbounded growth in long-lived processes)
Deferred cold-path scans (cheap fixes, low impact)
Deferred low-priority harness items
Line numbers omitted intentionally — #12 restructured most of these files; the module paths above are post-refactor.
https://claude.ai/code/session_01Ca2v3JeHcZvpYYsEX4WpcN
Follow-ups deferred from the 2026-07 audit remediation (#12). These are the performance and memory-growth findings that were verified during the audit but intentionally not fixed in that PR — either they need design work beyond a minimal patch or they're low-priority cold paths.
Deferred from the hot-path package (need design decisions)
parallel_tool_calls: truein the provider profile (src/harness/agent_loop/). Blocked on design: the wrapped-tool execution and its before/after middleware onion take&mut RunContext(event emission, per-call limit/deadline tracking, cancellation), so ajoin_allneeds the context split into shared/per-call parts first. Latency today is sum-of-tools instead of max.DurabilityMode::Async— checkpointputI/O now runs on the blocking pool, butAsyncmode still awaits persistence inline at each superstep (src/graph/compiled/). Handing the cloned state to a spawned task requires defining and testing failure semantics (what happens to a run whose background checkpoint write fails).startTime == endTimebecauseAgentObservationonly carries a single completion timestamp;ModelCompleted/ToolCompletedevents don't capture a start time. Needs a start-time field threaded through the event model.bytes::BytestoVec<u8>to keepbytesout of the public API, costing one copy per network chunk (src/harness/providers/openai/). Avoiding it means either exposingBytesor an internal seam.Deferred from the memory-growth package (unbounded growth in long-lived processes)
InMemoryAppendStorenever evicts (src/harness/store/).InMemoryGraphStatusStorenever evicts andlist_by_threadis an O(all-runs) scan (src/graph/observability/).JsonlTaskStoreclones the full in-memory history per transition and does sync write+flush under a mutex (src/graph/orchestration/store.rs).Arc<Mutex<()>>per thread id forever (src/graph/goals/store.rs,src/graph/todos/store.rs) — evict atstrong_count == 1or use a weak-value map.src/repl/types.rs) — cap with aVecDeque.Deferred cold-path scans (cheap fixes, low impact)
Checkpointer::copy_threaddefault impl is O(H²) via per-checkpointget(src/graph/checkpoint/mod.rs).blueprint_diffO(old × new) nested scans (src/language/diff.rs) — reachable per-turn via the REPLgraph_diffbuiltin; use per-side HashMaps.compile_graphper-node linear edge scan (src/language/compiler.rs).InMemoryVectorStorelinear dedup per insert + full metadata clone before top-k truncation (src/harness/embeddings/).Retrieveraccepts wrong-length embeddings and returns arbitrary top-k with all-zero scores instead of erroring (src/harness/embeddings/) — arguably a correctness bug, smallest fix in this list.Deferred low-priority harness items
MockModelscripted-index race under concurrent calls (src/harness/providers/).replay_fromreturns completion order (src/harness/events/).RedactionMiddlewaremask self-matching (pattern matching inside[REDACTED]) and tool-call arguments/rawnever scrubbed (src/harness/middleware/library/)."{name}-d{depth}"reused across invocations, interleaving journals keyed by run id (src/harness/subagent/).expects on reachable paths (src/harness/observability/,src/harness/steering/) — inconsistent with the same files'poisoned()mapping.RateLimitWaitlivelock whenrefill_per_sec = 0.0, pluswaited_msreports intended not actual wait (src/harness/middleware/library/).src/harness/model/).DefaultHasherfor a serialized fingerprint (src/harness/prompt/).cache_keydoc says 16-hex but returns 64 (src/harness/cache/).Line numbers omitted intentionally — #12 restructured most of these files; the module paths above are post-refactor.
https://claude.ai/code/session_01Ca2v3JeHcZvpYYsEX4WpcN