musememory 3.3.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 (53) hide show
  1. package/.agents/artifacts/README.md +21 -0
  2. package/.agents/artifacts/TECHNICAL_DEBT-wave24-25.md +1 -1
  3. package/.agents/artifacts/TECHNICAL_DEBT-wave26.md +2 -2
  4. package/.agents/artifacts/TECHNICAL_DEBT-wave27.md +3 -3
  5. package/.agents/artifacts/outcome-study-2026-11/README.md +64 -0
  6. package/.agents/artifacts/outcome-study-2026-11/graders/bytes.test.ts +12 -0
  7. package/.agents/artifacts/outcome-study-2026-11/graders/clone.test.ts +26 -0
  8. package/.agents/artifacts/outcome-study-2026-11/graders/csv.test.ts +11 -0
  9. package/.agents/artifacts/outcome-study-2026-11/graders/duration.test.ts +12 -0
  10. package/.agents/artifacts/outcome-study-2026-11/graders/isodate.test.ts +7 -0
  11. package/.agents/artifacts/outcome-study-2026-11/graders/money.test.ts +11 -0
  12. package/.agents/artifacts/outcome-study-2026-11/graders/percent.test.ts +11 -0
  13. package/.agents/artifacts/outcome-study-2026-11/graders/semver.test.ts +12 -0
  14. package/.agents/artifacts/outcome-study-2026-11/graders/slug.test.ts +12 -0
  15. package/.agents/artifacts/outcome-study-2026-11/graders/truncate.test.ts +10 -0
  16. package/.agents/artifacts/outcome-study-2026-11/tasks/bytes.md +3 -0
  17. package/.agents/artifacts/outcome-study-2026-11/tasks/clone.md +3 -0
  18. package/.agents/artifacts/outcome-study-2026-11/tasks/csv.md +3 -0
  19. package/.agents/artifacts/outcome-study-2026-11/tasks/duration.md +3 -0
  20. package/.agents/artifacts/outcome-study-2026-11/tasks/isodate.md +3 -0
  21. package/.agents/artifacts/outcome-study-2026-11/tasks/money.md +3 -0
  22. package/.agents/artifacts/outcome-study-2026-11/tasks/percent.md +3 -0
  23. package/.agents/artifacts/outcome-study-2026-11/tasks/semver.md +3 -0
  24. package/.agents/artifacts/outcome-study-2026-11/tasks/slug.md +3 -0
  25. package/.agents/artifacts/outcome-study-2026-11/tasks/truncate.md +3 -0
  26. package/.agents/context/architecture.md +7 -7
  27. package/.agents/context/current.md +160 -7
  28. package/.agents/context/evidence-ledger.md +21 -11
  29. package/.agents/context/index.md +1 -1
  30. package/.agents/context/product.md +4 -0
  31. package/.agents/context/roadmap.md +12 -9
  32. package/.agents/context/ticket-plan.md +7 -7
  33. package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-design.md +1 -1
  34. package/.agents/plans/2026-10-20-wave-22-failure-attribution-negative-mining-plan.md +1 -1
  35. package/.agents/standards/README.md +6 -1
  36. package/.agents/standards/anti-patterns.md +116 -0
  37. package/.agents/standards/boundary-governance.md +52 -0
  38. package/.agents/standards/language-policy.md +115 -0
  39. package/.agents/standards/memory-context.md +1 -1
  40. package/.agents/standards/security-vibeguard.md +1 -1
  41. package/.agents/standards/test-failure-audit.md +46 -0
  42. package/.agents/standards/visual-inspection.md +31 -0
  43. package/claims.json +5 -5
  44. package/dist/index.js +6486 -4904
  45. package/docs/agent-reference.md +10 -1
  46. package/docs/cli-reference.md +16 -4
  47. package/docs/mcp-tool-matrix.json +8 -1
  48. package/package.json +2 -1
  49. package/.agents/artifacts/2026-10-20-lifeos-memory-distillation-plan.md +0 -865
  50. package/.agents/artifacts/2026-10-26-wave-29-code-review-audit.md +0 -52
  51. package/.agents/artifacts/2026-10-26-wave-29-gauntlet-acceptance-packet.md +0 -48
  52. package/.agents/artifacts/2026-10-26-wave-29-muse-security-audit.md +0 -71
  53. package/.agents/artifacts/2026-10-26-wave-29-sovereign-lifeos-migration-plan.md +0 -88
@@ -0,0 +1,21 @@
1
+ # πŸ—„οΈ Working Artifacts Container
2
+
3
+ Scratch and evidence produced while working live here β€” never in the repository root.
4
+
5
+ ## What belongs here
6
+
7
+ - Session research, gauntlets, audit packets, benchmark baselines, handoffs.
8
+ - Evidence attached to a claim in `.agents/context/current.md` (link the file, don't paste it).
9
+ - One directory per artifact when it has multiple files: `.agents/artifacts/<slug>/`.
10
+
11
+ ## Rules
12
+
13
+ - **Not a secrets store.** Credentials, tokens and `.env` values never enter this tree.
14
+ - **Not a dump.** Delete superseded artifacts; this is working material, not an archive.
15
+ - **Retire, don't delete history.** Plans that are done move to
16
+ `.agents/archive/[title]-[timestamp].md`.
17
+ - **Never write to `./.memory/**`** β€” that directory is owned by the MuseMemory engine.
18
+
19
+ ## Naming
20
+
21
+ `YYYY-MM-DD-<slug>.md` for single files; `YYYY-MM-DD-<slug>/` for multi-file artifacts.
@@ -6,7 +6,7 @@
6
6
  | D2 | **partially wired**: `evaluateAsOf` respects `asserted_at`; no SQL column/index yet | `src/retrieval.ts`, `src/sqlite.ts` | Add an `asserted_at` column + migration if SQL filtering is needed |
7
7
  | D3 | ~~duplicate decay module~~ **removed**: `retention.ts` owns decay and reinforcement | β€” | β€” |
8
8
  | D4 | `muse_playbook_*` schemas declare no `required` array | `src/mcp.ts` | Declare required fields or document the runtime validation |
9
- | D5 | Playbook writes use a fixed `.tmp` name (concurrent writers collide) | `src/cognition/playbooks.ts` | Random temp suffix + fsync |
9
+ | D5 | ~~Playbook writes use a fixed `.tmp` name (concurrent writers collide)~~ **done**: per-write temp name (`pid`+`randomUUID`) with `fsync` before rename and cleanup on failure. The audit also exposed a deeper bug the temp-name fix alone does not solve: `savePlaybook` and `recordPlaybookOutcome` are read-modify-write, so two processes both read the same list and the later rename silently drops the earlier write. Both now run inside `withStoreLock`. Verified: 8 concurrent processes persist 8/8; without the lock, 6 writers persisted 3 | `src/cognition/playbooks.ts` | β€” |
10
10
  | D6 | ~~Site prerender blocked~~ **fixed**: Node-based Astro launcher; `site:qa` 17/17 SHIP | `apps/website/scripts/astro.mjs` | β€” |
11
11
  | D7 | `--run` is a show alias; no step execution | `src/cli/playbook.ts` | Implement execution with confirmation or amend the ticket wording |
12
12
  | D8 | `assets/showreel/README.md` had an executable bit; demo script uses `set -e` inside a recording | `assets/showreel` | Fixed mode; review recording ergonomics |
@@ -3,9 +3,9 @@
3
3
  | # | Finding | Location | Fix |
4
4
  |---|---|---|---|
5
5
  | W26-1 | ~~Two fileβ†’memory resolvers~~ **done**: canonical `resolveMemoriesForCode`; pre-flight and PR context are adapters | `src/retrieval/code_context.ts` | β€” |
6
- | W26-2 | Pre-flight token budget covers entries only; constraints/CORE blocks are appended uncounted | `src/hooks/preflight.ts`, `src/retrieval.ts` | Count/trim the final markdown or rename the claim to "entry budget" |
6
+ | W26-2 | ~~Pre-flight token budget covers entries only~~ **done**: `tokenBudget` now bounds the whole assembled pack. `preflightContext` measures the final markdown and re-queries with a halved entry allocation until it fits; mandatory blocks (USER.md, CORE.md) are never dropped, and `markdownTokens` / `withinBudget` report the real figure instead of the entry subset. A pack that cannot fit says so rather than claiming compliance | `src/hooks/preflight.ts`, `src/cli/retrieval.ts`, `src/mcp.ts` | β€” |
7
7
  | W26-3 | ~~Pre-flight is CLI-only~~ **done**: PreToolUse hook + read-only `muse_preflight` MCP tool | `src/hooks/pack.ts`, `src/mcp.ts` | β€” |
8
8
  | W26-4 | `associated` is ids-only and not fused into ranking/token accounting | `src/retrieval.ts` | Fuse with `why_retrieved` vocabulary or document the consumer contract |
9
- | W26-5 | Recursive CTE work is not bounded by `maxNodes` before projection | `src/associative.ts` | Push the limit into the recursive member |
9
+ | W26-5 | ~~Recursive CTE work is not bounded by `maxNodes` before projection~~ **done**: the bound now also sits inside the recursive member. With it only on the outer SELECT, SQLite materialised the whole reachable frontier first β€” a 1200-node dense graph walked ~11.5k rows and took ~112ms (270ms at 3k nodes) to return at most 100. Bounded: ~7-10ms, identical output. Regression test asserts the wall-clock ceiling, so it fails if the inner LIMIT is removed | `src/associative.ts` | β€” |
10
10
 
11
11
  - ~~**W26-6**: no audit event for cross-project/untrusted reads~~ **done**: `read` audit operation and events.
@@ -8,6 +8,6 @@
8
8
  | W27-4 | ~~`scope: client` not wired~~ **descoped** per ADR-007; ticket/docs corrected | β€” | β€” |
9
9
  | W27-5 | ~~Overlay archives accumulate~~ **done**: `overlay prune --max-age-days` | `src/store/branch.ts` | β€” |
10
10
  | W27-6 | ~~Branch identity from `store.dir`~~ **done**: resolves from the workspace root | `src/store/branch.ts` | β€” |
11
- | W27-7 | No MCP surfaces for enclave/attest/overlay | `src/mcp.ts` | Read-only MCP tools with explicit project/client scope |
12
- | W27-8 | **partially done**: `put` now holds `withStoreLock`; whole-vault rewrite remains | `src/store/enclaves.ts` | Batched put / per-entry files |
13
- | W27-9 | Overlay plaintext archives at 0600 but no size caps | `src/store/branch.ts` | Entry/size caps |
11
+ | W27-7 | ~~No MCP surfaces for enclave/attest/overlay~~ **done**: read-only `muse_enclave_recall` (client required, audited), `muse_overlay_status`, `muse_attestation_verify` (inline key only) | `src/mcp.ts` | β€” |
12
+ | W27-8 | ~~Whole-vault rewrite~~ **done**: one AES-256-GCM file per entry under `<client>/<division>/`; legacy single-file vaults are read and migrated on the next write; per-entry and per-vault size caps | `src/store/enclaves.ts` | β€” |
13
+ | W27-9 | ~~No overlay size caps~~ **done**: `MAX_OVERLAY_ENTRIES` (1000) and `MAX_OVERLAY_BYTES` (2 MiB) fail loud before any write | `src/store/branch.ts` | β€” |
@@ -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,7 +1,160 @@
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).
5
158
 
6
159
  ---
7
160
 
@@ -33,12 +186,12 @@ Restored `AGENTS.md` byte-exact from HEAD after an `updateagents` run from the u
33
186
 
34
187
  ## πŸ›οΈ Wave 29 β€” Sovereign Ecosystem Migration & Decommissioning Complete (2026-10-26)
35
188
 
36
- 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:
37
190
 
38
- - **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.
39
192
  - **Native Vibeguard CLI (`T-445`)**: `memory scan-secrets [dir]` standalone zero-dependency secret scanner replacing legacy external scripts (`test/cli_secrets.test.ts`).
40
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`).
41
- - **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.
42
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`.
43
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`.
44
197
 
@@ -276,7 +429,7 @@ on any blocking failure, so CI runs it. Report:
276
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`).
277
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`).
278
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`).
279
- - [x] **Wave 21: LifeOS Distillation, Mutation Safety & Knowledge Routing**:
432
+ - [x] **Wave 21: Ecosystem Distillation, Mutation Safety & Knowledge Routing**:
280
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`).
281
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`).
282
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`).
@@ -474,4 +627,4 @@ Removed remaining competitor product names and external comparison links from we
474
627
  ## 1. Verified Shipped Reality
475
628
  - **2026-10-22**: T-321 per-project health gate scope
476
629
  - **2026-10-22**: T-320 contradiction engine calibration
477
- - **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)
@@ -5,16 +5,16 @@
5
5
  | Category | Count |
6
6
  |---|---|
7
7
  | DECISION | 1 |
8
- | CLAIM | 5 |
8
+ | CLAIM | 6 |
9
9
  | STATUS | 1 |
10
10
 
11
11
  | Status | Count |
12
12
  |---|---|
13
- | VERIFIED | 4 |
14
- | QUARANTINED | 1 |
15
- | ACTIVE | 1 |
13
+ | VERIFIED | 6 |
14
+ | ACTIVE | 2 |
15
+ | QUARANTINED | 0 |
16
16
 
17
- **Health score**: 5 / 6 verifiable entries (83%) β€” one claim is quarantined, not contradicted.
17
+ **Health score**: 6 / 6 claims verified (100%) β€” the previous quarantine on EVD-005 is resolved by EVD-008; the remaining two entries are an active fix record and an active decision.
18
18
 
19
19
  ---
20
20
 
@@ -59,12 +59,12 @@
59
59
  ---
60
60
 
61
61
  ### EVD-005 | 2026-11-09 | CLAIM
62
- **Statement**: Muse Memory improves coding-agent task success.
62
+ **Statement** *(revised)*: On convention-sensitive coding tasks, an agent that can recall the project's stored conventions produces more correct implementations than the same agent without them.
63
63
  **Category**: `CLAIM`
64
- **Confidence**: `[INFER]` β€” plausible from retrieval quality, but no with/without task-outcome study exists.
65
- **Epistemology**: `[SPECULATIVE]`
66
- **Evidence**: none yet; retrieval evidence only (EVD-002/003).
67
- **Status**: `QUARANTINED` β€” a 2-task pilot (EVD-007) is suggestive, not sufficient.
64
+ **Confidence**: `[EMPIRICAL]` β€” a ten-task condition-blind study (EVD-008) measured 10/10 with memory against 6/10 without it; four tasks discriminated and none regressed.
65
+ **Epistemology**: `[EMPIRICAL]`
66
+ **Evidence**: `docs/evidence/2026-11-outcome-study.md`; task prompts and hidden graders in `.agents/artifacts/outcome-study-2026-11/`.
67
+ **Status**: `VERIFIED` β€” scoped to convention recall in this study. The original unqualified sentence ("improves coding-agent task success") is too broad for n=10 and has been narrowed rather than marked proven.
68
68
 
69
69
  ---
70
70
 
@@ -86,4 +86,14 @@
86
86
  **Confidence**: `[RAW]` β€” hidden Bun tests run against both fixture implementations.
87
87
  **Epistemology**: `[EMPIRICAL]`
88
88
  **Evidence**: `docs/evidence/2026-11-outcome-pilot.md`.
89
- **Status**: `VERIFIED` β€” pilot only (n=2, single run).
89
+ **Status**: `VERIFIED` β€” pilot only (n=2, single run). Superseded as primary evidence by EVD-008.
90
+
91
+ ---
92
+
93
+ ### EVD-008 | 2026-11-09 | CLAIM
94
+ **Statement**: In a ten-task condition-blind study, an agent told to consult memory passed 10/10 hidden tests when the conventions were seeded and 6/10 when they were not; the four discriminating tasks were duration units, UTC dates, the slug length cap and CSV whitespace quoting.
95
+ **Category**: `CLAIM`
96
+ **Confidence**: `[RAW]` β€” hidden Bun tests graded all twenty solutions mechanically under a non-UTC timezone; Fisher's exact one-sided p = 0.043.
97
+ **Epistemology**: `[EMPIRICAL]`
98
+ **Evidence**: `docs/evidence/2026-11-outcome-study.md`; `.agents/artifacts/outcome-study-2026-11/`.
99
+ **Status**: `VERIFIED` β€” n=10, one run per arm, one model. Supports EVD-005 within that scope only.
@@ -13,7 +13,7 @@
13
13
  | [`product.md`](./product.md) | Product scope, the live MCP tool matrix, the 7 task profiles, the CLI surface, and the trust gates an agent must assume | Understanding user commands, capabilities, and MCP protocols |
14
14
  | [`architecture.md`](./architecture.md) | Dual-Scope storage (`.memory/`), SQLite DB, retrieval scoring formula, and file layout | System design, file locations, state machine, and data flow |
15
15
  | [`brand.md`](./brand.md) | Persona profiles (`USER.md` archetypes), voice, and presentation rules | Writing prompts, terminal output copy, and user documentation |
16
- | [`current.md`](./current.md) | Current shipped state (**v3.1.0**), test coverage, and active constraints | Before starting work on bugs, features, or refactors |
16
+ | [`current.md`](./current.md) | Current shipped state (**v3.4.0**), test coverage, and active constraints | Before starting work on bugs, features, or refactors |
17
17
  | [`decisions.md`](./decisions.md) | Locked architectural decisions (zero-daemon, file-backed SQLite, atomic I/O) | Evaluating technical choices or refactors |
18
18
  | [`roadmap.md`](./roadmap.md) | Planned improvements, ecosystem expansions, and backlog | Scoping new capabilities |
19
19
  | [`ticket-plan.md`](./ticket-plan.md) | Detailed ticket plan for the next work waves | Planning a specific wave of work |