Centralized project memory for runners, behind a per-task

Task 5402 · Done · Epic · created · updated

Runners re-derive what other runners already learned: the only cross-task memory today is recon_map (direct dependents inside one epic), OMC notepad/wiki dies with the worktree, and nothing is pooled or searchable across tasks or nodes. Build a centralized project-memory layer per the attached architecture ("Jaah Project Memory") and its companion comparison, which lists seven amendments to fold in (exclusion policy at capture, decay by default, generated repo wiki feed, graduation to guards before docs, read-rate as the kill metric, no `decision` kind, re-inject after compaction). The attachments are research input: the BA and Architect own the design and may depart from them with reasons. 1. Learned memory is a control-plane home: project-scoped, provenance-stamped, trust-scored units every runner can contribute to and search; canon (repo docs, directives, rules) stays in git and is never copied. 2. Capture mostly without runner effort: mine what runners already settle (recon_map, outcome summary), ship the in-session OMC memory delta at Stop, distill settled transcripts asynchronously; plus an explicit propose tool. 3. Delivery three ways: a memory section in the dispatch prompt, a learned tier in the context router matched on-node from a CP-compiled per-project bundle (no network in the hook path), and on-demand search/read/feedback tools. Native CLI memory files are generated projections only. 4. Curation runs in the CP: secret gate, dedupe, canon-conflict check, staleness verification against the integration branch, nightly consolidation and pruning, graduation into the repo via a draft task. 5. The switch: a "Project memory" setting in the task/epic Advanced section, inherited by an epic's children; its default is an operator System Settings entry. OFF means dispatch, hooks, tools and settle behave exactly as today, byte-for-byte on the prompt and with no new hook output. 6. A/B measurement: per task, record whether memory was on, units injected, units read, units cited in the settled PR, orientation tool calls to first edit and duplicate reads (the Efficiency aggregate already has the last two). Expose the comparison on/off per project in the console so the new way can be judged against the current one. 7. Robust at scale: concurrent writes from many runners on many nodes, bounded prompt budget shared with the router's caps, kill switch via runner flags, no secret ever persisted, injected units rendered as untrusted data. Out of scope: moving OMC state to shared storage (ADR-0099); changing canon docs or the router's existing deterministic routes; org-wide (cross-project) memory beyond a scope field reserved for it; adopting an external memory SaaS. Done means: - With the switch OFF a dispatched prompt and the hook output for a sample task are identical to develop before this epic. - With the switch ON a settled task's recon findings are searchable by a later task in the same project through the memory tools, and a matching unit appears in that task's prompt or hook output. - The operator default lives in System Settings and a task/epic Advanced setting overrides it. - The console shows per-project on/off counts for injected, read and cited units and the orientation metrics. - `./dc check full` green; security-surface changes reviewed per the branching policy. Required checks: gate

Subtasks

  • [business_analysis] Centralized project memory for runners, behind a per-task Done
    Settled Project Memory scope: 25 asks captured, 28 oracle-backed ACs, OFF byte-parity via golden tests, tri-state switch inherited by all epic children, default ON in System Settings. Orientation-to-first-edit must be added (not in Efficiency today).
  • [architecture] Centralized project memory for runners, behind a per-task Done
    Store in CP package app/project_memory (one migration); ON/OFF set at dispatch, reaches node only as env/payload presence; node helper does git-side curation; free-text units search-only until corroborated. 9 children C1–C9; C9 runs live checks.
  • [plan] Centralized project memory for runners, behind a per-task Done
    Split along the architecture's C1–C9 seams into 11 coders over 4 phases (#5416–5426). C6 split into curate/nightly/node helper; memory.bundle moved to C3; C8 depends on C3 for the Purge scrub. Critic passed on round 2.
  • Project memory store, switch and gates Done
    Project memory C1 (store, switch, gates, ingest, events, bundle; revision now 0391) merged via #4709; full gate green. Dev deploy failed on a 0390 collision with 5415; swap fix landed as #4711 and Jaah Deploy cd8714f succeeded.
  • Orientation calls-to-first-edit efficiency metric Done
    Added calls_to_first_edit (RUN_FACTS, row field, median + no-edit count, Efficiency tab card/column "no edit") and efficiency_for_sessions() for C8. Full gate green; PR #4703 merged; Jaah Deploy (dev) succeeded. Deferred: column sort.
  • Project memory switch UI and task record Done
    Project memory switch: API field + TaskOut arm/counts, "Project memory" Default(On|Off)/On/Off select in task & epic Advanced, task-view record line. PR #4731 merged, CI gate green, Jaah Deploy (dev) succeeded. Local full gate: only load flakes, all pass on re-run.
  • Dispatch memory section and OFF parity Done
    C3 shipped in #4730: memory section, arm stamping, lease key, memory.bundle route, jaahd launch. OFF goldens from 857913ea9 pass; full gate green apart from load flakes; Jaah Deploy succeeded. Flag: C4 put memory tool names in the charter, so OFF prompts differ (N-5).
  • Runner memory search, read, propose tools Done
    Built memory_search/read/feedback/propose tools, routes and hybrid search (launcher visibility, 409 when off). CI gate green; PR #4716 merged; Jaah Deploy (dev) succeeded. Local full gate stopped by host memory pressure. Deferred: 3 C1 ingest follow-ups.
  • Router learned memory tier and hooks Done
    Router learned memory tier, --memory-path, SessionStart bank/slice, spool and all memory hook wiring. OFF golden from develop@857913ea9 is byte-identical. Full gate green; PR #4718 merged; Jaah Deploy succeeded. Note for C3: export the memory env to Claude runners only.
  • Memory ingest routes and curate cron Done
    Built memory.ingest/report routes and the memory-curate cron (mining, distill, promotion, near-dupe, canon check, corroboration), with review-lane hardening. PR #4738 merged (3e38d16). Full gate green before the final rebase; one perf-budget flake after. Jaah Deploy failed on runner host n4-2-default (docker /proc mount); settled at the operator's call.
  • Memory nightly decay, trust, graduation Done
    memory-nightly built (decay, trust, citations, consolidation, slice, guard-first graduation drafts; seed rev 0397). PR #4752 merged, CI gate green, Jaah Deploy succeeded. Drafts use new_top_level_task (create_system_task rejects coder). Local full gate: 2 unrelated flakes.
  • Node memory helper and repo feeds Done
    Built tools/project_memory_node.py (verify, canon digest, code map, Stop delta, spool, PR citations) + MANIFEST, jaahd launch step 4 + orphan spool, jaah-forge pr view --body. PR #4757 merged; CI green; Jaah Deploy (dev) succeeded. Local full gate: one pre-existing host atime flake. CP follow-ups named.
  • Memory A/B comparison and Memory tab Done
    Memory ON/OFF comparison API + Efficiency panel; Project › Memory tab (feeds, units, Retire, Purge with prompt scrub). PR #4765 merged, CI gate green; Jaah Deploy green on 9c1bdf76d after a host /proc fault. Local full-gate reds also fail on develop (mem-2).
  • Live dev verification of project memory Done
    Live dev checks run. #4773 merged (gate + Jaah Deploy green): OFF prompts drop the memory-tool roster (all providers), Retire reason fixed, memory_end_to_end test added. AC-3 Settings leg and AC-5 deferred (operator-tier); AC-19 draft pending nightly; AC-8 live partial. Follow-ups: rules-only canon hold; recon capture gate. mem-2/3 flagged.
  • [finish] Centralized project memory for runners, behind a per-task Done
    All 14 children done, 12 PRs merged, gate green; live on dev (OFF parity, search→prompt, console). Filed 5491 (held units never re-checked: 176/248 on dev), 5492 (recon capture guidance), 5493 (deferred live AC-3/5/8/19).
  • Re-check canon-held memory units once a memory Done
    Curate tick now re-checks up to 50 canon-held memory units/tick once a memory model is configured (secret check, then canon: release/flag/stay held). Full gate green; PR #4778 merged, gate green, Jaah Deploy (dev) succeeded.
  • Tell ON runners how a recon answer survives Done
    Added the ON-only memory guidance sentence (a recon answer is kept only if it says WHY/WHEN, never narrates the session); test asserts it, OFF unchanged. PR #4776 merged, CI gate green, live on dev (deploy 37967567549). Local full gate red only on unrelated token_billing tests.
  • Run the deferred live memory checks: Settings Done
    Deferred memory checks on dev: AC-3 Settings and AC-5 skipped per operator, AC-8 live blocked (Org B plan refuses static slots, no operator slot), AC-19 pending first nightly 2026-10-10 03:00 UTC. Settings untouched (default On). No code change.

Artifacts

Attachments

Activity

  • Created
  • Updated
  • Runner started
  • Ready
  • Ready
  • Ready
  • Runner started
  • Runner ended (done)
  • Runner started
  • Runner ended (done)
  • Runner started
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Draft
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Ready
  • Runner ended (done)
  • Runner started
  • Runner started
  • Runner ended (done)
  • Runner ended (done)
  • Runner started
  • Runner started
  • Runner started
  • Runner started
  • Runner started
  • Awaiting response
  • Awaiting response
  • Awaiting response
  • Runner ended (done)
  • Runner ended (done)
  • Awaiting response
  • Runner resumed
  • Awaiting response
  • Runner resumed
  • Awaiting response
  • Runner resumed
  • Runner ended (done)
  • Runner ended (done)
  • Awaiting response
  • Awaiting response
  • Runner resumed
  • Runner ended (done)
  • Runner started
  • Runner started
  • Runner started
  • Runner ended (done)
  • Runner ended (done)
  • Runner ended (done)
  • Runner started
  • Awaiting response
  • Awaiting response
  • Awaiting response
  • Runner resumed
  • Runner ended (done)
  • Runner started
  • Ready
  • Ready
  • Ready
  • Runner ended (done)
  • Runner started
  • Runner started
  • Runner started
  • Awaiting response
  • Awaiting response
  • Runner ended (done)
  • Runner ended (done)
  • Awaiting response
  • Runner resumed
  • Runner ended (done)
  • Runner ended (done)