@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.
- package/CHANGELOG.md +44 -0
- package/claude/commands/recall.md +8 -1
- package/docs/README.md +3 -0
- package/docs/agents.md +9 -0
- package/docs/benchmarks/memory-retrieval-v1.json +115 -0
- package/docs/learning/CURRICULUM-MAP.md +1 -1
- package/docs/learning/FEATURE-GUIDE.md +7 -1
- package/docs/learning/lessons/L00-why-cairnkeep.md +1 -1
- package/docs/learning/lessons/L01-safe-trial.md +3 -3
- package/docs/learning/lessons/L02-installation.md +2 -2
- package/docs/learning/lessons/L03-first-project.md +1 -1
- package/docs/learning/lessons/L04-memory-fundamentals.md +20 -0
- package/docs/learning/lessons/L19-validated-skill-improvement.md +1 -1
- package/docs/learning/lessons/L20-mcp-tool-profiles.md +1 -1
- package/docs/learning/lessons/L21-context-packs.md +1 -1
- package/docs/learning/lessons/L22-native-windows.md +2 -2
- package/docs/learning/lessons/L23-guided-setup.md +1 -1
- package/docs/learning/lessons/L24-okf-exchange.md +1 -1
- package/docs/learning/lessons/L25-playbooks.md +1 -1
- package/docs/learning/lessons/L26-context-intelligence.md +1 -1
- package/docs/learning/lessons/L27-ecosystem-evidence.md +1 -1
- package/docs/learning/lessons/L28-security-assurance.md +22 -2
- package/docs/learning/tracks/operator.md +6 -1
- package/docs/learning/video-scripts/V04-memory-retrieval-supplement.md +34 -0
- package/docs/learning/video-scripts/V28-security-assurance.md +20 -0
- package/docs/memory-retrieval.md +174 -0
- package/docs/operating.md +5 -0
- package/docs/releasing.md +65 -0
- package/docs/security-assurance.md +15 -0
- package/docs/storage.md +5 -0
- package/examples/eval/bundled-fake.json +1 -1
- package/mcp-memory-server/dist/index.js +43 -2
- package/mcp-memory-server/dist/memory-retrieval.js +128 -0
- package/mcp-memory-server/dist/note-store.js +24 -4
- package/mcp-memory-server/package.json +2 -0
- package/opencode/command/recall.md +8 -1
- package/package.json +1 -1
- package/scripts/lib/release-verification.mjs +131 -0
- package/scripts/test-memory-retrieval-docs.sh +19 -0
- package/scripts/test-release-sbom.sh +32 -0
- package/scripts/test-release-verification.mjs +109 -0
- package/scripts/test-release-verification.sh +4 -0
- package/scripts/test-setup-reconcile.mjs +4 -2
- package/scripts/test-windows-native.mjs +1 -0
- package/scripts/verify-phase19-runtime-evidence.mjs +43 -3
- package/scripts/verify-published-release.mjs +138 -0
- 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.
|
|
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
|
# Cairnkeep feature guide
|
|
2
2
|
|
|
3
|
-
**Baseline:** Cairnkeep 2.
|
|
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:** 15 minutes
|
|
6
|
-
**Tested with:** Cairnkeep 2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
50
|
+
npm install --global @cairnkeep/cli@2.23.0
|
|
51
51
|
cairn --version
|
|
52
52
|
```
|
|
53
53
|
|
|
@@ -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:** Operator
|
|
5
5
|
**Time:** 30 minutes
|
|
6
|
-
**Tested with:** Cairnkeep 2.
|
|
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.
|
|
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'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# L28 - Verify Cairnkeep's security posture
|
|
2
2
|
|
|
3
3
|
**Status:** Ready
|
|
4
|
-
**Tested with:** Cairnkeep 2.
|
|
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.
|
|
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
|