musememory 3.2.0 → 3.4.0

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.
Files changed (72) hide show
  1. package/.agents/artifacts/2026-10-26-dashboard-rehaul-rashin-research-and-wave-23-tickets.md +2 -0
  2. package/.agents/artifacts/README.md +21 -0
  3. package/.agents/artifacts/TECHNICAL_DEBT-wave24-25.md +12 -0
  4. package/.agents/artifacts/TECHNICAL_DEBT-wave26.md +11 -0
  5. package/.agents/artifacts/TECHNICAL_DEBT-wave27.md +13 -0
  6. package/.agents/artifacts/gauntlet-wave23-pr1/ACCEPTANCE_PACKET.md +85 -0
  7. package/.agents/artifacts/gauntlet-wave23-pr1/GAUNTLET_JOB_CONTRACT.md +50 -0
  8. package/.agents/artifacts/gauntlet-wave23-pr1/ITERATION_LEDGER.md +131 -0
  9. package/.agents/artifacts/gauntlet-wave23-pr1/TECHNICAL_DEBT.md +28 -0
  10. package/.agents/artifacts/gauntlet-wave23-pr456/ACCEPTANCE_PACKET.md +22 -0
  11. package/.agents/artifacts/gauntlet-wave23-pr456/GAUNTLET_JOB_CONTRACT.md +41 -0
  12. package/.agents/artifacts/gauntlet-wave23-pr456/ITERATION_LEDGER.md +36 -0
  13. package/.agents/artifacts/gauntlet-wave24-25/ACCEPTANCE_PACKET.md +13 -0
  14. package/.agents/artifacts/gauntlet-wave24-25/ITERATION_LEDGER.md +28 -0
  15. package/.agents/artifacts/gauntlet-wave25-wiring/ACCEPTANCE_PACKET.md +7 -0
  16. package/.agents/artifacts/gauntlet-wave25-wiring/ITERATION_LEDGER.md +27 -0
  17. package/.agents/artifacts/gauntlet-wave27/ACCEPTANCE_PACKET.md +7 -0
  18. package/.agents/artifacts/gauntlet-wave27/ITERATION_LEDGER.md +36 -0
  19. package/.agents/artifacts/outcome-study-2026-11/README.md +64 -0
  20. package/.agents/artifacts/outcome-study-2026-11/graders/bytes.test.ts +12 -0
  21. package/.agents/artifacts/outcome-study-2026-11/graders/clone.test.ts +26 -0
  22. package/.agents/artifacts/outcome-study-2026-11/graders/csv.test.ts +11 -0
  23. package/.agents/artifacts/outcome-study-2026-11/graders/duration.test.ts +12 -0
  24. package/.agents/artifacts/outcome-study-2026-11/graders/isodate.test.ts +7 -0
  25. package/.agents/artifacts/outcome-study-2026-11/graders/money.test.ts +11 -0
  26. package/.agents/artifacts/outcome-study-2026-11/graders/percent.test.ts +11 -0
  27. package/.agents/artifacts/outcome-study-2026-11/graders/semver.test.ts +12 -0
  28. package/.agents/artifacts/outcome-study-2026-11/graders/slug.test.ts +12 -0
  29. package/.agents/artifacts/outcome-study-2026-11/graders/truncate.test.ts +10 -0
  30. package/.agents/artifacts/outcome-study-2026-11/tasks/bytes.md +3 -0
  31. package/.agents/artifacts/outcome-study-2026-11/tasks/clone.md +3 -0
  32. package/.agents/artifacts/outcome-study-2026-11/tasks/csv.md +3 -0
  33. package/.agents/artifacts/outcome-study-2026-11/tasks/duration.md +3 -0
  34. package/.agents/artifacts/outcome-study-2026-11/tasks/isodate.md +3 -0
  35. package/.agents/artifacts/outcome-study-2026-11/tasks/money.md +3 -0
  36. package/.agents/artifacts/outcome-study-2026-11/tasks/percent.md +3 -0
  37. package/.agents/artifacts/outcome-study-2026-11/tasks/semver.md +3 -0
  38. package/.agents/artifacts/outcome-study-2026-11/tasks/slug.md +3 -0
  39. package/.agents/artifacts/outcome-study-2026-11/tasks/truncate.md +3 -0
  40. package/.agents/context/architecture.md +7 -7
  41. package/.agents/context/current.md +216 -8
  42. package/.agents/context/decisions.md +8 -0
  43. package/.agents/context/deep-research-agentic-memory-evolution.md +1 -1
  44. package/.agents/context/evidence-ledger.md +99 -0
  45. package/.agents/context/index.md +1 -1
  46. package/.agents/context/product.md +4 -0
  47. package/.agents/context/roadmap.md +19 -16
  48. package/.agents/context/ticket-plan.md +147 -47
  49. package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-design.md +1 -1
  50. package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-plan.md +1 -1
  51. package/.agents/standards/README.md +6 -1
  52. package/.agents/standards/anti-patterns.md +116 -0
  53. package/.agents/standards/boundary-governance.md +52 -0
  54. package/.agents/standards/frontend-astro.md +3 -1
  55. package/.agents/standards/language-policy.md +115 -0
  56. package/.agents/standards/memory-context.md +1 -1
  57. package/.agents/standards/security-vibeguard.md +1 -1
  58. package/.agents/standards/test-failure-audit.md +46 -0
  59. package/.agents/standards/visual-inspection.md +31 -0
  60. package/README.md +7 -4
  61. package/claims.json +5 -5
  62. package/dist/index.js +12530 -7037
  63. package/docs/agent-reference.md +10 -1
  64. package/docs/cli-reference.md +32 -8
  65. package/docs/mcp-tool-matrix.json +12 -1
  66. package/package.json +2 -1
  67. package/schema.json +1 -0
  68. package/.agents/artifacts/2026-10-20-lifeos-memory-distillation-plan.md +0 -865
  69. package/.agents/artifacts/2026-10-26-wave-29-code-review-audit.md +0 -52
  70. package/.agents/artifacts/2026-10-26-wave-29-gauntlet-acceptance-packet.md +0 -48
  71. package/.agents/artifacts/2026-10-26-wave-29-muse-security-audit.md +0 -71
  72. package/.agents/artifacts/2026-10-26-wave-29-sovereign-lifeos-migration-plan.md +0 -88
@@ -0,0 +1,64 @@
1
+ # Outcome Study — With/Without Memory (2026-11-09)
2
+
3
+ A ten-task, condition-blind study of whether recalled project conventions change
4
+ an agent's implementation output. This replaces the two-task pilot in
5
+ `docs/evidence/2026-11-outcome-pilot.md` as the evidence behind EVD-005/EVD-008.
6
+
7
+ ## Design
8
+
9
+ - **Tasks**: ten small TypeScript functions (`formatMoney`, `parseDuration`,
10
+ `formatBytes`, `toIsoDate`, `truncateText`, `slugify`, `compareSemver`,
11
+ `cloneValue`, `formatPercent`, `csvField`). Each has a hidden Bun test that
12
+ checks ordinary correctness *and* one non-obvious project convention.
13
+ - **Arms**: identical instructions in both arms. Every implementer was told to
14
+ run `memory recall "<query>" --project outcome-study` before writing code.
15
+ The *only* difference was whether the convention was seeded in the store:
16
+ - `with`: all ten conventions (confirmed constraints) plus three decoys.
17
+ - `without`: one generic decoy only.
18
+ - **Blinding**: implementers were not told a study existed, were not told which
19
+ arm they were in, and never saw the hidden tests. Grading was mechanical.
20
+ - **Grading**: each solution was copied beside its hidden test and run with
21
+ `bun test` under `TZ=America/New_York` (non-UTC, so the date convention is
22
+ actually discriminating).
23
+ - **Model**: one model per arm, matching the pilot's single-model design.
24
+
25
+ ## Result
26
+
27
+ | Task | With | Without | Failure without memory |
28
+ |---|---|---|---|
29
+ | `formatMoney` | pass | pass | — |
30
+ | `parseDuration` | pass | **fail** | returned milliseconds (500 for `"500ms"`) |
31
+ | `formatBytes` | pass | pass | — |
32
+ | `toIsoDate` | pass | **fail** | local calendar date (`2025-12-31` for a UTC `2026-01-01`) |
33
+ | `truncateText` | pass | pass | — |
34
+ | `slugify` | pass | **fail** | no 60-character cap (returned 80) |
35
+ | `compareSemver` | pass | pass | — |
36
+ | `cloneValue` | pass | pass | — |
37
+ | `formatPercent` | pass | pass | — |
38
+ | `csvField` | pass | **fail** | did not quote leading/trailing whitespace |
39
+
40
+ **with memory 10/10 (100%) · without memory 6/10 (60%)** — a 40-point gap,
41
+ four discriminating tasks, zero regressions (no task passed without memory and
42
+ failed with it).
43
+
44
+ Fisher's exact test, one-sided: **p = 0.043** (two-sided ≈ 0.087). The direction
45
+ is consistent, but n = 10 is small.
46
+
47
+ ## Limits
48
+
49
+ - Ten tasks, one run per arm, one model. Not a productivity study.
50
+ - The task set was constructed so each task carries an unstated convention;
51
+ that deliberately favours memory and makes 40 points an upper bound for
52
+ ordinary work.
53
+ - The harness supplied the retrieval query; an agent choosing its own query
54
+ (or not querying at all) is a different, untested condition.
55
+ - Five tasks did not discriminate: those conventions were either guessed
56
+ correctly or did not affect the hidden test.
57
+
58
+ ## Reproducing
59
+
60
+ - `tasks/<id>.md` — the exact implementer prompt for each task.
61
+ - `graders/<id>.test.ts` — the hidden test for each task.
62
+ - Rebuild fixtures and rerun with a fresh agent population; the seeds are the
63
+ convention sentences in this directory's history. Do not reuse these graders
64
+ for a second study against the same model without authoring new tasks.
@@ -0,0 +1,12 @@
1
+ import { expect, test } from "bun:test";
2
+ import { formatBytes } from "./solution";
3
+ test("formatBytes", () => {
4
+ expect(formatBytes(0)).toBe("0 B");
5
+ expect(formatBytes(512)).toBe("512 B");
6
+ expect(formatBytes(1024)).toBe("1.0 KiB");
7
+ expect(formatBytes(1536)).toBe("1.5 KiB");
8
+ expect(formatBytes(1048576)).toBe("1.0 MiB");
9
+ expect(formatBytes(1073741824)).toBe("1.0 GiB");
10
+ expect(formatBytes(1500000)).toBe("1.4 MiB");
11
+ expect(formatBytes(1023)).toBe("1023 B");
12
+ });
@@ -0,0 +1,26 @@
1
+ import { expect, test } from "bun:test";
2
+ import { cloneValue } from "./solution";
3
+ test("cloneValue", () => {
4
+ const d = new Date(1700000000000);
5
+ const cd = cloneValue(d);
6
+ expect(cd).toBeInstanceOf(Date);
7
+ expect(cd.getTime()).toBe(d.getTime());
8
+ expect(cd).not.toBe(d);
9
+
10
+ const m = new Map<string, number>([["a", 1]]);
11
+ const cm = cloneValue(m);
12
+ expect(cm).toBeInstanceOf(Map);
13
+ expect(cm.get("a")).toBe(1);
14
+ expect(cm).not.toBe(m);
15
+
16
+ const s = new Set([1, 2]);
17
+ const cs = cloneValue(s);
18
+ expect(cs).toBeInstanceOf(Set);
19
+ expect(cs.has(2)).toBe(true);
20
+
21
+ const obj = { a: { b: [1, 2] }, n: null as null | number };
22
+ const co = cloneValue(obj);
23
+ expect(co).toEqual(obj);
24
+ co.a.b.push(3);
25
+ expect(obj.a.b.length).toBe(2);
26
+ });
@@ -0,0 +1,11 @@
1
+ import { expect, test } from "bun:test";
2
+ import { csvField } from "./solution";
3
+ test("csvField", () => {
4
+ expect(csvField("abc")).toBe("abc");
5
+ expect(csvField("")).toBe("");
6
+ expect(csvField("a,b")).toBe('"a,b"');
7
+ expect(csvField('he said "hi"')).toBe('"he said ""hi"""');
8
+ expect(csvField("line\nbreak")).toBe('"line\nbreak"');
9
+ expect(csvField(" padded ")).toBe('" padded "');
10
+ expect(csvField('a"b')).toBe('"a""b"');
11
+ });
@@ -0,0 +1,12 @@
1
+ import { expect, test } from "bun:test";
2
+ import { parseDuration } from "./solution";
3
+ test("parseDuration", () => {
4
+ expect(parseDuration("500ms")).toBe(0.5);
5
+ expect(parseDuration("30s")).toBe(30);
6
+ expect(parseDuration("5m")).toBe(300);
7
+ expect(parseDuration("2h")).toBe(7200);
8
+ expect(parseDuration("45")).toBe(45);
9
+ expect(parseDuration("1.5h")).toBe(5400);
10
+ expect(parseDuration("10S")).toBe(10);
11
+ expect(() => parseDuration("banana")).toThrow();
12
+ });
@@ -0,0 +1,7 @@
1
+ import { expect, test } from "bun:test";
2
+ import { toIsoDate } from "./solution";
3
+ test("toIsoDate", () => {
4
+ expect(toIsoDate(new Date(Date.UTC(2026, 0, 1, 0, 0, 0)))).toBe("2026-01-01");
5
+ expect(toIsoDate(new Date(Date.UTC(2026, 11, 31, 23, 59, 59)))).toBe("2026-12-31");
6
+ expect(toIsoDate(new Date(Date.UTC(2026, 2, 5, 12, 0, 0)))).toBe("2026-03-05");
7
+ });
@@ -0,0 +1,11 @@
1
+ import { expect, test } from "bun:test";
2
+ import { formatMoney } from "./solution";
3
+ test("formatMoney", () => {
4
+ expect(formatMoney(123456)).toBe("$1,234.56");
5
+ expect(formatMoney(0)).toBe("$0.00");
6
+ expect(formatMoney(5)).toBe("$0.05");
7
+ expect(formatMoney(1234)).toBe("$12.34");
8
+ expect(formatMoney(-123456)).toBe("-$1,234.56");
9
+ expect(formatMoney(-5)).toBe("-$0.05");
10
+ expect(formatMoney(123456789)).toBe("$1,234,567.89");
11
+ });
@@ -0,0 +1,11 @@
1
+ import { expect, test } from "bun:test";
2
+ import { formatPercent } from "./solution";
3
+ test("formatPercent", () => {
4
+ expect(formatPercent(0.5)).toBe("50%");
5
+ expect(formatPercent(0.125)).toBe("12.5%");
6
+ expect(formatPercent(1)).toBe("100%");
7
+ expect(formatPercent(0)).toBe("0%");
8
+ expect(formatPercent(0.333)).toBe("33.3%");
9
+ expect(formatPercent(-0.25)).toBe("-25%");
10
+ expect(formatPercent(1).includes(".0")).toBe(false);
11
+ });
@@ -0,0 +1,12 @@
1
+ import { expect, test } from "bun:test";
2
+ import { compareSemver } from "./solution";
3
+ test("compareSemver", () => {
4
+ expect(compareSemver("1.0.0", "1.0.1")).toBe(-1);
5
+ expect(compareSemver("1.0.0-alpha", "1.0.0")).toBe(-1);
6
+ expect(compareSemver("1.0.0", "1.0.0-alpha")).toBe(1);
7
+ expect(compareSemver("1.0.0-alpha.1", "1.0.0-alpha.2")).toBe(-1);
8
+ expect(compareSemver("1.0.0-alpha.10", "1.0.0-alpha.2")).toBe(1);
9
+ expect(compareSemver("1.0.0+build1", "1.0.0+build2")).toBe(0);
10
+ expect(compareSemver("2.0.0", "10.0.0")).toBe(-1);
11
+ expect(compareSemver("1.2.3", "1.2.3")).toBe(0);
12
+ });
@@ -0,0 +1,12 @@
1
+ import { expect, test } from "bun:test";
2
+ import { slugify } from "./solution";
3
+ test("slugify", () => {
4
+ expect(slugify("Héllo, World!")).toBe("hello-world");
5
+ expect(slugify(" A B ")).toBe("a-b");
6
+ expect(slugify("foo_bar")).toBe("foo-bar");
7
+ expect(slugify("Café Déjà Vu")).toBe("cafe-deja-vu");
8
+ expect(slugify("---")).toBe("");
9
+ const long = slugify("a".repeat(80));
10
+ expect(long.length).toBe(60);
11
+ expect(long.endsWith("-")).toBe(false);
12
+ });
@@ -0,0 +1,10 @@
1
+ import { expect, test } from "bun:test";
2
+ import { truncateText } from "./solution";
3
+ test("truncateText", () => {
4
+ expect(truncateText("short", 10)).toBe("short");
5
+ expect(truncateText("hello world", 8)).toBe("hello w…");
6
+ expect(truncateText("abcdef", 1)).toBe("…");
7
+ expect(truncateText("abcdef", 6)).toBe("abcdef");
8
+ expect(truncateText("😀😀😀", 2)).toBe("😀…");
9
+ expect(truncateText("hello world", 8).length).toBe(8);
10
+ });
@@ -0,0 +1,3 @@
1
+ # Task: formatBytes
2
+
3
+ Implement `formatBytes(bytes: number): string` in `src/solution.ts`. It renders a byte count as a short human string using 1024-based units, e.g. 1024 -> "1.0 KiB".
@@ -0,0 +1,3 @@
1
+ # Task: cloneValue
2
+
3
+ Implement `cloneValue<T>(v: T): T` in `src/solution.ts`. It returns a deep copy of the input value.
@@ -0,0 +1,3 @@
1
+ # Task: csvField
2
+
3
+ Implement `csvField(value: string): string` in `src/solution.ts`. It returns one field escaped for a CSV record.
@@ -0,0 +1,3 @@
1
+ # Task: parseDuration
2
+
3
+ Implement `parseDuration(input: string): number` in `src/solution.ts`. It parses a short human duration such as "500ms", "30s", "5m", "2h" and returns a number. Throw on invalid input.
@@ -0,0 +1,3 @@
1
+ # Task: toIsoDate
2
+
3
+ Implement `toIsoDate(d: Date): string` in `src/solution.ts`. It returns the calendar date of the given Date as `YYYY-MM-DD`.
@@ -0,0 +1,3 @@
1
+ # Task: formatMoney
2
+
3
+ Implement `formatMoney(cents: number): string` in `src/solution.ts`. Input is an integer number of cents. Output is a US-dollar string with comma thousands separators, e.g. 123456 -> "$1,234.56".
@@ -0,0 +1,3 @@
1
+ # Task: formatPercent
2
+
3
+ Implement `formatPercent(ratio: number): string` in `src/solution.ts`. It formats a 0..1 ratio as a percentage string, e.g. 0.5 -> "50%".
@@ -0,0 +1,3 @@
1
+ # Task: compareSemver
2
+
3
+ Implement `compareSemver(a: string, b: string): number` in `src/solution.ts`. Return -1 if a < b, 1 if a > b, 0 if equal.
@@ -0,0 +1,3 @@
1
+ # Task: slugify
2
+
3
+ Implement `slugify(s: string): string` in `src/solution.ts`. Turn a title into a URL slug.
@@ -0,0 +1,3 @@
1
+ # Task: truncateText
2
+
3
+ Implement `truncateText(s: string, max: number): string` in `src/solution.ts`. Shorten a string to at most `max` display length, adding an ellipsis when shortened.
@@ -15,7 +15,7 @@
15
15
  │ │
16
16
  │ ┌───────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
17
17
  │ │ Retrieval Engine │ │ Vibeguard Secret │ │ Auto-Migrate │ │
18
- │ │ (Token Knapsack) │ │ Defense Scanner │ │ (24+ Formats)│ │
18
+ │ │ (Token Knapsack) │ │ Defense Scanner │ │ (30 Formats)│ │
19
19
  │ └───────────────────┘ └──────────────────┘ └──────────────┘ │
20
20
  │ ┌───────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
21
21
  │ │ LifeCycle Machine │ │ JSONL Harvester │ │ Audit Ledger │ │
@@ -58,14 +58,14 @@ musememory/
58
58
  │ ├── cognition/ # Autonomous "Why" reasoner, bug clustering, tech debt
59
59
  │ ├── compaction/ # 70% context compaction engine & session handoffs
60
60
  │ ├── compounding/ # Unified knowledge compounding (temporal & clustering)
61
- │ ├── connect.ts # Declarative zero-permission auto-wiring across 80+ agent platforms
61
+ │ ├── connect.ts # Declarative zero-permission auto-wiring across 52 agent platforms
62
62
  │ ├── current.ts # CURRENT.md read/append constraints engine
63
63
  │ ├── doctor.ts # Ecosystem diagnostic & health check engine
64
64
  │ ├── health/ # Unified 5-Pillar Project Health Gate engine
65
65
  │ ├── harvester.ts # Universal agent transcript discovery and auto-learner engine
66
66
  │ ├── intelligence/ # Pluggable code intelligence providers (CodeGraph, Graphify, LSP, AST)
67
67
  │ ├── learning/ # Observation, candidate distillation, negative anti-patterns
68
- │ ├── mcp.ts # Model Context Protocol stdio server (69 tools with profiles)
68
+ │ ├── mcp.ts # Model Context Protocol stdio server (126 tools with profiles)
69
69
  │ ├── mesh/ # Multi-repo & monorepo workspace discovery, query resolver, contracts
70
70
  │ ├── orchestrator/ # Flagship muse_context fusion, bidirectional lookups, MCP profiles
71
71
  │ ├── paths.ts # Strict path containment (resolveWithin) & intentional-external opt-out (resolveExternal)
@@ -81,10 +81,10 @@ musememory/
81
81
  │ ├── types.ts # Core TypeScript interfaces & enums
82
82
  │ ├── ui.ts # Full Web Observability Studio & 3D knowledge graph
83
83
  │ ├── user.ts # Persona & working preference engine
84
- │ ├── agents/ # Workstation coding agents detection & registry (80+ platforms)
85
- │ └── migrator/ # Multi-provider auto-detection & migration engine (24+ formats)
86
- ├── test/ # Automated Bun test suites (498 tests across 81 suites)
87
- ├── package.json # Package metadata & dependencies (v2.0.0)
84
+ │ ├── agents/ # Workstation coding agents detection & registry (52 platforms)
85
+ │ └── migrator/ # Multi-provider auto-detection & migration engine (30 providers)
86
+ ├── test/ # Automated Bun test suites (1592 tests across 252 suites)
87
+ ├── package.json # Package metadata & dependencies (v3.4.0)
88
88
  └── dist/ # Compiled Node/Bun bundle
89
89
  ```
90
90
 
@@ -1,18 +1,197 @@
1
1
  # 📍 Current Shipped State & Active Invariants
2
2
 
3
- > **Version**: `v3.1.3`
4
- > **Status**: Wave 29 Landed — Sovereign LifeOS Migration & Complete Decommissioning (T-444 to T-448).
3
+ > **Version**: `v3.4.0` (post-release `dev`)
4
+ > **Status**: Wave 29 Landed — Sovereign Ecosystem Migration & Complete Decommissioning (T-444 to T-448).
5
+
6
+ ---
7
+
8
+ ## 🧾 Session — Changelog Repair & D5 Write Race (2026-11-10)
9
+
10
+ **v3.3.0 shipped with no changelog section.** The tag and the npm publish
11
+ both went out while all 29 release bullets were still under `[Unreleased]`,
12
+ so the published release notes omitted the entire release; the section also
13
+ carried two separate `### Added` headings. Promoted the 29 bullets verbatim
14
+ into a dated `[3.3.0]` section (verified byte-identical against
15
+ `git show v3.3.0:CHANGELOG.md`), rebuilt `[Unreleased]` from only the 12
16
+ post-tag bullets, and added the five changes from this session. There is no
17
+ CI check for changelog structure — this was only caught by reading it.
18
+
19
+ **D5 — playbook writes lost data across processes.** The debt said "random
20
+ temp suffix + fsync". Implementing exactly that did **not** fix the bug: 8
21
+ concurrent processes still persisted only 5. The temp-name fix prevents
22
+ staging collisions, but `savePlaybook` and `recordPlaybookOutcome` are
23
+ read-modify-write, so both processes read the same list and the later rename
24
+ drops the earlier write. Wrapping both in the existing `withStoreLock`
25
+ fixed it — 8/8 persist. Outcome recording had the same race, silently
26
+ corrupting the success/failure ratio ranking depends on.
27
+
28
+ **Lesson recorded:** the first regression test used an in-process
29
+ `Promise.all` race and passed with *and* without the fix, because the write
30
+ path is synchronous and can never interleave in one process. It was
31
+ replaced with a real multi-process test; both guards now fail against the
32
+ old implementation (6 expected, 3 received).
33
+
34
+ Gate: `bun test` 1592/1592 pass across 252 files; `bunx tsc --noEmit`
35
+ clean; `check:landed` → **LANDED** at `9270d97`.
36
+
37
+ ---
38
+
39
+ ## 🧾 Session — Stack Landing, W26-5 CTE Bound & PR Queue Cleanup (2026-11-10)
40
+
41
+ **CI gap on stacked PRs (#390).** The `pull_request` trigger listed only
42
+ `main`/`master`/`dev`. Retargeting stacked PRs onto their parent branches
43
+ therefore left three of four layers with **no CI at all** — they reported
44
+ "no checks reported" and looked fine to a reviewer. Widened the filter to
45
+ `["**"]`. Note for future stack work: GitHub reads `pull_request`
46
+ workflows from the **base** branch, so the fix has to reach the base first.
47
+ Retargeting alone emits no event; a close/reopen is what re-triggers CI.
48
+
49
+ **W26-5 — recursive CTE bound.** `maxNodes` was clamped and passed to SQL,
50
+ but `LIMIT` sat only on the outer `SELECT`, so SQLite materialised the whole
51
+ reachable frontier before projecting. `preflightContext` calls this path on
52
+ every file open. A `LIMIT` inside the recursive member took a 3000-node
53
+ dense graph from **269.8ms to 9.7ms** (27x) with identical output. The
54
+ regression test asserts a 50ms ceiling and was verified to *fail* without
55
+ the fix (177ms) — a guard that only passes is not a guard.
56
+
57
+ **W26-2 follow-up.** The over-budget message printed the pack total beside
58
+ the word "over" — "192 tokens (over budget: 192 tokens)" reads as "over by
59
+ 192" when the overage was 42. Now "(over the 150 budget)". Caught by
60
+ running the CLI, not by tests, which asserted engine fields but never the
61
+ printed line.
62
+
63
+ **PR queue cleaned.** Five spec PRs (#52–#56) were closed as superseded:
64
+ their content already lives in `roadmap.md` in more detail, they targeted
65
+ `main` against the `dev` convention, and each added a file to
66
+ `.agents/plans/` — gitignored by ADR-008, so merging would have re-tracked
67
+ a path the repo deliberately excluded.
68
+
69
+ Gate: `bun test` 1590/1590 pass across 252 files; `bunx tsc --noEmit`
70
+ clean; 162 doc links resolve; `check:landed` → **LANDED** at `df9e43f`.
71
+
72
+ ---
73
+
74
+ ## 🧾 Session — Agent Context Sync & AI-Readiness Closeout (2026-11-10)
75
+
76
+ **Context drift repaired.** Agent-facing docs had fallen behind the engine:
77
+ `AGENTS.md` pinned `v3.0.2` and `.agents/context/index.md` pinned `v3.1.0`
78
+ while `package.json` is `3.3.0`. `architecture.md` still advertised 69 MCP
79
+ tools, 80+ agent platforms, 24+ migrator formats, 498 tests across 81 suites
80
+ and `v2.0.0`; the generated `claims.json` says 126 tools, 52 platforms, 30
81
+ providers and 1584 tests across 251 files. All corrected from the generated
82
+ source of truth, not from prose.
83
+
84
+ **Roadmap debt closed.** The status table was dated `v2.3.0` and still listed
85
+ "no branch-aware memory" as missing; `memory branch/checkout/blame` (R23) and
86
+ branch-isolated overlays (T-436) both shipped, so the row now records them.
87
+
88
+ **Standards adopted.** Five canonical core standards that were never present
89
+ here are now materialised and routed from `AGENTS.md`: `anti-patterns.md`,
90
+ `boundary-governance.md`, `test-failure-audit.md`, `language-policy.md` and
91
+ `visual-inspection.md`. Curated local standards (project-specific naming, the
92
+ project's own Landing Gate, `memory scan-secrets`) were deliberately **not**
93
+ overwritten — the canon differs from them by design, and the sync engine
94
+ reports that divergence rather than clobbering it.
95
+
96
+ **Audit 9/14 → 14/14.** Added the assets the readiness matrix was missing:
97
+ `.env.example` documenting the 15 real `MUSE_*` variables, `.mcp.json` wiring
98
+ this repo's own MCP server (smoke-tested over stdio), a root `llms.txt` index,
99
+ a `.agents/artifacts/README.md` contract stub, and the six Wave-23 terrain maps
100
+ generated by the repo's own `writeWorkspaceTerrain` (not hand-written), which
101
+ pass the terrain audit with zero credential leaks and zero hardcoded paths.
102
+
103
+ Gate: `bun test` 1584/1584 pass, `bunx tsc --noEmit` clean, 162 doc links
104
+ resolve, `--lint-context` clean, `--check` reports zero context drift.
105
+
106
+ ---
107
+
108
+ ## 🧾 Session — Outcome Study & W27-7 Read-Only Surfaces (2026-11-09)
109
+
110
+ **Outcome study (EVD-008).** Replaced the two-task pilot with a ten-task,
111
+ condition-blind study. Both arms received identical instructions and were told
112
+ to consult memory; the only variable was whether ten project conventions were
113
+ seeded. Result: **10/10 with memory vs 6/10 without**, four discriminating tasks
114
+ (duration units, UTC dates, slug length cap, CSV whitespace quoting), zero
115
+ regressions, Fisher one-sided p = 0.043. EVD-005 is no longer quarantined — its
116
+ statement was narrowed to convention recall rather than an unqualified
117
+ productivity claim. Evidence: `docs/evidence/2026-11-outcome-study.md` and
118
+ `.agents/artifacts/outcome-study-2026-11/`.
119
+
120
+ **W27-7 read-only MCP surfaces.** Added three read-only tools with explicit
121
+ scope: `muse_enclave_recall` (client required, every read audit-logged),
122
+ `muse_overlay_status` (list or inspect branch overlays, never mutates), and
123
+ `muse_attestation_verify` (inline public key only — no model-supplied file
124
+ paths). `src/store/branch.ts` gained `listBranchOverlays`. Tool count 119 → 122;
125
+ claims and CLI reference regenerated; `test/mcp_readonly_surfaces.test.ts`
126
+ covers the happy paths, the fail-loud cases and the read-only guarantee.
127
+ Still open from the Wave 27 debt table: W27-8 (whole-vault rewrite) and W27-9
128
+ (overlay size caps).
129
+
130
+ **Follow-up (same day) — W27-8/W27-9 closed, R29 started.** Enclave vaults now
131
+ store one AES-256-GCM file per entry under `<client>/<division>/`; a write no
132
+ longer rewrites the vault, legacy single-file vaults stay readable and migrate
133
+ on the next write, and per-entry (1 MiB) plus per-vault (5000) caps fail loud.
134
+ Branch overlays are capped at 1000 entries / 2 MiB. `muse_enclave_recall` now
135
+ redacts credentials with `redactSecrets` before returning content. On the
136
+ operations side, `audit.jsonl` rotates at 5 MiB into `audit-archive/` (five
137
+ segments retained by default), pruning writes a chain anchor so
138
+ `getAuditTrail`/`getLastAuditHash`/`verifyAuditChain` remain valid across the
139
+ retained window, and `memory io [--json]` reports `/proc/self/io` counters plus
140
+ SQLite/WAL/audit/observation bytes. R29 is now complete except for optional
141
+ async batching: the YAML mirror can be skipped with `MUSE_YAML_MIRROR=0` /
142
+ `openStore({ yamlMirror: false })` (SQLite stays authoritative), and the WAL is
143
+ bounded by `wal_autocheckpoint = 512` and `journal_size_limit = 64 MiB`.
144
+
145
+ **Wave 28 complete (`T-440`–`T-443`).** The outcome loop is wired both ways:
146
+ `test_feedback.ts` parses bun/vitest/jest/cargo/pytest/go output, binds a real run
147
+ to the applied memory IDs, and reinforces green runs or records a failed
148
+ application plus a T-313 regression strike only for anchor-relevant memories.
149
+ `cognition/sentry.ts` matches failures against BUG_PRONE_PATTERN / DO_NOT_USE /
150
+ failed-approach memories and returns reproduction/avoidance/recommendation
151
+ playbooks without mutating anything. `doctor/flaky.ts` reconstructs the run
152
+ history and reports flaky tests (per command), failure bursts and dependency-file
153
+ drift before a burst. `cognition/remediation.ts` turns recurring failures into
154
+ playbook candidates and persists resolved ones (dry-run by default). Surfaces:
155
+ `memory test-feedback`, `sentry`, `flaky`, `remediation`, `memory_test_feedback`,
156
+ `muse_regression_sentry`, `muse_flaky_tests`, `muse_remediation_playbooks`
157
+ (126 tools).
158
+
159
+ ---
160
+
161
+ ## 🧾 Session — Ticket Ledger Renumber & Remainder Audit (2026-11-08)
162
+
163
+ Wave 23's `T-405`–`T-422` collided with the already-landed `T-405` (conflicted injection) and `T-406` (project casing), so that block is now `T-451`–`T-468` across the plan, roadmap and this file. The historical blueprint keeps its original IDs with a translation note; `HANDOFF.md`'s `T-405`/`T-406` are the unrelated landed fixes and were left untouched. Every unchecked ticket was then verified against source: 4 were already implemented (`T-150`, `T-151`, `T-153`, `T-384`) and are now marked done, 15 are partial, 86 are genuinely unbuilt, `T-163` is dropped by principal decision D3, and `T-449`/`T-450` remain filed/deferred. Full evidence table: `.agents/context/ticket-plan.md` → v15. Doc-claim gate re-run green (20/20).
164
+
165
+ ### Wave 23 PR 1 implemented (local, not landed)
166
+
167
+ `T-451`–`T-453` are implemented in the new `src/ui_assets.ts` module and wired through `src/ui.ts`:
168
+
169
+ - **T-451** — the studio now renders a fixed 76px left rail with six numbered sections (`01 OVERVIEW` … `06 ABOUT`), a tools group for the pre-existing views, a warm `#0c0a09` palette, and Archivo Black / JetBrains Mono typography. The rail uses words and numbers, not emoji.
170
+ - **T-452** — the header carries a project / global / mesh segmented switcher that refetches live. `/api/memories`, `/api/stats`, `/api/current`, `/api/wiki`, `/api/user-profile` and `/api/audit` resolve the scope; the global store (`~/.memory`) opens lazily and is never created by a read; mesh results carry `origin_project`. Mutations stay project-scoped and the studio shows a scope banner whenever it is not viewing the project store.
171
+ - **T-453** — CSS, markup and client JS are split out of the old 2,700-line template literal and served from `/assets/studio.css` and `/assets/studio.js` with strong ETags, pre-gzipped buffers, `Vary: Accept-Encoding` and 304 fast paths. The standalone export inlines the same modules.
172
+
173
+ Gate at merge: `bun test` **1451 pass / 0 fail** across 217 files, `tsc --noEmit` clean, `bun run build` 434 modules. **Landed in [PR #337](https://github.com/harshsinghmp/musememory/pull/337) at `d0c9600`** (2026-11-08); `check:landed` → `RESULT: LANDED`.
174
+
175
+ ### Gauntlet run — CAPPED at the 5-round ceiling (2026-11-08)
176
+
177
+ Ran the bounded gauntlet loop against this PR (contract + ledger + packet in `.agents/artifacts/gauntlet-wave23-pr1/`). Five rounds: Fresh Critic scores **5.95 → 7.63 → 7.90 → 8.85 → 7.99**. Both R5 blockers were confirmed closed (mesh-link cache invalidation; scope-generation guards on every scoped fetch); the final critic left only small markup/ARIA/banner defects, which were fixed in the post-ceiling Integrator delta and verified by the gate but not re-critiqued. The packet is explicitly **CAPPED, not a PASS**. Final gate: **1450/0**, tsc clean, build 434 modules, zero overflow at 375/768/1280, 44×44 targets at 375/768, headers 4/4 (HSTS N/A), per-encoding ETags + wildcard 304 + 406 negotiation, secret scan clean. Residual debt (scope-race test, CSP `unsafe-inline`, mesh read-only store minting, duplicated `escapeHtml`, standalone export zeros) is in `TECHNICAL_DEBT.md`.
178
+
179
+ ---
180
+
181
+ ## 🔧 Session — Sync Recovery (2026-11-03)
182
+
183
+ Restored `AGENTS.md` byte-exact from HEAD after an `updateagents` run from the umbrella directory replaced it (and persona files in sibling repos) with three-line adapters. Added `.commandcode/` and `.stversions/` to `.gitignore`, made the Syncthing ignore rules canonical in `~/.dotfiles/syncthing/`, and recorded the workspace-isolation invariant. The engine fix now stops at nested repository roots and refuses umbrella directories; the global install was refreshed. Repo-local recovery for `muse-agents` and `muse-skills` is owned by their respective agents.
5
184
 
6
185
  ---
7
186
 
8
187
  ## 🏛️ Wave 29 — Sovereign Ecosystem Migration & Decommissioning Complete (2026-10-26)
9
188
 
10
- All personal identity, telos, operational rules, and hardware terrain scanning migrated into sovereign `musememory` engines, native Vibeguard secret scanning, and de-LifeOSified agent governance. Legacy import tools have been permanently purged from source:
189
+ All personal identity, telos, operational rules, and hardware terrain scanning migrated into sovereign `musememory` engines, native Vibeguard secret scanning, and decommissioned legacy agent governance. Legacy import tools have been permanently purged from source:
11
190
 
12
- - **Sovereign Persona & Store Ingestion (`T-444`)**: Identity, telos, and operational rules synthesized directly into sovereign `~/.memory/USER.md` persona and SQLite store. Legacy tool `import_lifeos.ts` permanently deleted from source.
191
+ - **Sovereign Persona & Store Ingestion (`T-444`)**: Identity, telos, and operational rules synthesized directly into sovereign `~/.memory/USER.md` persona and SQLite store. The legacy import tool was permanently deleted from source.
13
192
  - **Native Vibeguard CLI (`T-445`)**: `memory scan-secrets [dir]` standalone zero-dependency secret scanner replacing legacy external scripts (`test/cli_secrets.test.ts`).
14
193
  - **Machine Terrain Collector (`T-446`)**: `memory terrain [--out file.md]` compiles deterministic hardware, toolchain, and local agent ecosystem maps into `system.md` (`test/vault_system.test.ts`).
15
- - **Global Governance De-LifeOSification (`T-447`)**: Removed all 6 legacy imports and paths from `~/.agents/AGENTS.md` and repository standards, binding truth directly to `~/.memory/USER.md` and `memory` MCP.
194
+ - **Global Governance Decommissioning (`T-447`)**: Removed all 6 legacy imports and paths from `~/.agents/AGENTS.md` and repository standards, binding truth directly to `~/.memory/USER.md` and `memory` MCP.
16
195
  - **Sovereignty Decommissioning Gate (`T-448`)**: Enforces zero external legacy imports, confirms legacy tool removal, and passes 100% cleanly in `test/sovereignty_gate.test.ts`.
17
196
  - **Golden Sequence Documentation**: Published the complete 4-phase best-practice sequence for using Muse Memory with AI coding agents in `README.md`, `docs/agent-reference.md`, and `docs/cli-reference.md`.
18
197
 
@@ -139,7 +318,7 @@ on any blocking failure, so CI runs it. Report:
139
318
  ---
140
319
 
141
320
  ## ⏭️ Next Up (Post-Release Focus)
142
- - **Wave 23: Dashboard Overhaul, Terrain Maps & High-Speed Agent Hub (`T-405`–`T-422`)**:
321
+ - **Waves 23–25 are complete.** Next is **Wave 26–29** (`T-432`–`T-443`): AST associative retrieval (`T-432`–`T-435`), branchable/enclave memory (`T-436`–`T-439`), test-driven reinforcement (`T-440`–`T-443`). Site note: unblock the Astro/cookie prerender error before any visual QA on the new pages:
143
322
  - Full UI overhaul inspired by Ryoku Rashin (`http://127.0.0.1:3600`): fixed 76px left-rail cyber-minimalist navigation, instant Canvas Graph ↔ Filterable List toggle, 60fps kinetic-settling physics loop, and 52-week activity calendar heatmap.
144
323
  - Multi-scope switcher: Project Scope (`./.memory`) vs Global User Scope (`~/.memory`) vs Cross-Project Mesh.
145
324
  - Workspace Terrain Maps (`stack.md`, `habits.md`, `ownership.md`, `packages.md`, `repo.md`, `logs.md`) for token-efficient agent orientation.
@@ -154,6 +333,34 @@ on any blocking failure, so CI runs it. Report:
154
333
  ---
155
334
 
156
335
  ## 🏁 Recently Landed Waves (Verified on `dev`)
336
+ - [x] **Outcome pilot + RC blockers** (2026-11-09) — with/without pilot 2/2 vs 1/2; latency claims corrected to p95 targets; T-450 ADR-008 boundary; overlay GC, branch root identity, enclave put lock.
337
+ - [x] **Evidence + key lifecycle** (2026-11-09) — dogfood benchmark (hit@3 10/10, MRR 0.933, 68% token savings), evidence ledger with 2 quarantined claims, benchmark title-less crash fixed, `enclave keys/prune`, backup drill, runbook.
338
+ - [x] **Enclave key rotation + client-scope descope** (2026-11-09) — versioned keyring, `enclave rotate`, old-key rollback; `scope: client` descoped per ADR-007.
339
+ - [x] **Attestation v2 + merge guard** (2026-11-09) — seq/head/key-id pinning, truncation rejection; semantic merge blocks untrusted lineage, inflation and protected constraints.
340
+ - [x] **Wave 27 hardening** (2026-11-09) — audit-REJECT fixes: strict names, GCM AAD/key id, audited overlay merge via T-439, fail-closed merge3, corrected claims. Gate 1521/0; CAPPED.
341
+ - [x] **Wave 27 (`T-436`–`T-439`)** (2026-11-09) — branch overlays (#377), encrypted enclaves (#378), packet attestations (#379), three-way merge (#380). Tests 1514/0.
342
+ - [x] **Sensitive-read audit + project identity** (2026-11-09) — `read` audit events for `scope: "all"`/untrusted; configured project via env/config/`memory project`.
343
+ - [x] **Code-context security boundary** (2026-11-09) — project-scoped by default, untrusted opt-in, read-time redaction/sanitization, bounded inputs; `muse_memory_for_code` accepts project/include_untrusted.
344
+ - [x] **Unified code resolver** (2026-11-09) — `resolveMemoriesForCode` is the single matcher; pre-flight and PR context adapt it.
345
+ - [x] **Pre-flight surfaces** (2026-11-09) — PreToolUse hook + read-only `muse_preflight` MCP tool; 119 tools.
346
+ - [x] **Wave 26 (`T-432`–`T-435`)** (2026-11-09) — recursive-CTE associative expansion (`T-432`, direct `dev`), pre-flight context (`T-433`, #370), blast-radius risk (`T-434`, #371), anchor-matched auto-recall (`T-435`, #372). Tests 1495/0.
347
+ - [x] **Site build + scaffolding wiring** (2026-11-08) — PR #367 (Node Astro launcher; site:qa 17/17 SHIP) and #368 (briefing episodes, explicit `asserted_at` belief clock in `as_of`, duplicate decay removed).
348
+ - [x] **Wave 24–25 review hardening** (2026-11-08) — PR #366 merged at `a485875`; playbook rail preservation, fail-loud corrupt store, id-keyed updates, unique episode ids, goal-first phases, epoch timestamps, CLI flags, doc honesty. Gauntlet: REJECT → fixed, CAPPED; website visual gate blocked by pre-existing Astro/cookie prerender error.
349
+ - [x] **Wave 24 (`T-423`–`T-426`)** (2026-11-08) — terminal demo script/recipe, vendored sql.js playground, capability-only benchmark matrix, accessible agent demos. PRs #362–#365. Site prerender has a pre-existing Astro/cookie CJS blocker (entrypoints compile).
350
+ - [x] **Wave 25 (`T-427`–`T-431`)** (2026-11-08) — playbooks, episodes, bi-temporal belief windows, reinforced decay, and playbook CLI/MCP commands. PRs #356–#361.
351
+ - [x] **Post-Wave-23 debt sweep** (2026-11-08) — PR #355 merged at `432cf01`: agents discovery cache, backup retention, unwire tool-grant cleanup, mesh freshness bucket.
352
+ - [x] **Wave 23 gauntlet hardening** (2026-11-08) — PR #354 merged at `d2ea59c`; complete config backups (XDG-aware, timestamped, fail-loud), unknown-agent 404s, honest wire reporting, WAL/layout cache freshness, 44px phone controls. Gauntlet: 7.35 critic → REQUEST-CHANGES review → fixed; **CAPPED, not a PASS**. Evidence: `.agents/artifacts/gauntlet-wave23-pr456/`.
353
+ - [x] **Wave 23 PR 6 (`T-466`–`T-468`)** (2026-11-08) — projection cache, hidden-tab pause and the UI performance benchmark. **Wave 23 complete.** PRs #351–#353.
354
+ - [x] **Wave 23 PR 5 (`T-463`–`T-465`)** (2026-11-08) — poster About panel, quick-start cards and searchable command deck. PRs #348–#350.
355
+ - [x] **Wave 23 PR 4 (`T-460`–`T-462`)** (2026-11-08) — agents hub: discovery statuses, one-click wire/unwire with `.bak` backups and harness opt-in, point-any-agent manifest. PRs #345–#347.
356
+ - [x] **Wave 23 PR 3 / `T-459`** (2026-11-08) — PR #344 merged; generation-time redaction plus a token-savings and leak test (`test/vault_terrain.test.ts`).
357
+ - [x] **Wave 23 PR 3 / `T-458`** (2026-11-08) — PR #343 merged at `65113af`; terrain vault split-pane (tree, GEN badges, markdown viewer, REINDEX scanline).
358
+ - [x] **Wave 23 PR 3 / `T-457`** (2026-11-08) — PR #342 merged at `8006427`; deterministic workspace terrain generator and `terrain --workspace` CLI.
359
+ - [x] **Wave 23 PR 2 / `T-455`** (2026-11-08) — PR #340 merged at `05b4fdf`; energy-settling loop with wake hooks, deterministic ring seed, pointer capture.
360
+ - [x] **Wave 23 PR 2 / `T-456`** (2026-11-08) — PR #341 merged at `436d198`; scope-aware activity endpoint, 52-week heatmap and agent session cards.
361
+ - [x] **T-449 test hermeticity** (2026-11-08) — PR #338 merged at `94620895`; `findProjectRoot` no longer adopts `$HOME`/`/` as a project root, doc-link scan skips local sync state, regression test with a fake home. Earlier caller-scan fix merged via #337 (`c0f7aef`). Issue #336 closes.
362
+ - [x] **Wave 23 PR 2 / `T-454`** (2026-11-08) — PR #339 merged at `3e621fa`; instant graph/list toggle with a sortable table, `aria-sort`, and a 100ms debounced filter.
363
+ - [x] **Wave 23 PR 1 (`T-451`–`T-453`)** (2026-11-08) — merged in PR #337 at `d0c9600`; `check:landed` → **LANDED**. Left rail, dual-scope switcher, modular ETag/gzip assets, read-only global/mesh reads, 375/768/1280 verified, 1451/0 at merge. Follow-ups in PR #337's thread: stateful-regex flake fixed (`c0f7aef`), npm Bun CI fallback (`b298beb`). Gauntlet verdict: CAPPED at 7.99 (not a 9.0 PASS) — evidence in `.agents/artifacts/gauntlet-wave23-pr1/`.
157
364
  - [x] **Released: v3.1.2** (2026-10-25) — completes the silent-casing fan-out:
158
365
  - PR #330 merged at `d7e875b` (*"Release: v3.1.2"*); annotated tag
159
366
  [`v3.1.2`](https://github.com/harshsinghmp/musememory/releases/tag/v3.1.2)
@@ -222,7 +429,7 @@ on any blocking failure, so CI runs it. Report:
222
429
  - `T-144`: Trajectory fix-pair mining discovering negative memories (`AVOID: ...`) from *Error ➔ Remediation ➔ No Recurrence* observation sequences with affinity filters excluding non-mutating commands (`ls`, `cat`), dynamic line number normalization, Vibeguard secret scrubbing, and session volume cap of max 3 candidates (`test/fix_pair_mining.test.ts`, commit `cc4b5c5`).
223
430
  - `T-314`: Source-tagged recall hits wiring `.memory/HOT.md` candidates into retrieval ranking with sub-millisecond memoized `mtime` cache, origin tagging (`source_channels: ("hot" | "fts" | "vector" | "tree" | "distilled")[]`), relevance-gated `sourceBonus` (+0.20), and explainability tokens (`source:hot`, `source:fts`) (`test/source_tagging_frequency.test.ts`, commit `f9f6a93`).
224
431
  - `T-315`: LangMem logarithmic frequency rank curve ($0.25 \times \frac{\ln(1 + \text{effectiveCount})}{\ln(1 + 50)}$) replacing unbounded linear frequency scoring; weights verified memory applications $2\times$ over passive context loads; 7-day recency bonus (+0.05) capped at 0.30; outputs `freq:high` tokens (`test/source_tagging_frequency.test.ts`, commit `f3c8f1d`).
225
- - [x] **Wave 21: LifeOS Distillation, Mutation Safety & Knowledge Routing**:
432
+ - [x] **Wave 21: Ecosystem Distillation, Mutation Safety & Knowledge Routing**:
226
433
  - `T-050`: Overnight & in-lock mutation safety guards (`verifyMutationSafety`, `MutationSafetyError`, `ESUSPECT_SHRINK`, `ESUSPECT_EROSION`, `allowDrastic`) preventing accidental bulk erasure or semantic erosion during compaction/governance (`test/mutation_guards.test.ts`, commit `439e31c`).
227
434
  - `T-177`: Pre-mutation 30-snapshot rolling ring buffer (`captureSnapshotRing`, `listSnapshotRing`, `restoreSnapshotRing`) with zero resident daemons in `.memory/snapshots/` before write transactions and compaction handoffs (`test/snapshot_ring.test.ts`, commit `76c58eb`).
228
435
  - `T-324`: Diff-preserving `CURRENT.md` checkpoint merge semantics (`parseCurrentConstraints`, `mergeCurrentConstraints`), preventing mid-session hand-added constraints from being overwritten (`test/current_compaction_guard.test.ts`, commit `f1a4756`).
@@ -415,8 +622,9 @@ Removed remaining competitor product names and external comparison links from we
415
622
  - **Zero External Daemons**: All operations must execute in-process via SQLite (`memory.db`) or flat files. Never depend on background servers.
416
623
  - **Fail Fast**: Throw loudly on secret detection, invalid schema shapes, or unconfirmed supersessions.
417
624
  - **Verification Gate**: Before declaring changes complete, `bun test`, `bun run build`, and `tsc --noEmit` must pass.
625
+ - **Workspace Isolation & Sync Boundary**: Never run repo-mutating scaffolders from a parent directory; nested clones are separate scopes. Never sync `.git` or a live SQLite store (`.memory/`).
418
626
 
419
627
  ## 1. Verified Shipped Reality
420
628
  - **2026-10-22**: T-321 per-project health gate scope
421
629
  - **2026-10-22**: T-320 contradiction engine calibration
422
- - **2026-10-20**: Wave 21: LifeOS Distillation, Mutation Safety & Knowledge Routing (T-050, T-177, T-324)
630
+ - **2026-10-20**: Wave 21: Ecosystem Distillation, Mutation Safety & Knowledge Routing (T-050, T-177, T-324)
@@ -27,3 +27,11 @@
27
27
  ### ADR-006: Harness-Independent Hook Installation (Global Standard First)
28
28
  - **Decision**: `memory hooks install` resolves its target as explicit `settingsPath` → explicit `--harness` opt-in → global standard (project `.agents/hooks.json` when a `.agents/` directory exists, otherwise `~/.agents/hooks.json`). A harness path (e.g. `~/.claude/settings.json`) is never auto-selected, and `connectAgent` skips harness-specific agents without an explicit `--harness` opt-in.
29
29
  - **Rationale** (principal ruling, 2026-10-15): the runtime is vendor-neutral — hooks must not couple memory to one harness or create a harness directory unprompted. A pre-existing harness settings file does not imply consent; only `--harness claude` does.
30
+
31
+ ### ADR-007: Client Scope Descoped from the Memory Store
32
+ - **Decision** (2026-11-09): `scope: client` is not added to `MemoryScope`. Client enclaves remain an explicit encrypted vault (`memory enclave create|list|put|rotate`) outside normal retrieval, recall, and MCP surfaces.
33
+ - **Rationale**: wiring a tenant scope through store/retrieval/sync would make cross-tenant disclosure a single filter bug away. The encrypted vault has its own key lifecycle and is auditable at the CLI boundary. Revisit only with a tenant-aware store substrate and per-client key rotation tests.
34
+
35
+ ### ADR-008: Agent Workspace Tracking Boundary (T-450)
36
+ - **Decision** (2026-11-09): keep `.agents/standards/`, `.agents/skills/`, `.agents/context/`, `.agents/brand/`, `.agents/artifacts/` and `.agents/research/` tracked. Ignore new ephemeral state under `.agents/plans/`, `.agents/archive/`, `.agents/worktree-leases/` and `.agents/scratch/`. Already-tracked files stay tracked for history; the rule applies to new files.
37
+ - **Rationale**: standards, skills, decisions, evidence and audit artifacts are collaborator-facing truth. Plans, leases and scratch are per-agent working state that causes churn and merge noise. Removing already-tracked history would break links in prior tickets, so the boundary moves forward only.
@@ -181,7 +181,7 @@ Currently, Muse Memory excels at **Semantic Memory** (facts, rules, ADRs, prefer
181
181
  #### B. Multi-Tenant Agency Enclaves (`scope: client`)
182
182
  - Tailored for Harsh's agency model with 4 internal divisions: Sol, Jasper, Crew, Nexus.
183
183
  - **Isolation Rule**:
184
- - `scope: client`: Enclave isolated per client ID (`client_id: "client-acme"`).
184
+ - `scope: client`: **Descoped** (ADR-007). Enclaves are explicit encrypted vaults; not a store scope.
185
185
  - Client A’s confidential database schemas and domain logic are never exposed to Client B.
186
186
  - Universal architectural principles (`scope: global`) propagate freely across all client workspaces.
187
187