@cairnkeep/cli 2.22.4 → 2.23.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 (47) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/claude/commands/recall.md +8 -1
  3. package/docs/README.md +3 -0
  4. package/docs/agents.md +9 -0
  5. package/docs/benchmarks/memory-retrieval-v1.json +115 -0
  6. package/docs/learning/CURRICULUM-MAP.md +1 -1
  7. package/docs/learning/FEATURE-GUIDE.md +7 -1
  8. package/docs/learning/lessons/L00-why-cairnkeep.md +1 -1
  9. package/docs/learning/lessons/L01-safe-trial.md +3 -3
  10. package/docs/learning/lessons/L02-installation.md +2 -2
  11. package/docs/learning/lessons/L03-first-project.md +1 -1
  12. package/docs/learning/lessons/L04-memory-fundamentals.md +20 -0
  13. package/docs/learning/lessons/L19-validated-skill-improvement.md +1 -1
  14. package/docs/learning/lessons/L20-mcp-tool-profiles.md +1 -1
  15. package/docs/learning/lessons/L21-context-packs.md +1 -1
  16. package/docs/learning/lessons/L22-native-windows.md +2 -2
  17. package/docs/learning/lessons/L23-guided-setup.md +1 -1
  18. package/docs/learning/lessons/L24-okf-exchange.md +1 -1
  19. package/docs/learning/lessons/L25-playbooks.md +1 -1
  20. package/docs/learning/lessons/L26-context-intelligence.md +1 -1
  21. package/docs/learning/lessons/L27-ecosystem-evidence.md +1 -1
  22. package/docs/learning/lessons/L28-security-assurance.md +22 -2
  23. package/docs/learning/tracks/operator.md +6 -1
  24. package/docs/learning/video-scripts/V04-memory-retrieval-supplement.md +34 -0
  25. package/docs/learning/video-scripts/V28-security-assurance.md +20 -0
  26. package/docs/memory-retrieval.md +174 -0
  27. package/docs/operating.md +5 -0
  28. package/docs/releasing.md +65 -0
  29. package/docs/security-assurance.md +15 -0
  30. package/docs/storage.md +5 -0
  31. package/examples/eval/bundled-fake.json +1 -1
  32. package/mcp-memory-server/dist/index.js +43 -2
  33. package/mcp-memory-server/dist/memory-retrieval.js +128 -0
  34. package/mcp-memory-server/dist/note-store.js +24 -4
  35. package/mcp-memory-server/package.json +2 -0
  36. package/opencode/command/recall.md +8 -1
  37. package/package.json +1 -1
  38. package/scripts/lib/release-verification.mjs +131 -0
  39. package/scripts/test-memory-retrieval-docs.sh +19 -0
  40. package/scripts/test-release-sbom.sh +32 -0
  41. package/scripts/test-release-verification.mjs +109 -0
  42. package/scripts/test-release-verification.sh +4 -0
  43. package/scripts/test-setup-reconcile.mjs +4 -2
  44. package/scripts/test-windows-native.mjs +1 -0
  45. package/scripts/verify-phase19-runtime-evidence.mjs +43 -3
  46. package/scripts/verify-published-release.mjs +138 -0
  47. package/templates/playbook-agent-instructions.md.template +5 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,50 @@ All notable user-facing changes are documented here. This project follows
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [2.23.0] - 2026-10-21
9
+
10
+ ### Memory retrieval
11
+
12
+ - Add opt-in `memory_search` hybrid lexical/identifier admission, bounded query
13
+ aliases, explicit semantic-only thresholds, deterministic ranking, duplicate
14
+ source locators and optional conflict/match explanations. Preserve existing
15
+ default responses, history, scope filters and storage layouts. Fall back to
16
+ lexical admission when optional embedding results are invalid or unavailable.
17
+ - Add a frozen continuity study against real curated Markdown files, including
18
+ the same-policy Markdown parity control and 0/100/1,000 distractors. Document
19
+ synthetic limitations and unsuccessful live-provider evaluation; update the
20
+ agent guidance, learning lesson and recording supplement.
21
+
22
+ ### CI
23
+
24
+ - Allow a retried, fully gated CI job to replace its run-local tree-addressed
25
+ release candidate instead of failing on the existing artifact name. Keep all
26
+ platform/runtime dependencies and immutable published versions unchanged; add
27
+ parsed-workflow positive and mutation controls.
28
+
29
+ ## [2.22.5] - 2026-10-08
30
+
31
+ ### Operations
32
+
33
+ - Add an explicit post-publication verifier for exact-tree CI candidates,
34
+ release and registry bytes, npm signatures/attestations, anonymous
35
+ dual-architecture OCI images, bound SBOMs and exact-source signed provenance.
36
+ Refuse partial verification and report replacement; keep artifact evidence
37
+ separate from deployment readiness. Add offline positive/mutation controls.
38
+
39
+ ### Security
40
+
41
+ - Bind note-transaction pre-image hashes to bounded inspected descriptors;
42
+ reject linked, replaced, growing or over-64-MiB files before accepting their
43
+ hashes. Create developer note fixtures exclusively without overwriting a
44
+ competing file. Add actual runtime replacement and fixture race controls.
45
+ - Use bounded descriptor reads for developer benchmark/import/note snapshots,
46
+ capability leases, corrupt-database controls and runtime-evidence files.
47
+ Preserve existing corruption, permissions and exact-byte assertions; keep
48
+ remote-context test labels static so provider values cannot forge log lines.
49
+ These controls do not make note publication a directory-wide transaction or
50
+ certify that every historical security-analysis finding is resolved.
51
+
8
52
  ## [2.22.4] - 2026-10-07
9
53
 
10
54
  ### Security
@@ -19,7 +19,14 @@ Read order (canonical sources still win over derived layers):
19
19
 
20
20
  <process>
21
21
  ## 1. AgentFS
22
- `memory_search` scope `project` with $ARGUMENTS. If nothing relevant, retry scope `all`.
22
+ `memory_search` scope `project` with $ARGUMENTS. When the discovered schema
23
+ supports it, use `strategy: "hybrid"` for identifier-sensitive or mixed-wording
24
+ queries and `explain: true` to inspect matches. Supply only aliases already known
25
+ from the task. Semantic-only hybrid matches require an explicitly chosen
26
+ positive `min_score`; retain the existing semantic strategy for paraphrases
27
+ when no model-specific threshold is available. Empty results are valid.
28
+ Use broader configured scopes only when the question genuinely spans them;
29
+ do not automatically widen a search merely to force a hit.
23
30
 
24
31
  ## 2. Wiki
25
32
  Read `.planning/wiki/index.md` if present and follow links relevant to $ARGUMENTS.
package/docs/README.md CHANGED
@@ -31,6 +31,9 @@ linked guides rather than the project landing page.
31
31
 
32
32
  ## Context intelligence
33
33
 
34
+ - [Memory retrieval and the Markdown baseline](memory-retrieval.md) explains
35
+ optional hybrid admission, aliases, relevance diagnostics and reproducible
36
+ continuity evidence against searchable Markdown.
34
37
  - [Context intelligence](context-intelligence.md) connects progressive context-pack
35
38
  retrieval, the frozen benchmark, usage receipts, review-gated proposals, and
36
39
  the optional read-only OpenViking provider.
package/docs/agents.md CHANGED
@@ -27,6 +27,15 @@ constraints, recurring failures, or prior work:
27
27
  This protocol improves continuity without allowing stale memory to outrank
28
28
  code, tests, current documentation, or the user's request.
29
29
 
30
+ When the discovered tool schema supports it, `strategy: "hybrid"` is useful for
31
+ identifier-sensitive and mixed-wording queries. `explain: true` exposes selection
32
+ reasons; explicit `query_aliases` can express names already known from the task.
33
+ Do not invent aliases or broaden scopes to obtain a match. Semantic-only
34
+ paraphrase retrieval needs an explicitly chosen positive `min_score` in hybrid
35
+ mode; without a model-specific threshold, the existing semantic strategy remains
36
+ available. Empty results are valid, and ranking scores are not factual confidence.
37
+ See [memory retrieval and evidence](memory-retrieval.md).
38
+
30
39
  ## What setup installs
31
40
 
32
41
  `cairn setup` reconciles a delimited Cairnkeep block in the project's
@@ -0,0 +1,115 @@
1
+ {
2
+ "schema_version": 1,
3
+ "study": "synthetic-memory-continuity-v1",
4
+ "fixture_digest": "051a1ee175fc20d9e38c43d838b234c759133805ab335f74ef5603ee0871fce8",
5
+ "embedding": {
6
+ "mode": "none"
7
+ },
8
+ "limitations": [
9
+ "Synthetic retrieval scenarios, not autonomous task-quality or human-usability evidence.",
10
+ "Markdown baseline shares BM25/tokenization and receives identical alias information.",
11
+ "Markdown with the same admission policy is included to distinguish retrieval-policy gains from storage format.",
12
+ "Offline cases do not evaluate learned semantic paraphrase retrieval.",
13
+ "Explicit live threshold is an example, not universal calibration or a confidence probability.",
14
+ "Current-state fixture excludes archived history; actual supersession is covered by the MCP regression.",
15
+ "No automatic contradiction reconciliation, human consent or concurrent local-store access is claimed."
16
+ ],
17
+ "measurements": [
18
+ {
19
+ "adapter": "markdown-bm25",
20
+ "distractor_count": 0,
21
+ "hit_at_1": 0.8888888888888888,
22
+ "recall_at_5": 0.8888888888888888,
23
+ "negative_false_positive_rate": 0.75,
24
+ "irrelevant_bytes": 794
25
+ },
26
+ {
27
+ "adapter": "markdown-hybrid",
28
+ "distractor_count": 0,
29
+ "hit_at_1": 0.8888888888888888,
30
+ "recall_at_5": 0.8888888888888888,
31
+ "negative_false_positive_rate": 0,
32
+ "irrelevant_bytes": 0
33
+ },
34
+ {
35
+ "adapter": "legacy-substring",
36
+ "distractor_count": 0,
37
+ "hit_at_1": 0.3333333333333333,
38
+ "recall_at_5": 0.3333333333333333,
39
+ "negative_false_positive_rate": 0,
40
+ "irrelevant_bytes": 0
41
+ },
42
+ {
43
+ "adapter": "hybrid-lexical",
44
+ "distractor_count": 0,
45
+ "hit_at_1": 0.8888888888888888,
46
+ "recall_at_5": 0.8888888888888888,
47
+ "negative_false_positive_rate": 0,
48
+ "irrelevant_bytes": 0
49
+ },
50
+ {
51
+ "adapter": "markdown-bm25",
52
+ "distractor_count": 100,
53
+ "hit_at_1": 0.8888888888888888,
54
+ "recall_at_5": 0.8888888888888888,
55
+ "negative_false_positive_rate": 0.75,
56
+ "irrelevant_bytes": 3359
57
+ },
58
+ {
59
+ "adapter": "markdown-hybrid",
60
+ "distractor_count": 100,
61
+ "hit_at_1": 0.8888888888888888,
62
+ "recall_at_5": 0.8888888888888888,
63
+ "negative_false_positive_rate": 0,
64
+ "irrelevant_bytes": 0
65
+ },
66
+ {
67
+ "adapter": "legacy-substring",
68
+ "distractor_count": 100,
69
+ "hit_at_1": 0.3333333333333333,
70
+ "recall_at_5": 0.3333333333333333,
71
+ "negative_false_positive_rate": 0,
72
+ "irrelevant_bytes": 0
73
+ },
74
+ {
75
+ "adapter": "hybrid-lexical",
76
+ "distractor_count": 100,
77
+ "hit_at_1": 0.8888888888888888,
78
+ "recall_at_5": 0.8888888888888888,
79
+ "negative_false_positive_rate": 0,
80
+ "irrelevant_bytes": 0
81
+ },
82
+ {
83
+ "adapter": "markdown-bm25",
84
+ "distractor_count": 1000,
85
+ "hit_at_1": 0.8888888888888888,
86
+ "recall_at_5": 0.8888888888888888,
87
+ "negative_false_positive_rate": 0.75,
88
+ "irrelevant_bytes": 3359
89
+ },
90
+ {
91
+ "adapter": "markdown-hybrid",
92
+ "distractor_count": 1000,
93
+ "hit_at_1": 0.8888888888888888,
94
+ "recall_at_5": 0.8888888888888888,
95
+ "negative_false_positive_rate": 0,
96
+ "irrelevant_bytes": 0
97
+ },
98
+ {
99
+ "adapter": "legacy-substring",
100
+ "distractor_count": 1000,
101
+ "hit_at_1": 0.3333333333333333,
102
+ "recall_at_5": 0.3333333333333333,
103
+ "negative_false_positive_rate": 0,
104
+ "irrelevant_bytes": 0
105
+ },
106
+ {
107
+ "adapter": "hybrid-lexical",
108
+ "distractor_count": 1000,
109
+ "hit_at_1": 0.8888888888888888,
110
+ "recall_at_5": 0.8888888888888888,
111
+ "negative_false_positive_rate": 0,
112
+ "irrelevant_bytes": 0
113
+ }
114
+ ]
115
+ }
@@ -1,6 +1,6 @@
1
1
  # Curriculum Coverage Map
2
2
 
3
- **Baseline:** Cairnkeep 2.22.4
3
+ **Baseline:** Cairnkeep 2.23.0
4
4
  **Last reviewed:** 2026-10-07
5
5
 
6
6
  This map prevents the course from drifting behind the product. It assigns each
@@ -1,6 +1,6 @@
1
1
  # Cairnkeep feature guide
2
2
 
3
- **Baseline:** Cairnkeep 2.22.4
3
+ **Baseline:** Cairnkeep 2.23.0
4
4
 
5
5
  This is the step-back map for choosing and operating Cairnkeep features. The
6
6
  [course labs](https://github.com/cairnkeep/cairnkeep-course-labs) provide one
@@ -36,6 +36,12 @@ explicit native Codex exec exports. See the L16 memory-protocol supplement;
36
36
  protocol observations and independently verified task correctness remain
37
37
  separate evidence, not a claim of model improvement.
38
38
 
39
+ Version 2.23 adds opt-in hybrid memory retrieval, explicit query aliases and
40
+ match/source/conflict explanations without changing legacy defaults. See
41
+ [memory retrieval](../memory-retrieval.md), [L04](lessons/L04-memory-fundamentals.md)
42
+ and its recording supplement. The synthetic Markdown comparison measures
43
+ retrieval policy, not general task quality or a storage-format advantage.
44
+
39
45
  ## The three-layer model
40
46
 
41
47
  1. **Memory server:** an MCP process that owns scoped durable storage. The
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Quickstart
5
5
  **Time:** 10 minutes
6
- **Tested with:** Cairnkeep 2.22.4
6
+ **Tested with:** Cairnkeep 2.23.0
7
7
 
8
8
  ## Outcome
9
9
 
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Quickstart
5
5
  **Time:** 15 minutes
6
- **Tested with:** Cairnkeep 2.22.4
6
+ **Tested with:** Cairnkeep 2.23.0
7
7
 
8
8
  ## Outcome
9
9
 
@@ -26,7 +26,7 @@ ephemeral; the named course volume is persistent.
26
26
  1. Pull the public image:
27
27
 
28
28
  ```bash
29
- podman pull ghcr.io/cairnkeep/cairnkeep:2.22.4
29
+ podman pull ghcr.io/cairnkeep/cairnkeep:2.23.0
30
30
  ```
31
31
 
32
32
  2. Start the stdio server with a read-only root filesystem and no Linux
@@ -38,7 +38,7 @@ ephemeral; the named course volume is persistent.
38
38
  --read-only --cap-drop=all --security-opt=no-new-privileges \
39
39
  --tmpfs=/tmp:rw,noexec,nosuid,size=64m,mode=1777 \
40
40
  --volume cairnkeep-course-data:/data:Z,U \
41
- ghcr.io/cairnkeep/cairnkeep:2.22.4 stdio
41
+ ghcr.io/cairnkeep/cairnkeep:2.23.0 stdio
42
42
  ```
43
43
 
44
44
  3. The process waits quietly for MCP input. Press `Ctrl-C` after confirming it
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Quickstart
5
5
  **Time:** 25 minutes
6
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
6
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
7
7
 
8
8
  ## Outcome
9
9
 
@@ -47,7 +47,7 @@ sync. Codex project trust remains an explicit operator decision.
47
47
  2. Install Cairnkeep:
48
48
 
49
49
  ```bash
50
- npm install --global @cairnkeep/cli@2.22.4
50
+ npm install --global @cairnkeep/cli@2.23.0
51
51
  cairn --version
52
52
  ```
53
53
 
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Quickstart
5
5
  **Time:** 25 minutes
6
- **Tested with:** Cairnkeep 2.22.4
6
+ **Tested with:** Cairnkeep 2.23.0
7
7
 
8
8
  ## Outcome
9
9
 
@@ -15,6 +15,10 @@ review extracted candidates before they become durable memory.
15
15
  - Key families: `decisions/`, `pitfalls/`, `patterns/`, `bugs/`,
16
16
  `constraints/`, and `conventions/`.
17
17
  - Exact read versus semantic search and substring fallback.
18
+ - Optional hybrid lexical/identifier admission, explicit aliases, match reasons
19
+ and valid empty results; similarity scores are not factual confidence.
20
+ - Curated Markdown as a credible baseline; indexing policy and storage format
21
+ are separate decisions.
18
22
  - Superseding a fact without losing history.
19
23
  - Session-end candidate extraction and `/memory-review` as the acceptance gate.
20
24
  - Typed node metadata, tags, and hard filters as an independent opt-in.
@@ -27,10 +31,24 @@ Store three synthetic facts in different categories, retrieve them by an
27
31
  imprecise query, supersede one, inspect its history, and reject one staged
28
32
  candidate.
29
33
 
34
+ From a source checkout, run:
35
+
36
+ ```sh
37
+ npm --prefix mcp-memory-server run study:memory-retrieval
38
+ ```
39
+
40
+ Compare the 0/100/1,000-distractor results and explain
41
+ why Markdown with the same admission policy matches Cairnkeep. Inspect the
42
+ semantic-only case that lexical modes miss; do not describe the synthetic
43
+ report as general accuracy. Repeat retrieval after superseding a synthetic
44
+ fact and starting a fresh client, verifying the new value and explicit history.
45
+
30
46
  ## Acceptance criteria
31
47
 
32
48
  - The learner can justify the scope and category for each fact.
33
49
  - Search finds a fact without requiring its exact key.
50
+ - A nearby but incorrect identifier and an unrelated query return no hybrid
51
+ match; aliases never widen scope or grant authority.
34
52
  - Superseding preserves the prior value in history.
35
53
  - No extracted candidate becomes durable without an explicit review action.
36
54
  - Enabling typed nodes changes discovery structure, not the authority of a fact.
@@ -38,5 +56,7 @@ candidate.
38
56
  ## Source material
39
57
 
40
58
  - [Operating guide](../../operating.md#the-workflow)
59
+ - [Memory retrieval and the Markdown baseline](../../memory-retrieval.md)
60
+ - [Recording supplement](../video-scripts/V04-memory-retrieval-supplement.md)
41
61
  - [Storage and deployment](../../storage.md)
42
62
  - [L14 - Typed memory and controlled import](L14-typed-memory.md)
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Evidence and Evaluation
5
5
  **Time:** 50 minutes
6
- **Tested with:** Cairnkeep 2.22.4
6
+ **Tested with:** Cairnkeep 2.23.0
7
7
 
8
8
  ## Outcome
9
9
 
@@ -1,7 +1,7 @@
1
1
  # L20 - Least-authority MCP tool profiles
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
  **Time:** 25 minutes
6
6
 
7
7
  ## Outcome
@@ -1,7 +1,7 @@
1
1
  # L21 - Immutable context packs and skill approval
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
  **Time:** 40 minutes
6
6
 
7
7
  ## Outcome
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Operator
5
5
  **Time:** 30 minutes
6
- **Tested with:** Cairnkeep 2.22.4, Windows x64, and Node.js 22 or newer
6
+ **Tested with:** Cairnkeep 2.23.0, Windows x64, and Node.js 22 or newer
7
7
 
8
8
  ## Outcome
9
9
 
@@ -16,7 +16,7 @@ perform a reversible uninstall without relying on WSL or Git Bash.
16
16
  From PowerShell:
17
17
 
18
18
  ```powershell
19
- npm install --global @cairnkeep/cli@2.22.4
19
+ npm install --global @cairnkeep/cli@2.23.0
20
20
  cairn version
21
21
 
22
22
  $Lab = Join-Path $env:TEMP 'Cairnkeep Windows Lab'
@@ -3,7 +3,7 @@
3
3
  **Status:** Ready
4
4
  **Track:** Quickstart and Operator
5
5
  **Time:** 35 minutes
6
- **Tested with:** Cairnkeep 2.22.4; Pi 0.84.1; Node.js 22, 24, and 26
6
+ **Tested with:** Cairnkeep 2.23.0; Pi 0.84.1; Node.js 22, 24, and 26
7
7
 
8
8
  ## Outcome
9
9
 
@@ -1,7 +1,7 @@
1
1
  # L24 - Reviewed knowledge exchange
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
  **Time:** 35 minutes
6
6
 
7
7
  ## Outcome
@@ -1,7 +1,7 @@
1
1
  # L25 - Bounded workflow playbooks
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
  **Time:** 35 minutes
6
6
 
7
7
  ## Outcome
@@ -1,7 +1,7 @@
1
1
  # L26 - Context intelligence with explicit authority
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
 
6
6
  ## Outcome
7
7
 
@@ -1,6 +1,6 @@
1
1
  # L27 - Evaluate context companions without moving authority
2
2
 
3
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
3
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
4
4
 
5
5
  ## Outcome
6
6
 
@@ -1,7 +1,7 @@
1
1
  # L28 - Verify Cairnkeep's security posture
2
2
 
3
3
  **Status:** Ready
4
- **Tested with:** Cairnkeep 2.22.4 and Node.js 22 or newer
4
+ **Tested with:** Cairnkeep 2.23.0 and Node.js 22 or newer
5
5
 
6
6
  ## Outcome
7
7
 
@@ -11,7 +11,7 @@ and choose least authority for a network-facing MCP client.
11
11
 
12
12
  ## Prerequisites
13
13
 
14
- - Install Cairnkeep 2.22.4 or use a disposable source checkout.
14
+ - Install Cairnkeep 2.23.0 or use a disposable source checkout.
15
15
  - Complete [L20 - Least-authority MCP tool profiles](L20-mcp-tool-profiles.md).
16
16
  - Use synthetic values only; never paste a real bearer token into a recording,
17
17
  terminal transcript, or issue.
@@ -76,6 +76,8 @@ node mcp-memory-server/scripts/smoke-outbound-security.mjs
76
76
  node scripts/test-runtime-file-security.mjs
77
77
  node scripts/test-omp-staged-security.mjs
78
78
  node scripts/test-container-health.mjs
79
+ node mcp-memory-server/scripts/smoke-note-mcp.mjs --fixture-security-only
80
+ node scripts/verify-phase19-runtime-evidence.mjs --self-test
79
81
  ```
80
82
 
81
83
  The baseline rejects unpinned external Actions, `pull_request_target` and
@@ -89,6 +91,15 @@ These are static contract checks, not a live publication test. The npm secret
89
91
  is a separate credential, and steps within one job share its token authority.
90
92
  Do not republish an immutable version to demonstrate the test.
91
93
 
94
+ For post-publication evidence, run `node scripts/test-release-verification.mjs`
95
+ and read [Repeatable post-publication verification](../../releasing.md#repeatable-post-publication-verification).
96
+ The offline mutations reject mismatched trees/assets and failed signature or
97
+ provenance decisions; they do not validate real signatures. The explicit live
98
+ verifier checks the published artifacts with npm and the GitHub CLI and writes
99
+ a new report only after success. Its report says `deployment_verified: false`:
100
+ server backups, canaries and project doctors remain separate rollout evidence.
101
+ Never publish or upgrade a service just to record this exercise.
102
+
92
103
  The smoke tests cover token non-disclosure, request bounds, and deterministic
93
104
  portable-path adversarial cases.
94
105
 
@@ -141,6 +152,15 @@ retrieval still sends a query to the explicitly configured external provider.
141
152
  AnythingLLM responses have an 8 MiB cap; OpenViking retains its 1 MiB cap and
142
153
  separate consent gates. Prefer HTTPS outside loopback.
143
154
 
155
+ In a checkout with the developer-evidence follow-up, the focused note control
156
+ shows that exclusive fixture creation preserves a competing file and that the
157
+ actual note transaction rejects a substituted pre-image. Hashing is bounded
158
+ at 64 MiB, including same-inode growth checks. The runtime-evidence self-test
159
+ rejects changed or replaced log files under its existing 16 MiB cap. Developer
160
+ snapshots and corrupt-database controls still compare exact bytes; static log
161
+ labels cannot turn provider text into forged passing results. This does not
162
+ make multi-file note publication atomic or prove an empty analysis backlog.
163
+
144
164
  ## Common failures
145
165
 
146
166
  - A private `.ai` file is group/world accessible on POSIX: restore mode `0600`.
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Audience:** advanced users and platform maintainers
4
4
  **Prerequisite:** Practitioner track; L13 before operating captured evidence
5
- **Total time:** about 6 hours 45 minutes
5
+ **Total time:** about 6 hours 45 minutes, plus optional evidence/security supplements
6
6
 
7
7
  1. [L09 - Domain knowledge with RAG](../lessons/L09-domain-knowledge.md)
8
8
  2. [L10 - Faster context exploration](../lessons/L10-context-exploration.md)
@@ -17,6 +17,8 @@
17
17
  11. [L24 - Reviewed knowledge exchange](../lessons/L24-okf-exchange.md)
18
18
  12. [L25 - Bounded workflow playbooks](../lessons/L25-playbooks.md)
19
19
  13. [L26 - Context intelligence with explicit authority](../lessons/L26-context-intelligence.md)
20
+ 14. [L27 - Evaluate ecosystem ideas with bounded evidence](../lessons/L27-ecosystem-evidence.md)
21
+ 15. [L28 - Verify Cairnkeep's security posture](../lessons/L28-security-assurance.md)
20
22
 
21
23
  All modules are optional. The track is complete when the operator can add and
22
24
  remove each integration without breaking the standalone local workflow and can
@@ -27,6 +29,9 @@ L24 adds portable exchange only after the immutable-pack and privacy boundaries
27
29
  are understood.
28
30
  L25 adds policy enforcement and the unauthenticated local actor boundary before
29
31
  any future team deployment.
32
+ L27 separates protocol observations from measured task benefits. L28 adds
33
+ deployment posture, adversarial source-checkout controls and exact-source
34
+ release verification; a verified artifact is not a verified fleet rollout.
30
35
 
31
36
  Hands-on spine: `course-04-operation`, `course-06-governance`, and
32
37
  `course-07-evaluation`, `course-10-trust-context`, and
@@ -0,0 +1,34 @@
1
+ # V04 supplement — Finding the current fact without flooding context
2
+
3
+ Technical recording brief; no video is claimed as recorded. Use the source
4
+ checkout containing hybrid memory search and only invented fixture content.
5
+
6
+ ## Real terminal demonstration
7
+
8
+ Type at readable human speed, leaving pauses after each command:
9
+
10
+ ```sh
11
+ npm --prefix mcp-memory-server run build
12
+ npm --prefix mcp-memory-server run check:memory-retrieval
13
+ npm --prefix mcp-memory-server run study:memory-retrieval
14
+ ```
15
+
16
+ Zoom into the real MCP test's new-process handoff, superseded-history exclusion,
17
+ wrong-identifier refusal and provider-failure result. Demonstrate an MCP call
18
+ with `strategy: "hybrid"` and `explain: true`; show matched terms and source
19
+ locators, then show an unrelated query returning zero results. Explain that
20
+ agents still verify maintained sources and do not automatically correct memory.
21
+
22
+ ## Evidence and pacing
23
+
24
+ Show the frozen 1,000-distractor table: 3/9 first hits for substring, 8/9 for
25
+ BM25 and hybrid. Pause on the difference in irrelevant bytes and negative hits.
26
+ Then highlight that Markdown with the same admission policy also achieves 8/9
27
+ and zero negative hits. State that storage format did not cause the gain.
28
+
29
+ Finish with the semantic-only paraphrase that lexical modes miss. Explain that
30
+ provider-specific thresholds need their own evidence, that a ranking score is
31
+ not confidence, and that the attempted live study failed with HTTP 502. Do not
32
+ invent a successful live result or claim general task-quality improvements.
33
+ Use short terminal zooms and side-by-side result comparisons instead of static
34
+ slides; keep credentials and real memory off screen.
@@ -121,6 +121,26 @@ permissions, but steps in a job still share authority and the npm secret is
121
121
  separate. The baseline checks declared grants; do not present it as a successful
122
122
  live publish or rerun a release merely for this recording.
123
123
 
124
+ In the release-verification supplement, run
125
+ `node scripts/test-release-verification.mjs` using only the synthetic corpus.
126
+ Show a mismatched tree, altered asset and failed provenance decision, then
127
+ contrast offline policy coverage with the explicitly invoked live verifier in
128
+ `docs/releasing.md`. Show only public artifact metadata from an already
129
+ completed release, never tokens or raw diagnostics. Pause on
130
+ `deployment_verified: false`: signed artifact evidence does not prove that a
131
+ server was upgraded or its project routes still work. Do not publish or
132
+ upgrade production for a demonstration.
133
+
134
+ For the developer-evidence supplement, run
135
+ `node mcp-memory-server/scripts/smoke-note-mcp.mjs --fixture-security-only` and
136
+ `node scripts/verify-phase19-runtime-evidence.mjs --self-test` in a built source
137
+ checkout. Pause on the competing-file preservation and actual transaction
138
+ pre-image replacement controls. Explain that hashing uses one bounded inspected
139
+ descriptor, not a pathname check followed by reopening. Contrast integrity of
140
+ a read with atomicity of a multi-file transaction: this patch improves the
141
+ former, not the latter. Use synthetic files and keep historical alert status
142
+ separate from a green test result; record only after the release gates pass.
143
+
124
144
  ### 9:20–10:30 — Read the residual risks
125
145
 
126
146
  End on `docs/security-assurance.md`, not on a green checkmark. Call out the