musememory 2.3.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/artifacts/2026-10-20-lifeos-memory-distillation-plan.md +865 -0
- package/.agents/artifacts/HANDOFF.md +22 -0
- package/.agents/artifacts/audit-and-realigned-roadmap-20261015.md +152 -0
- package/.agents/artifacts/bench-graph-baseline.json +519 -0
- package/.agents/artifacts/bench-graph-baseline.md +139 -0
- package/.agents/artifacts/brief-dayos-inspired-site-redo.md +89 -0
- package/.agents/artifacts/handoff-20261015-143202.md +109 -0
- package/.agents/artifacts/plan-competitor-adaptation-dashboard-graph.md +99 -0
- package/.agents/artifacts/session-report-2026-10-01-memory-gaps-and-website.md +94 -0
- package/.agents/artifacts/wave-3-sdd-ledger.md +18 -0
- package/.agents/artifacts/wave-4-sdd-ledger.md +18 -0
- package/.agents/context/architecture.md +1 -0
- package/.agents/context/current.md +222 -3
- package/.agents/context/decisions.md +4 -0
- package/.agents/context/deep-research-agentic-memory-evolution.md +261 -0
- package/.agents/context/deep-research-memory-adaptation-2026-10.md +107 -0
- package/.agents/context/deep-research-memory-improvement-2026-10.md +420 -0
- package/.agents/context/deep-research-memory-mechanisms-2026-09.md +334 -0
- package/.agents/context/index.md +47 -2
- package/.agents/context/product.md +139 -73
- package/.agents/context/roadmap.md +369 -7
- package/.agents/context/ticket-plan.md +553 -0
- package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-design.md +198 -0
- package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-plan.md +274 -0
- package/.agents/plans/EVOLUTION_PLAN.md +351 -0
- package/.agents/plans/local-embeddings-llama-cpp.md +37 -0
- package/.agents/plans/recall-eval-harness.md +31 -0
- package/.agents/research/ecosystem-teardown-2026-10.md +289 -0
- package/.agents/research/research-brief-agent-memory-migrator.md +1 -1
- package/.agents/research/research-brief-walrus-memory-architecture.md +189 -0
- package/.agents/research/retirement-audit-2026-10.md +45 -0
- package/.agents/standards/README.md +42 -0
- package/.agents/standards/frontend-astro.md +111 -29
- package/.agents/standards/git-workflow.md +5 -0
- package/.agents/standards/workflows.md +13 -0
- package/README.md +300 -253
- package/claims.json +15 -0
- package/dist/index.js +20784 -9111
- package/docs/agent-reference.md +199 -0
- package/docs/cli-reference.md +263 -0
- package/docs/mcp-tool-matrix.json +121 -0
- package/package.json +30 -10
- package/schema.json +40 -2
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# Muse Memory — Evolution Plan for External Review
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-10-14 (v2, post-senior-review) · **Branch**: `feat/docs-memory-arch-roadmap-walrus` · **Plan owner**: principal (Harsh Singh)
|
|
4
|
+
**Companion files**: `.agents/context/ticket-plan.md` (full register: sources, severities, file:line, dependencies) · `.agents/research/ecosystem-teardown-2026-10.md` · `.agents/research/retirement-audit-2026-10.md` · `.agents/research/research-brief-walrus-memory-architecture.md`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. What you are reviewing
|
|
9
|
+
|
|
10
|
+
A 243-ticket evolution plan for Muse Memory — an autonomous persistent-memory engine for AI agents (~30.8k LOC TypeScript, SQLite + FTS5 + YAML mirror + 107-tool MCP stdio server, 502 passing tests on Bun). Reliability fixes, a memory-quality engine, and (deferred) team/server mode. Self-contained; ticket IDs resolve to the companion register.
|
|
11
|
+
|
|
12
|
+
## 2. Evidence chain (and its caveats)
|
|
13
|
+
|
|
14
|
+
| Pass | Method | Yield |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| Ecosystem teardown | 69 competitor memory systems reverse-engineered at mechanism level | 50-item catalog |
|
|
17
|
+
| Engine audit | Defect hunt over the source | 10 defects (1 critical security) |
|
|
18
|
+
| Retirement audit | Two lanes: surface inventory + judgment | 19 verdicts: drift + 2 security defects, almost nothing dead |
|
|
19
|
+
| Gap audit | Tickets cross-checked against research AND source | 35 items, ~24 uncovered; new gap classes (read-path purity, invalidation, feedback attribution) |
|
|
20
|
+
| Test audit | 85 suites / 502 tests | 9 classes of assertions that cannot fail; 64/107 tools never referenced by a test |
|
|
21
|
+
| Senior strategic review | Plan-level verdict, wave ordering, YAGNI, strategy gaps | rework into a 12-ticket first release |
|
|
22
|
+
| Senior executability review | 38 file:line claims verified against source; gates executed; effort realism | 14 stale refs fixed, 1 dangling ticket defined, 5 effort blowups ranked |
|
|
23
|
+
|
|
24
|
+
**Caveats a reviewer should hold**: defect findings are static source reading, not runtime measurement, except `bun test` (502/0/2224 expects/85 files/3.29s — re-run at review time). The full gate is runnable today: `bunx tsc --noEmit` exits 0, `bun run build` = 374 modules/18ms. One lane contradicted another early (T-027: `dedup` called dead, later proven wired at `store.ts:418`); both senior reviews disagreed with the original plan on Wave-3 scope and dependency encoding, and their corrections are incorporated below.
|
|
25
|
+
|
|
26
|
+
## 3. Decisions already taken
|
|
27
|
+
|
|
28
|
+
- **Daemons (T-367, principal)**: zero *required* daemons; `daemon.ts` and the studio UI are opt-in extras; team server opt-in per tenant.
|
|
29
|
+
- **Release strategy (was absent; from strategic review)**: **`v2.3.1 "trust"` = 12 tickets** — T-001, T-363, T-336, T-337, T-351, T-355, T-342, T-020, T-303, T-368, T-301, T-024 (+ T-015 docs truth). Six weeks, one changelog, one demonstrable number: cache hit rate goes from structurally 0% to >0%, wrong-recall-at-scale fixed. `v2.4.0` = Wave 1 remainder + Wave 2 items **proven by the R2/R3 baselines**. `v3.0` = Wave 3 only if a trigger fires.
|
|
30
|
+
- **Migration (T-368, re-scoped by both reviews)**: `PRAGMA user_version` stamp + ordered `{version, up(db)}` + backfill from the existing `data` JSON in the same PR + `doctor` parity check + `tar .memory` snapshot. The YAML mirror already rehydrates SQLite (`store.ts:174-202`), so it IS the rollback. No framework. R1 red test (T-383) is the acceptance criterion.
|
|
31
|
+
- **Deferred**: Wave 3 (30 tickets, no team customers); multi-writer cluster (7, one store); embeddings cluster (5, gated on T-381 spike — zero implementation files exist).
|
|
32
|
+
|
|
33
|
+
## 4. Sequencing
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Hour one: T-001 (RCE) alone
|
|
37
|
+
Week 1: T-363 (path primitive) → T-336/337/351/355/342/380
|
|
38
|
+
Day two: T-020 (cache fix — demonstrable number, before/after)
|
|
39
|
+
T-383 (R1 red test) → T-368 (stamp) → T-303 (filter fix) → T-301 (read purity)
|
|
40
|
+
Then: v2.3.1 ships. Re-evaluate Wave 2 against measured baselines (T-384/T-385).
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 5. Register (243 actionable; deferred/gated waves marked)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### WAVE 0 — SECURITY, DRIFT & SEAMS (do first) — 20 tickets
|
|
47
|
+
|
|
48
|
+
| ID | Ticket |
|
|
49
|
+
|---|---|
|
|
50
|
+
| T-001 | verify.ts exec: replace `/bin/sh -c` with `execFileSync` + allowlist parse · src verify.ts:23 | · dep: — · new · F |
|
|
51
|
+
| T-002 | UI XSS: escape `p.title`/`p.slug` interpolation · ui.ts:1510 · new | |
|
|
52
|
+
| T-004 | UI optimizer gate: `POST /api/optimize` requires dry-run default + localhost/token check · ui.ts:362 · new | |
|
|
53
|
+
| T-010 | profiles.ts: remove 7 phantom tool names (record_observation, capture_negative, conflict_detect, wiki_page, tree_index, dedup, audit_query) · orchestrator/profiles.ts · new | |
|
|
54
|
+
| T-011 | connect.ts: retire ALL_MEMORY_TOOLS allowlist (auto-approves 3 phantom; MEASURED: 71 registered tools absent) · connect.ts:9-50 · new | |
|
|
55
|
+
| T-012 | delete `maybeAutoOptimize` (0 callers) · optimize.ts:362 · new | |
|
|
56
|
+
| T-013 | retire unreachable LSP tier; keep provider slot in chain signature · src/intelligence/adapters/lsp.ts:14 · new | |
|
|
57
|
+
| T-014 | delete 4 unused registry methods + `registerProvider` + 3 dead governor exports · registry.ts:68-117, governor.ts · new | |
|
|
58
|
+
| T-015 | docs truth pass: README 80+→52 platforms, daemon SSE≠WebSocket, remove profile_switch · README, docs · new | |
|
|
59
|
+
| T-016 | dispatch-coverage matrix: 64/107 MCP tools referenced by NO test (T-016 was referenced but never defined — plan's largest coverage hole had no ticket). Ships with Wave 5; T-371 lands first | |
|
|
60
|
+
| T-364 | RB-3 · unique-ID seam: `crypto.randomUUID` (or DB UNIQUE + collision retry) behind one id-generator; current `Date.now()` ids (adrs/engine.ts:104, pageindex/engine.ts:34) collide same-millisecond with no constraint to reject · blocks T-038, T-041, T-044, T-328 and every parallel-writer ticket | |
|
|
61
|
+
| T-365 | RB-2 · anchor base normalization at write time: `contracts.ts:113-118` resolves against `topology.rootPath` while `drift.ts:93` resolves the same anchor against `workspaceRoot` — two bases, no normalization; anchor records its own base · blocks drift/mesh/code-impact tickets | |
|
|
62
|
+
| T-366 | RB-6 · migrator quarantine: schema-validated intake + quarantine status + strip self-certified `independently-verified` (agentmemory.ts:59-62) + generic adapter never writes `confirmed` · blocks T-338, T-339, T-340 | |
|
|
63
|
+
| T-368 | CRITICAL · migration mechanism: `memories` table is 14 columns + `data` JSON (sqlite.ts:137-155); ~20 D/C-wave tickets need real columns (idempotency_key, content_hash, decay_score, fact_provenance, linked_memory_ids, is_inference, parent_ids). One migration framework + one migration PR pattern (additive ALTER + backfill + test) · blocks the whole D-wave | |
|
|
64
|
+
| T-380 | UI security tests WITHOUT a DOM dep: unit-test the pure `escapeHtml` (`ui.ts:1588`) with `<script>`/quote payloads — zero `escapeHtml` occurrences exist in test/, no DOM dependency exists; render-level tests deferred pending D3 | |
|
|
65
|
+
| T-381 | embeddings spike: validate llama-cpp local embeddings E2E on the spec branch before ANY of T-071/136/137/138/139 ships | |
|
|
66
|
+
| T-382 | deprecation policy: `deprecated: true` metadata + alias retention + "removed in vX"; prerequisite for T-201/T-202/T-203 | |
|
|
67
|
+
| T-383 | R1 red test: today's-schema store + one added column + `save()` → must red (proves un-migrated stores throw at `store.ts:317` before the YAML write). IS T-368's acceptance criterion | |
|
|
68
|
+
| T-384 | R2 fixture: 120 memories / 3 projects / 30 superseded / 30 expired → assert `hybridSearch` returns only matching-project non-superseded rows. Baselines T-303 + T-308 + T-140 at once | |
|
|
69
|
+
| T-385 | R3 baseline: 40 must-return queries from the principal's own `.memory/` + recall-set grading — gate Wave 2 on the number before T-070 ships | |
|
|
70
|
+
|
|
71
|
+
### WAVE 1 — P0 RELIABILITY (v2.3.1 "trust") — 35 tickets
|
|
72
|
+
|
|
73
|
+
| ID | Ticket |
|
|
74
|
+
|---|---|
|
|
75
|
+
| T-020 | query-cache self-destruction fix (writes no longer poison read cache) · store.ts:281 vs cache.ts:124/212 · new | |
|
|
76
|
+
| T-021 | memoized file verification in ranking hot path · retrieval.ts:199-204 · new | |
|
|
77
|
+
| T-022 | precomputed token sets per memory (drop per-query retokenization) · retrieval.ts · new | |
|
|
78
|
+
| T-023 | `openStore` dirty-gate: skip wiki recompile + CURRENT.md sync per MCP call · store.ts openStore · new | |
|
|
79
|
+
| T-024 | bounded FTS preflight (cap term count; reject oversized queries) · store.ts · new | |
|
|
80
|
+
| T-025 | single-transaction writes (replace 3-commit paths; ~180ms→~60ms) · store.ts · new | |
|
|
81
|
+
| T-026 | FTS↔row parity check + repair command · store.ts · new | |
|
|
82
|
+
| T-028 | `recordRetrievals`: wire into recall or delete · mcp.ts:1692, quality · new | |
|
|
83
|
+
| T-029 | `touchActivity`: wire into store or delete · optimize.ts:77 · new | |
|
|
84
|
+
| T-030 | tombstone schema + ops (soft-delete, never hard-delete) · schema, store · branch: memory-tombstones | |
|
|
85
|
+
| T-031 | `memory_restore` CLI+MCP command · cli, mcp · branch: memory-tombstones | |
|
|
86
|
+
| T-032 | audit-replay restore (rebuild from audit.jsonl) · store · branch: memory-tombstones | |
|
|
87
|
+
| T-033 | optimizer: replace regex deletion with tombstone+restore · optimize.ts · branch: memory-tombstones | |
|
|
88
|
+
| T-034 | `secure_delete` = tombstone + VACUUM + audit seal · optimize.ts · branch: memory-tombstones | |
|
|
89
|
+
| T-035 | `Math.max(...arr)` spread crash at scale → iterative max · retrieval.ts · new | |
|
|
90
|
+
| T-036 | IDF caching (stop recomputing per query) · retrieval.ts · new | |
|
|
91
|
+
| T-037 | drop redundant full-list scan in hybridSearch · retrieval.ts · new | |
|
|
92
|
+
| T-044 | append-only fsync JSONL event log + single-writer flock (fails loud) · store · branch: multi-writer-merge | |
|
|
93
|
+
| T-045 | `on_pre_compress` hook in compaction engine (extract before compact) · compaction · new | |
|
|
94
|
+
| T-046 | persisted digest-dedup set for extracted facts · compaction · new | |
|
|
95
|
+
| T-047 | never-empty checkpoint contract (raise instead of emit partial) · compaction, orchestrator · new | |
|
|
96
|
+
| T-048 | wake gate: background passes exit unless actionable-keys allowlist matches · optimize, cognition · new | |
|
|
97
|
+
| T-050 | overnight loss guard: snapshot entry-head hashes; >25% loss → alert-only · optimize · new | |
|
|
98
|
+
| T-051 | memory_pressure as first-class event (store near ceiling) · store.ts · new | |
|
|
99
|
+
| T-053 | honest dual-measure token accounting (harness + pessimistic model) · compaction · branch: io-budget-telemetry | |
|
|
100
|
+
| T-054 | refuse-incomplete digest contract in get_context · orchestrator · new | |
|
|
101
|
+
| T-055 | circuit breaker around every store path (5 fail → 120s cooldown → degraded mode) · store.ts · new | |
|
|
102
|
+
| T-056 | `atexit` bounded join for async write workers · store · new | |
|
|
103
|
+
| T-057 | generation-counter invalidation for in-flight prefetch · orchestrator · new | |
|
|
104
|
+
| T-058 | read-path re-validation: injection markup/credentials/invisible chars excluded from recall, logged once · retrieval · branch: poisoning-trust-tiers | |
|
|
105
|
+
| T-060 | safe FTS5 query construction (quote every token — injection surface) · store.ts · new | |
|
|
106
|
+
| T-061 | compound-token expansion (camelCase/snake_case split) · retrieval · new | |
|
|
107
|
+
| T-062 | clamp model-supplied `limit` values · mcp tools · new | |
|
|
108
|
+
| T-063 | dry-run-by-default, point-id-only destructive ops · mcp, cli · new | |
|
|
109
|
+
| T-064 | read-path `stale:true` provenance tag for degraded/cache reads · retrieval · new | |
|
|
110
|
+
|
|
111
|
+
### WAVE 2 — P1 MEMORY QUALITY (v2.4.0, gated on R2/R3 baselines) — 69 tickets
|
|
112
|
+
|
|
113
|
+
| ID | Ticket |
|
|
114
|
+
|---|---|
|
|
115
|
+
| T-070 | IDF-weighted relevance gate before FTS5 (0.3, identifier-decisive, greeting short-circuit) · retrieval · new | |
|
|
116
|
+
| T-072 | FTS5-tokenizer-matched abstention gate · retrieval · new | |
|
|
117
|
+
| T-073 | `no_confident_match` result mode · retrieval, mcp · new | |
|
|
118
|
+
| T-074 | materialized `decay_score` column, importance-gated half-lives · schema, retrieval · new | |
|
|
119
|
+
| T-075 | veracity tiers (stated 1.0/inferred 0.7/unknown 0.8/imported 0.6/tool 0.5) · schema, store · branch: poisoning-trust-tiers | |
|
|
120
|
+
| T-076 | Bayesian confidence `1-0.7^n` per corroboration · quality · new | |
|
|
121
|
+
| T-077 | trust-tier-keyed half-life (T1 365d → T4 30d) · quality · branch: poisoning-trust-tiers | |
|
|
122
|
+
| T-078 | per-type `expires_at` (fix 90d/operation 180d/architecture 365d/discovery 30d) · types, store · new | |
|
|
123
|
+
| T-079 | stamped expiry status/expired_at/expired_by rule name · store · new | |
|
|
124
|
+
| T-080 | pin-capable first-match-wins expiry policy YAML · store · new | |
|
|
125
|
+
| T-081 | optional Weibull per-type decay curves (re-derived, not ported) · quality · new | |
|
|
126
|
+
| T-082 | `valid_to_exact` flag on transitions · schema, store · new | |
|
|
127
|
+
| T-083 | `as_of` queries returning `{results, undetermined}` (invent no dates) · retrieval · new | |
|
|
128
|
+
| T-084 | five-verb lifecycle: change/end/correct/revert/forget · store · new | |
|
|
129
|
+
| T-085 | `searchTemporal(atTime)` default-excluding superseded · retrieval · new | |
|
|
130
|
+
| T-086 | keep-both conflicts table (never delete) · quality · new | |
|
|
131
|
+
| T-087 | scoped invalidation requiring (entity, relation, target) alignment · quality · new | |
|
|
132
|
+
| T-088 | federation handshake for mesh-mode conflict dedup · sync · new | |
|
|
133
|
+
| T-089 | veracity rank weights user 1.0/agent 0.7/external 0.5/system 0.3 · retrieval · branch: poisoning-trust-tiers | |
|
|
134
|
+
| T-090 | `src_ts` evidence-age stamping (memory only as fresh as evidence) · schema, store · new | |
|
|
135
|
+
| T-091 | TOON-style row-wise context-pack compaction (verify 77.6% claim ourselves) · orchestrator · new | |
|
|
136
|
+
| T-092 | never-drop manifest TOC + descending summary caps (entry line never omitted) · orchestrator · branch: io-budget-telemetry | |
|
|
137
|
+
| T-093 | truncation order pin > provenance > recency > salience + `[N omitted — budget M]` marker · orchestrator · new | |
|
|
138
|
+
| T-094 | reserved slots for global/USER.md-class entries · orchestrator · new | |
|
|
139
|
+
| T-095 | `linked_memory_ids` write-time edges seeded during capture · schema, store · new | |
|
|
140
|
+
| T-096 | supersede-not-delete + hidden-count-aware over-fetch · store, retrieval · branch: memory-tombstones | |
|
|
141
|
+
| T-097 | `prefer_observations` recall-time dedup, top-2×budget scope · retrieval · new | |
|
|
142
|
+
| T-098 | progressive wikilink expansion after fusion · retrieval · new | |
|
|
143
|
+
| T-099 | `fact_provenance` append-only table, triple-unique index · schema, store · new | |
|
|
144
|
+
| T-100 | `supersedes_id`/`conflicts_with_id` lineage FKs · schema · new | |
|
|
145
|
+
| T-101 | lineage BFS walker · store · new | |
|
|
146
|
+
| T-102 | hash-chained audit (per-day salt) + session Merkle checkpoints · audit · new | |
|
|
147
|
+
| T-103 | index-time credential redaction keeping text searchable · store · branch: poisoning-trust-tiers | |
|
|
148
|
+
| T-104 | `scoreRetain` 0.3 write gate (refuse junk writes) · store · new | |
|
|
149
|
+
| T-105 | corroboration-gated promotion (≥2 independent days; machine sources excluded) · promotion · branch: poisoning-trust-tiers | |
|
|
150
|
+
| T-106 | curator concept: agent appends evidence, deterministic promotion decides · promotion · new | |
|
|
151
|
+
| T-107 | two-tier promotion (pending tier → session-end flush) · promotion · new | |
|
|
152
|
+
| T-108 | re-injection suppression per session (6-turn LRU) · retrieval · new | |
|
|
153
|
+
| T-109 | self-echo suppression via capture-side provenance (age-bounded) · retrieval · new | |
|
|
154
|
+
| T-110 | `<memory-context>`/injected-block strip before capture · harvester, store · branch: poisoning-trust-tiers | |
|
|
155
|
+
| T-111 | seen-chunk TTL · retrieval · new | |
|
|
156
|
+
| T-112 | topic-overlap >0.6 prefetch skip · retrieval · new | |
|
|
157
|
+
| T-113 | trivial-prompt gate (skip recall for greetings) · orchestrator · new | |
|
|
158
|
+
| T-114 | soft-OR evidence fusion `P=1-(1-pv)(1-pl)` · retrieval · new | |
|
|
159
|
+
| T-115 | `low_discrimination()` conditional rerank · retrieval · new | |
|
|
160
|
+
| T-117 | watermark staleness from `last_memory_seen_at` (data, not clock) · retrieval · new | |
|
|
161
|
+
| T-118 | query-intent bias multipliers · retrieval · new | |
|
|
162
|
+
| T-119 | `effective_score = base × reinforcement × decay` · retrieval · new | |
|
|
163
|
+
| T-120 | RRF weight tuning + A/B · retrieval · branch: recall-eval-harness | |
|
|
164
|
+
| T-121 | typed drop/keep reasons per candidate · retrieval · new | |
|
|
165
|
+
| T-122 | L0/L1 abstract sidecars (reimplement; source is AGPL) · store · new | |
|
|
166
|
+
| T-123 | ratio-batched sidecar refresh · store · new | |
|
|
167
|
+
| T-124 | resident INDEX route-map · orchestrator · branch: io-budget-telemetry | |
|
|
168
|
+
| T-125 | tier budgets as named constants with provenance · retrieval, orchestrator · branch: io-budget-telemetry | |
|
|
169
|
+
| T-126 | `why_retrieved` deterministic reason tokens · retrieval · new | |
|
|
170
|
+
| T-127 | recall→usage telemetry join (`usage_rate` feeds ROI) · quality · branch: io-budget-telemetry | |
|
|
171
|
+
| T-128 | `[DRAFT]` marking with separate confident-answer key · store · new | |
|
|
172
|
+
| T-129 | config-honesty AST audit (WIRED/DORMANT/UNREAD, build-failing) · new module · new | |
|
|
173
|
+
| T-130 | storage-version compat tests in CI matrix · test · new | |
|
|
174
|
+
| T-131 | honest benchmark labels (measured-vs-claimed) on all published numbers · docs, benchmark · new | |
|
|
175
|
+
| T-132 | constitution contract: rules injected first, trim-exempt, no write tool · orchestrator · new | |
|
|
176
|
+
| T-133 | `degraded − notes` fault signal · retrieval · new | |
|
|
177
|
+
| T-134 | ground-moved reporting for anchors (silent when undeterminable) · anchors · new | |
|
|
178
|
+
| T-135 | tiered retrieval ladder labeling loosened matches · retrieval · new | |
|
|
179
|
+
| T-140 | recall-set grading: must/must-not return, abstention, noise-as-failure · test · branch: recall-eval-harness | |
|
|
180
|
+
| T-141 | frozen benchmark corpus + drift discipline · test · branch: recall-eval-harness | |
|
|
181
|
+
| T-142 | p50 latency reported beside recall scores · benchmark · branch: recall-eval-harness | |
|
|
182
|
+
| T-143 | fixture promotion requires usage telemetry · quality · branch: recall-eval-harness | |
|
|
183
|
+
| T-144 | fix-pair mining (error→command→no-recurrence) → negative-memory candidates · harvester, learning · new | |
|
|
184
|
+
|
|
185
|
+
### WAVE 4 — FOUNDATIONAL SEAMS & DEPRECATIONS — 7 tickets
|
|
186
|
+
|
|
187
|
+
| ID | Ticket |
|
|
188
|
+
|---|---|
|
|
189
|
+
| T-178 | graph retrieval A/B gate behind eval harness · retrieval · branch: recall-eval-harness | |
|
|
190
|
+
| T-179 | HRR/wikilink expansion — implement only if T-178 shows net gain · retrieval | · dep: T-178 · new · U |
|
|
191
|
+
| T-201 | migrator: delete 20 stale detectors BEFORE adapter fallback (stale recognition mis-imports) · migrator/detect.ts · new | |
|
|
192
|
+
| T-202 | platform freeze: deprecate 20 dormant entries, freeze registry · agents/registry.ts · new | |
|
|
193
|
+
| T-203 | `recall` deprecate to alias of unified retrieval · cli, mcp · new | |
|
|
194
|
+
| T-204 | YAML mirror read precedence → DB-first (6 lines; stops disk shadowing DB) · store.ts:174-202 · new | |
|
|
195
|
+
| T-205 | Dockerfile: remove test-on-build stage · Dockerfile:9-11 · new | |
|
|
196
|
+
|
|
197
|
+
### WAVE 5 — TEST INTEGRITY — 71 tickets
|
|
198
|
+
|
|
199
|
+
| ID | Ticket |
|
|
200
|
+
|---|---|
|
|
201
|
+
| T-301 | CRITICAL (B1) · get_context read-purity: transcript crawl + `importTranscript`→`propose`→`save` + CURRENT.md rewrite are synchronous inside the read handler (mcp.ts:1611-1624, :1579). Move to in-process async queue + flush-on-exit; add invariant test: no writes during any read tool | · dep: — (senior review: NOT T-041 — single-writer, no outbox table needed) · F |
|
|
202
|
+
| T-302 | HIGH (B15) · `memory_capture` full passthrough: currently sets 7 of ~40 propose options (no evidence/source/verification/dedup/validFrom/expiresAt) — provenance tickets T-075/090/099/103/105 assume write-time capture that the flagship tool cannot express · mcp.ts:1692-1699 | · dep: T-075 · F |
|
|
203
|
+
| T-303 | CRITICAL (B3) · `hybridSearch` applies no lifecycle/project filter at >100 entries (vector.ts:159-181, retrieval/engine.ts:127-148) — superseded/archived/expired/cross-project memories injected at scale | · dep: T-030 · F |
|
|
204
|
+
| T-304 | HIGH (B4) · vector index invalidation: `save()` never updates `index.json` (retrieval/engine.ts:124-127, store.ts:306); MCP hardcodes `stale:false` while serving ancient snapshots (mcp.ts:1683) | · dep: T-064 · F |
|
|
205
|
+
| T-305 | HIGH (B17) · distillation body cap: `content: obs.raw` stores whole logs as memory bodies (learning/distill.ts:67,:91,:98); `get_context` defaults token_budget to undefined → up to 5 full logs injected | · dep: T-092 · F |
|
|
206
|
+
| T-306 | HIGH (B16) · observations.jsonl: non-atomic whole-file rewrite per observation (tmp+rename like store.save), rotation + size cap (learning/observation.ts:100-119) | |
|
|
207
|
+
| T-307 | HIGH (B2) · Hebbian graph is write-only O(n²) per recall (plasticity.ts:37-64, mcp.ts:1611): n(n-1) edges + full-file rewrite every get_context; loaders have zero production callers. Bound it, make it incremental, consume it (see T-316) — or delete | |
|
|
208
|
+
| T-308 | HIGH (B5) · two divergent ranking engines: `scoreEntry` (9 factors) drives get_context; `calculateMultiFactorScore` (11 factors) drives muse_context (retrieval.ts:181-213 vs retrieval/ranking.ts:52-222) — same store, two incompatible orderings. Unify behind one scorer or document the split explicitly | |
|
|
209
|
+
| T-309 | HIGH (B6) · symbol match is binary and IDF-free: `` `get` `` in tags beats all lexically-relevant memories for any query containing "get" (ranking.ts:87-96). IDF-weighted term; T-070's gate covers the FTS prefilter, not this | |
|
|
210
|
+
| T-310 | MEDIUM (B7) · word-boundary token matching: `entryText.includes(token)` matches race⊂trace, port⊂report (ranking.ts:62-66) | |
|
|
211
|
+
| T-311 | HIGH (B8) · non-ASCII queries silently degenerate: `/[a-z0-9]+/g` returns [] for CJK and fragments "café" (retrieval.ts:67-70); zero-match penalty never fires → recall returns "most recently confirmed" with no signal. Unicode-aware fallback + penalty | |
|
|
212
|
+
| T-312 | HIGH (B9) · FTS failure indistinguishable from no-match: `catch { return [] }` (sqlite.ts:366-374) silently removes the only lexical signal. Degraded flag + loud log; T-133's notes signal doesn't cover this | |
|
|
213
|
+
| T-313 | HIGH (B11) · failure attribution: `isRegression = exitCode !== 0` applies to ALL recalled memories; 3 strikes auto-flip confirmed→disputed → drops from sync + confirm() (learning/feedback.ts:30-44, quality/utility.ts:72-79). Scope regression to anchor-relevant memories + decaying counter + corroboration before demotion | · dep: T-030 · F |
|
|
214
|
+
| T-314 | MEDIUM (A2) · source-tagged recall hits `_source ∈ {hot,fts,vector,tree,distilled}` feeding rank — HOT.md is built (compounding/temporal.ts:50) and never read | · dep: T-028 · U |
|
|
215
|
+
| T-315 | MEDIUM (A3) · frequency as first-class rank axis (LangMem) | · dep: T-028 · U |
|
|
216
|
+
| T-316 | MEDIUM (A4) · promote Hebbian co-activation edges into write-time `linked_memory_ids` seeding + retrieval expansion (A-MEM note-evolution; substrate already written, never read) | · dep: T-095 · U |
|
|
217
|
+
| T-317 | MEDIUM (A5) · split T-179: query-seeded PPR restart set + A/B on factual-recall-only fixture slice (HippoRAG v1 regressed factual recall) | · dep: T-140, T-178 · U |
|
|
218
|
+
| T-318 | MEDIUM (A12) · retrieval weight auto-tuner from ROI telemetry, gated behind eval harness (memoria) | · dep: T-127, T-140 · U |
|
|
219
|
+
| T-319 | MEDIUM (A1) · `is_inference` + `parent_ids` columns; inference down-weight; `memory_review_queue` ordered by support count (Supermemory) — distilled candidates currently rank identical to user-stated facts | · dep: T-075 · U |
|
|
220
|
+
| T-320 | HIGH (B10) · contradiction engine calibration: 7 regexes flip BOTH sides to `conflicted` at 0.85 on any 0.4-Jaccard pair (quality/contradiction.ts:15-23,85-114) → −0.8 rank, sync removal, −25 health each = 4 false positives = FAIL. Dry-run mode, negation-pair scoping, calibration fixtures | |
|
|
221
|
+
| T-321 | HIGH (B12) · per-project health gate: gate/clustering/tech-debt call `list(store)` unfiltered and label by `entries[0].project` (health/gate.ts:31,220; cognition/clustering.ts:62; tech-debt.ts:102) — one number attributed to whichever memory sorts first | · dep: T-153 · U |
|
|
222
|
+
| T-322 | MEDIUM (B13) · per-file read cache: anchor audit reads every source file 3× per health check (health/gate.ts:82,111,176 → anchors/resolver.ts:121) | |
|
|
223
|
+
| T-323 | MEDIUM (B14) · anchored memories force-injected to front regardless of `anchor.status` + budget ordering (orchestrator/context.ts:104-147) — anchor to a deleted file wins the slot forever | · dep: T-134 · U |
|
|
224
|
+
| T-324 | HIGH (B18) · checkpoint merge semantics: `generateSessionHandoff` overwrites CURRENT.md wholesale; omitted constraints default to 2 hardcoded strings → hand-added constraints destroyed (compaction/engine.ts:145,54). Diff-preserving update, never drop unknown constraints | |
|
|
225
|
+
| T-325 | MEDIUM (B19) · `rollupTemporal` never filters by its own period — every rollup contains all history (compounding/temporal.ts:120-135) | |
|
|
226
|
+
| T-326 | MEDIUM (B20) · tier 0/1 run the full ranking path (retrieval/tiered.ts:37) — audit D9 named this line; no ticket makes tier 0 cheap or removes it | |
|
|
227
|
+
| T-327 | MEDIUM (B21) · paged candidate source: `list()` = full SELECT * + JSON.parse ×44 call sites (store.ts:220-288); getSyncStatus filters whole store to count; collectNudges calls it twice uncapped | |
|
|
228
|
+
| T-329 | MEDIUM (A6) · episode table + episode-scoped search + episode stamp on hits (Zep: session_id is indexed at sqlite.ts:157 and never used as a retrieval unit) | |
|
|
229
|
+
| T-330 | MEDIUM (A7) · `absent` memory type ("checked, no X exists") + role scoping user/agent/external/system (Mem0 v3) | |
|
|
230
|
+
| T-332 | HIGH (A9) · signed SyncPacket + peer allowlist + fail-closed on unknown sender (Walrus: gossip has no identity layer; any process writing `.memory/sync/pool/` injects memories — zero auth tickets existed) | · dep: T-044, T-150 · F |
|
|
231
|
+
| T-333 | MEDIUM (A10) · confirm() extends expiry + expiry-horizon alert N days out (Walrus documented failure: expiry without renewal) | · dep: T-078, T-079 · U |
|
|
232
|
+
| T-334 | LOW (A11) · `write_origin` tier (interactive/harvest/distill/sync) → rank weight (LangMem: hot-path vs background writes as trust axis) | · dep: T-089 · U |
|
|
233
|
+
| T-335 | LOW (A13) · tombstone `visible_until` delayed-deletion semantics: hidden from all surfaces, retained in audit (ChatGPT-memory caution row) | · dep: T-030, T-031 · U |
|
|
234
|
+
| T-363 | RB-1 CRITICAL · path-validation choke point: single `resolveWithin(base, ...segments)` primitive applied at every boundary (ui.ts:164,503,577; pageindex/engine.ts:111,205,250; wiki/compiler.ts:504; mesh/discovery.ts:29; sync/pool.ts:19). F-01/F-02/F-03/F-21/F-26 are four call sites of this one missing primitive — fixing per-endpoint guarantees reintroduction · blocks T-336, T-337, T-351, T-355 | |
|
|
235
|
+
| T-336 | F-01/F-02 · pageindex path traversal: unsanitized `project`/`indexId` → `rmSync(recursive)` arbitrary delete via `memory_disconnect_pageindex` (pageindex/engine.ts:250,252,256 + mcp.ts:2032) | · dep: T-363 · F |
|
|
236
|
+
| T-337 | F-03 · wiki path traversal: raw `slug` → arbitrary `.md` read (wiki/compiler.ts:504,513; mcp.ts:1955; ui.ts:166) | · dep: T-363 · F |
|
|
237
|
+
| T-338 | F-04 · migrator self-certification: imported data stamped `verification.level:"independently-verified"` with zero verification (migrator/adapters/agentmemory.ts:59-62) | · dep: T-366 · F |
|
|
238
|
+
| T-339 | F-05 · Letta injection: human/persona core memory marked `isConstraint:true` → verbatim into CURRENT.md (letta.ts:26,38; engine.ts:113-115) — cross-agent instruction injection | · dep: T-366 · F |
|
|
239
|
+
| T-340 | F-06/F-07 · generic adapter imports junk as confirmed: any JSON object value becomes a memory (generic.ts:21; engine.ts:130); whole .md/.txt/.jsonl files imported wholesale (generic.ts:77-86) | · dep: T-366 · F |
|
|
240
|
+
| T-341 | F-08 · `memory upgrade --dry-run` still rewires agents: step 3 unguarded `repairInstallation` hardcodes `dryRun:false` (cli/upgrade.ts:524,359) | |
|
|
241
|
+
| T-342 | F-09 · studio export XSS: `JSON.stringify(memories)` unescaped `</script>` + `$&`-pattern corruption (ui.ts:2473-2474) | |
|
|
242
|
+
| T-343 | F-10 · malformed Host header crashes dashboard: `new URL(req.url, "http://"+req.headers.host)` outside try → unhandled rejection → exit(1) (ui.ts:42; bin/memory.ts:4) | |
|
|
243
|
+
| T-344 | F-11 · `origin === "null"` classified local, echoed into CORS (ui.ts:56,59) — sandboxed iframe gets full read+write | |
|
|
244
|
+
| T-345 | F-12/F-13 · daemon hardening: no `server.on("error")` (EADDRINUSE crashes), `/publish` no origin check, client sockets leaked (daemon.ts:36-78,87), shared debounce collapses watcher events, watchers never re-armed | |
|
|
245
|
+
| T-346 | F-14 · upgrade CLI exit codes: zero non-zero exits in 558 LOC; CI cannot distinguish success from failure (cli/upgrade.ts:498) | |
|
|
246
|
+
| T-347 | F-15 · port-handling contract broken: auto-increment path dead (ecosystem.ts:443 always passes port); `--port abc` → NaN → random port (ui.ts:613) | |
|
|
247
|
+
| T-348 | F-16 · migrator false positives: detection = "directory exists"; unexpanded `~` fallback makes `skipped` branch unreachable (detect.ts:22-276; engine.ts:56,70) | |
|
|
248
|
+
| T-349 | F-17 · migrator dedup silent: no counter; dry-run doesn't dedupe within batch (dry-run ≠ actual) (engine.ts:105-107,145) | |
|
|
249
|
+
| T-350 | F-18/F-19/F-20 · drift endpoint: unguarded statSync 500s on dangling symlink; O(exports × memories) substring scan; a READ appends audit events (drift.ts:27,139-144,178-191) | |
|
|
250
|
+
| T-351 | F-21 · mesh anchor path traversal: memory-supplied `file_path` → unbounded readFileSync; only gate is `includes("packages/")` (contracts.ts:121; ui.ts:577; discovery.ts:28-41) | · dep: T-363 · F |
|
|
251
|
+
| T-352 | F-22/F-23 · ADR integrity: supersede-before-save leaves dangling ref on failure; rejected ADR stored as confirmed (engine.ts:148,162-165,191) | |
|
|
252
|
+
| T-353 | F-24 · wiki frontmatter forge: unescaped memory title/tags interpolated into YAML scalars (wiki/render.ts:6,10,13,31; read back at compiler.ts:487) | |
|
|
253
|
+
| T-354 | F-25 · CLI arg parsing: `--k=a=b` truncates; `--limit -1` parses as flag; no `--` terminator (cli/shared.ts:17,20) | |
|
|
254
|
+
| T-355 | F-26 · sync pool_dir forwarding: `/api/sync/pool` body → arbitrary mkdir/readdir (ui.ts:503 → sync/pool.ts:19,22,33) | · dep: T-363 · F |
|
|
255
|
+
| T-356 | F-27 · pageindex disclosure-depth is a no-op: `maxDepth`/`disclosureDepth` accepted, never used (engine.ts:124-125 vs 137-165) | |
|
|
256
|
+
| T-357 | F-28 · migrator status cast: raw provider string → `MemoryStatus` unvalidated; `isLatest !== false` defaults to confirmed (generic.ts:68; agentmemory.ts:44) | |
|
|
257
|
+
| T-358 | F-29 · ADR-001 violation: `handleDaemonCommand` returns never-resolving promise + second blocking server (cli/ecosystem.ts:507) | · dep: T-367 · F |
|
|
258
|
+
| T-359 | F-30 · upgrade stubs render ✅ for empty audit steps; 35 empty `catch {}` in cli/ (upgrade.ts:507-509,530-532) | |
|
|
259
|
+
| T-360 | F-31/F-35 · UI shutdown + numeric validation: keep-alive sockets block close (ui.ts:626); unvalidated parseInt limits (ui.ts:209,613) | |
|
|
260
|
+
| T-361 | F-32 · escapeHtml omits `'`; `item.priority` unescaped into class attribute (ui.ts:1588 (omits ') + :2092/:2094) | |
|
|
261
|
+
| T-362 | F-33/F-34 · migrator dead config + misclassification: `global` never read; `skipped` unreachable; `s.includes("op")` matches loop/topic/propose (types.ts:71; engine.ts:70; drift.ts:12,130) | |
|
|
262
|
+
| T-369 | benchmark threshold tests: "sub-50 µs" (benchmark/suite.ts:85) and "sub-2ms" claims have NO threshold assertions — `test/benchmark.test.ts:54,58` assert `>= 0`. Either assert real gates or remove the claims (feeds T-131 honesty) | |
|
|
263
|
+
| T-370 | docs truth pass (replaces/extend T-015): 80+→52 platforms (×5 README places); "24+ formats"→22 detectors/3 adapters; "29 engines"→same; "61 tools/6 profiles"→107 tools/7 profiles; remove `profile_switch` (0 occurrences); daemon SSE≠WebSocket label; README body 497/84/2190→502/85/2224; current.md #32 "Linus hardening" is PARTIAL until T-001 lands (verify.ts:23 unpatched); capability #15 PARTIAL (`evaluateSessionOutcomes` 0 production callers); #21 PARTIAL (7 phantom profile names); #33 PARTIAL (`maybeAutoOptimize` 0 callers) | |
|
|
264
|
+
| T-371 | lying security tests: `security_hardening.test.ts:95-100` (1MB-DoS guard proves nothing — catch returns synthesized 500; real path `ui.ts:642 req.destroy()` never asserted), `:127-136` (SQL-injection half vanishes behind `if (store.db)`) | |
|
|
265
|
+
| T-372 | tautological doctor test: name says "uninitialized directory", asserts `initialized === true` — `doctor.ts:60-63` creates `.memory` before the check, assertion cannot fail (`doctor.test.ts:10-19`) | |
|
|
266
|
+
| T-373 | substring-grep UI tests → real assertions: ~30 `expect(html).toContain(id)` asserts on generated HTML (`ui.test.ts:48-57,114-124,132-210`) prove identifiers exist, not behavior | |
|
|
267
|
+
| T-374 | toBeDefined/tautology assertions → value assertions: `health.test.ts:221-228` (9× toBeDefined on muse_health MCP+CLI), `benchmark.test.ts:47-72` (6× `>= 0` at :50,54,58,66,70,71 — cannot fail) | |
|
|
268
|
+
| T-375 | Array.isArray-only list tests → content assertions: `optimize.test.ts`, `mesh.test.ts:271`, `ui.test.ts:32,63,81,146,209`, `connect.test.ts:34`, `mcp.test.ts:70-129` (12 dynamic-import re-imports inflate apparent coverage) | |
|
|
269
|
+
| T-376 | reconcile authoritative-test conflicts: `graph.test.ts` ⊂ `graph_ast.test.ts`; `retrieval_engine.test.ts` asserts 3 headings where `retrieval.test.ts:44-77` asserts content; `panda_loader.test.ts` supersedes `upgrade.test.ts:28-34`; `agents.test.ts:56` supersedes connect duplicates; `sqlite_primary.test.ts:19-91` supersedes `store.test.ts:9-24` (never reloads store) | |
|
|
270
|
+
| T-377 | false-coverage test name: `sqlite_primary.test.ts:47` claims "stale" transition in a body that imports `markStale` and never calls it (`:4`) — rename or execute | |
|
|
271
|
+
| T-378 | dead test imports: `quality.test.ts:8` (computeJaccardSimilarity, consolidateIntoCanonical), `settings.test.ts:10,13`, `orchestrator.test.ts:13` (getActiveMcpProfile), `intelligence.test.ts:7` (LspProvider) — delete imports or restore coverage | |
|
|
272
|
+
|
|
273
|
+
### WAVE 1b — MULTI-WRITER — **DEFERRED** (one principal, one store; keep T-044) — 7 tickets
|
|
274
|
+
|
|
275
|
+
| ID | Ticket |
|
|
276
|
+
|---|---|
|
|
277
|
+
| T-038 | `idempotency_key` column + UNIQUE index on capture · schema, store · branch: multi-writer-merge | |
|
|
278
|
+
| T-039 | divergent-retry → named conflict naming existing id · store.ts · branch: multi-writer-merge | |
|
|
279
|
+
| T-040 | `content_hash` normalize (whitespace/case) + dedup on propose · store.ts, quality · branch: multi-writer-merge | |
|
|
280
|
+
| T-041 | write outbox states pending→processing→sent/held/failed · schema, store · branch: multi-writer-merge | |
|
|
281
|
+
| T-042 | `recover_stale_locks` sweep (300s) on open · store.ts · branch: multi-writer-merge | |
|
|
282
|
+
| T-043 | non-idempotent ops default `auto_replay=0` (held, manual replay) · store.ts · branch: multi-writer-merge | |
|
|
283
|
+
| T-328 | MEDIUM (B22) · real Lamport counter: sync clock is `memories.length + Date.now()` (sync/engine.ts:118-125) — equal counts collide, divergence undetectable | · dep: T-044 · U |
|
|
284
|
+
|
|
285
|
+
### WAVE 2b — EMBEDDINGS — **GATED** on T-381 spike (zero implementation files exist) — 5 tickets
|
|
286
|
+
|
|
287
|
+
| ID | Ticket |
|
|
288
|
+
|---|---|
|
|
289
|
+
| T-071 | dual calibrated thresholds (cosine max + BM25 min, engine-pinned constants) · retrieval · branch: local-embeddings-llama-cpp | |
|
|
290
|
+
| T-136 | embeddings engine fingerprint pinning · intelligence/embed · branch: local-embeddings-llama-cpp | |
|
|
291
|
+
| T-137 | FTS5-floor/vector-upgrade degradation path · retrieval · branch: local-embeddings-llama-cpp | |
|
|
292
|
+
| T-138 | brute-force cosine in SQLite BLOB (no ANN daemon, ever) · retrieval · branch: local-embeddings-llama-cpp | |
|
|
293
|
+
| T-139 | `stale_embedder` stamp on reindex-miss entries · store · branch: local-embeddings-llama-cpp | |
|
|
294
|
+
|
|
295
|
+
### WAVE 3 — P2 TEAM/SERVER/UI — **DEFERRED** (no team customers; un-defer trigger: second writer or paying team user) — 29 tickets
|
|
296
|
+
|
|
297
|
+
| ID | Ticket |
|
|
298
|
+
|---|---|
|
|
299
|
+
| T-150 | MCP Streamable HTTP transport (2025-06-18 spec) · mcp.ts · new | |
|
|
300
|
+
| T-151 | Origin validation + session id + protocol version headers · mcp.ts · new | |
|
|
301
|
+
| T-152 | SSE resumability for long polls · mcp.ts · new | |
|
|
302
|
+
| T-153 | per-tenant SQLite DB files (team mode) · store, root · new | |
|
|
303
|
+
| T-154 | extend `sync/pool.ts` to HTTP transport · sync · new | |
|
|
304
|
+
| T-155 | git/YAML-mirror distribution path for team sync · sync · new | |
|
|
305
|
+
| T-156 | Litestream sidecar backup docs+compose · docs, scripts · new | |
|
|
306
|
+
| T-157 | dashboard: recall-debug per-factor breakdown panel · ui · branch: studio-recall-debug | |
|
|
307
|
+
| T-158 | dashboard: provenance/lineage graph panel · ui · new | |
|
|
308
|
+
| T-159 | dashboard: eval panel (harness results) · ui · branch: recall-eval-harness + studio-recall-debug | |
|
|
309
|
+
| T-160 | dashboard: lifecycle control tower (trust/decay/tombstone/restore) · ui · new | |
|
|
310
|
+
| T-161 | dashboard: config-honesty panel · ui | · dep: T-129 · new · F |
|
|
311
|
+
| T-162 | dashboard: team mesh view · ui | · dep: T-153 · new · F |
|
|
312
|
+
| T-163 | dashboard read-only invariant (UI never writes state.db) · ui · new | |
|
|
313
|
+
| T-164 | event-triggered consolidation on compaction/step-count · cognition · new | |
|
|
314
|
+
| T-165 | dual-trigger maintenance cadence (N turns AND wall-clock) · optimize · new | |
|
|
315
|
+
| T-166 | cron ownership-token reconciliation with embedded effective config · optimize · new | |
|
|
316
|
+
| T-168 | Hermes `MemoryProvider` interface · new module · new | |
|
|
317
|
+
| T-169 | Muse-MCP-backed provider adapter · new module · new | |
|
|
318
|
+
| T-170 | catalog submission (hermesagents plugin registry) · packaging · new | |
|
|
319
|
+
| T-171 | qdrant remote-vector adapter (opt-in, behind Store interface) · store adapters · branch: qdrant-hermes | |
|
|
320
|
+
| T-172 | federation fail-closed probes outside write locks · sync | · dep: T-088 · new · F |
|
|
321
|
+
| T-173 | observer/observed directional query (concept reimplement — AGPL) · retrieval · new | |
|
|
322
|
+
| T-174 | peer/namespace scoping · store | · dep: T-153 · new · U |
|
|
323
|
+
| T-175 | reserved slots per peer · orchestrator · new | |
|
|
324
|
+
| T-176 | memory forking/branching · store · branch: feat (R31) | |
|
|
325
|
+
| T-177 | safety snapshots before governance passes · store · new | |
|
|
326
|
+
| T-180 | funded/shared memory pools spec (Walrus delegation model) · .agents/research · new | |
|
|
327
|
+
| T-181 | memory marketplace spec (permissioned transfer grants) · .agents/research · new | |
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
## 6. What a reviewer should still attack
|
|
331
|
+
|
|
332
|
+
1. **The 12-ticket cut for v2.3.1** — is it the right 12? (Strategic review chose it from trust-risk; executability review confirmed all 12 are small except T-363.)
|
|
333
|
+
2. **Wave 2's premise** — 74 quality tickets. The R3 baseline (T-385: 40 must-return queries from the principal's own `.memory/`) gates the wave: if the engine already clears the bar, most of Wave 2 is unmeasurable. Should the baseline run before any Wave-2 implementation?
|
|
334
|
+
3. **T-163 (dashboard writes vs read-only invariant)** — 15 live write endpoints vs a claim the dashboard never writes. Principal decision pending (D3).
|
|
335
|
+
4. **YAML-first read (T-204)** — ✅ RESOLVED (D1): nothing outside the repo edits the YAML mirror, so the DB-first flip is a safe 6-line fix, no deprecation window.
|
|
336
|
+
5. **Branch/gate model (D2)** — ✅ RESOLVED: one branch per ticket (`fix/T-xxx`), full gate per commit; 236 branches merge in critical-path order with per-file collision serialization.
|
|
337
|
+
6. **The collision map** — `src/sqlite.ts` initSchema (10 tickets add columns), `src/store.ts` (17 refs), `src/mcp.ts` (12, incl. 4 tickets claiming the `memory_capture` case at :1692), `src/retrieval*` (~13), `src/ui.ts` (16). Serialize by file, not by wave.
|
|
338
|
+
|
|
339
|
+
## 7. Known weaknesses of this plan itself
|
|
340
|
+
|
|
341
|
+
- Defect claims are static; T-303/T-308/T-320 have no runtime proof until T-384's fixture exists.
|
|
342
|
+
- T-140 (recall grading) is corpus labeling — a multi-week data task hiding behind a `U` gate.
|
|
343
|
+
- 14 original file:line references were wrong (7 files are named `engine.ts`); the register now qualifies repo-relative paths, but any NEW ticket must do the same.
|
|
344
|
+
- The `tsc`/build gates were verified at review time, not in CI — wire the gate check before ticket one.
|
|
345
|
+
|
|
346
|
+
## 8. Register file map for drill-down
|
|
347
|
+
|
|
348
|
+
- Full ticket register with sources/deps: `.agents/context/ticket-plan.md`
|
|
349
|
+
- Ecosystem sources per ticket: `.agents/research/ecosystem-teardown-2026-10.md` §10
|
|
350
|
+
- Post-senior-review corrections: `ticket-plan.md` §v6
|
|
351
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Local Vector Embeddings via llama.cpp (R21)
|
|
2
|
+
|
|
3
|
+
**Status**: Planned — spec for review · **Roadmap**: R21 · **Base**: main
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
Muse recall is lexical (FTS5 BM25 + hashed-trigram "vectors"). Terminology
|
|
7
|
+
mismatches ("rate limit" stored vs "why is sync failing" asked) miss
|
|
8
|
+
semantically related memories. The October research deferred dense vectors
|
|
9
|
+
(A12) *only* until a "zero-cost, zero-API-key local embedding" existed —
|
|
10
|
+
llama.cpp server meets that condition. Unblocks A12 without breaking the
|
|
11
|
+
keyless promise: opt-in, off by default, lexical path unchanged.
|
|
12
|
+
|
|
13
|
+
## What already exists (reuse)
|
|
14
|
+
- `src/vector.ts` — trigram embed + cosine + BM25 hybrid (stays as fallback)
|
|
15
|
+
- `src/retrieval/engine.ts` — mode routing already switches on index presence
|
|
16
|
+
- `src/retrieval/ranking.ts` — 11-dim scoring; semantic cosine becomes dim #12
|
|
17
|
+
|
|
18
|
+
## Smallest implementation
|
|
19
|
+
- New `src/retrieval/embedders.ts`: `Embedder` interface (`probe()`, `embed(texts[])`)
|
|
20
|
+
- One adapter: OpenAI-compatible `/v1/embeddings` over bun `fetch` — covers
|
|
21
|
+
llama.cpp, Ollama, hosted providers, and a future Hermes embedding facade
|
|
22
|
+
by URL alone. Zero npm dependencies.
|
|
23
|
+
- Vectors as float32 BLOB column in SQLite; brute-force cosine
|
|
24
|
+
(`ponytail:` no ANN index until measured at 10k+ entries)
|
|
25
|
+
- Fingerprint `model|dims|endpoint` stored with the index; mismatch refuses
|
|
26
|
+
reuse, `memory embed reindex` rebuilds (qdrant-memory `init` pattern)
|
|
27
|
+
- CLI: `memory embed status | reindex`; config key `retrieval.embedder_url`
|
|
28
|
+
(unset = trigram fallback, today's behavior)
|
|
29
|
+
|
|
30
|
+
## Acceptance criteria
|
|
31
|
+
- No embedder configured → identical behavior to today (existing tests pass untouched)
|
|
32
|
+
- Configured → `memory embed status` reports model, dims, fingerprint
|
|
33
|
+
- Mismatched fingerprint refuses to load; reindex succeeds
|
|
34
|
+
- New dim #12 wired into `ranking.ts`; `bun test` + `tsc --noEmit` + build green
|
|
35
|
+
|
|
36
|
+
## Gate
|
|
37
|
+
bun test · tsc --noEmit · bun run build · R27 recall@5 measured before/after
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Recall Quality Eval Harness (R27)
|
|
2
|
+
|
|
3
|
+
**Status**: Planned — spec for review · **Roadmap**: R27 · **Base**: main
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
Current benchmarks measure speed, not recall. "Search got better" is a
|
|
7
|
+
feeling; R21 and every future retrieval change need a falsifier. The 2026
|
|
8
|
+
standard (LoCoMo / LongMemEval / LME-V2) tests recall against distractors —
|
|
9
|
+
Muse ships zero equivalent.
|
|
10
|
+
|
|
11
|
+
## What already exists (reuse)
|
|
12
|
+
- `src/benchmark/` — latency harness; extend, don't replace
|
|
13
|
+
- `test/` — bun test infra; the gate is a normal test file
|
|
14
|
+
- LME-V2's five abilities map to shipped features (gotchas = negative
|
|
15
|
+
memories, premise = constraints, dynamic tracking = bi-temporal)
|
|
16
|
+
|
|
17
|
+
## Smallest implementation
|
|
18
|
+
- `test/recall-eval.test.ts` + fixture `test/fixtures/recall-golden.json`:
|
|
19
|
+
~60 queries, each with relevant IDs + same-topic distractor IDs
|
|
20
|
+
(paraphrase + terminology-mismatch cases — the documented vector-only failure)
|
|
21
|
+
- Report recall@5 + p50 latency; fail the suite below a threshold constant
|
|
22
|
+
- Fixture grows from real `.memory/` stores, not invented data
|
|
23
|
+
|
|
24
|
+
## Acceptance criteria
|
|
25
|
+
- recall@5 ≥ 0.8 on the golden fixture (threshold in one named constant)
|
|
26
|
+
- Distractor discrimination reported (relevant vs near-miss margin)
|
|
27
|
+
- Runs in the existing `bun test` suite; no network, no LLM
|
|
28
|
+
- Needed before judging R21 and every future retrieval change
|
|
29
|
+
|
|
30
|
+
## Gate
|
|
31
|
+
bun test (the gate itself) · tsc --noEmit · bun run build
|