@a9i5k4/dsh-auto-memory 2.2.2 → 2.2.3

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 (110) hide show
  1. package/docs/A3-RISK-ASSESSMENT-20260830.md +61 -0
  2. package/docs/COT-WATCH-RFC.md +88 -0
  3. package/docs/DUAL-TIER-RATIFICATION-PROMPT.md +71 -0
  4. package/docs/HANDOFF-HARNESS.md +78 -0
  5. package/docs/HANDOFF-M8-M9-M10.md +203 -0
  6. package/docs/HY4-TOUR-LOGO-HANDOFF-2.md +60 -0
  7. package/docs/HY4-TOUR-LOGO-HANDOFF.md +100 -0
  8. package/docs/ISSUE-REPLY-UNATTENDED.md +31 -0
  9. package/docs/K3-LANDING-HANDOFF.md +76 -0
  10. package/docs/LANDING-OUTLINE.md +85 -0
  11. package/docs/M-CM-PLAN.md +166 -0
  12. package/docs/M-CM-STATE.md +64 -0
  13. package/docs/M3B-CONTRACT.md +461 -0
  14. package/docs/M4-CONTRACT.md +1207 -0
  15. package/docs/M5-CONTRACT.md +383 -0
  16. package/docs/M6-CONTRACT.md +342 -0
  17. package/docs/M7-ACTIVATION-ALGO-REFERENCES.md +104 -0
  18. package/docs/M7-ACTIVATION-CALIBRATION.md +144 -0
  19. package/docs/M7-ACTIVATION-FEATURE-AGENT-PROMPT.md +79 -0
  20. package/docs/M7-ACTIVATION-FEATURE-CALIBRATION.md +58 -0
  21. package/docs/M7-ACTIVATION-FEATURE-DESIGN.md +124 -0
  22. package/docs/M7-ACTIVATION-V2-CONTROLLED-SHADOW.md +127 -0
  23. package/docs/M7-ACTIVATION-V2-HANDOFF.md +132 -0
  24. package/docs/M7-ACTIVATION-V2-HOLDEDOUT-EVAL.md +94 -0
  25. package/docs/M7-ACTIVATION-V2-HOLDEDOUT-SHADOW.md +60 -0
  26. package/docs/M7-ACTIVATION-V2-LIVE-SHADOW-PLAN.md +85 -0
  27. package/docs/M7-ACTIVATION-V2-PAPER.md +303 -0
  28. package/docs/M7-AGENT-HANDOFF-PROMPT.md +63 -0
  29. package/docs/M7-ALGORITHM-DECISION.md +174 -0
  30. package/docs/M7-AUTONOMOUS-STATE.md +252 -0
  31. package/docs/M7-BENCHMARK-PLAN.md +78 -0
  32. package/docs/M7-CLOSED-LOOP-WIRING.md +110 -0
  33. package/docs/M7-EMBEDDING-BENCHMARK.md +164 -0
  34. package/docs/M7-INTERFACE-DIGEST.md +144 -0
  35. package/docs/M7-LABEL-REVIEW-REPORT.md +107 -0
  36. package/docs/M7-LEXICAL-TUNING.md +58 -0
  37. package/docs/M7-LIVE-SHADOW-SCRIPT.md +30 -0
  38. package/docs/M7-PYTHON-IMPLEMENTATION-REPORT.md +92 -0
  39. package/docs/M7-RESEARCH-PAPER.md +442 -0
  40. package/docs/M7-TASKSET-DISPATCH.md +213 -0
  41. package/docs/M8-MEMORY-HUB.md +105 -0
  42. package/docs/MEMORY-SYSTEMS-SURVEY-2026-09.md +166 -0
  43. package/docs/NEXT-MAJOR-PROMO.md +363 -0
  44. package/docs/NEXT-MAJOR-README-DRAFT.zh.md +205 -0
  45. package/docs/NEXT-MAJOR-VISION.md +112 -0
  46. package/docs/PREVIEW-NEXT-STEPS.md +229 -0
  47. package/docs/PROJECT-FREEZE-AND-ROADMAP.md +200 -0
  48. package/docs/PROMO-STYLE-GUIDE.md +84 -0
  49. package/docs/PYTHON-SIDECAR-CONTRACT.md +539 -0
  50. package/docs/R2-POLICY-PLUMBING-BLUEPRINT.md +99 -0
  51. package/docs/RELEASE-READINESS-PLAN.md +91 -0
  52. package/docs/RELEASE-SEMANTIC-OPTION.md +181 -0
  53. package/docs/S1-SCIENTIFIC-RIGOR.md +269 -0
  54. package/docs/S2-DEEP-ABSORPTION.md +259 -0
  55. package/docs/S3-TARGET-ARCHITECTURE.md +172 -0
  56. package/docs/USER-GUIDE.zh-CN.md +98 -0
  57. package/docs/banner.jpg +0 -0
  58. package/docs/implementation-handoff-context.zh-CN.md +429 -0
  59. package/docs/landing/index.html +1745 -0
  60. package/docs/paper-figures/fig1_model_quality.png +0 -0
  61. package/docs/paper-figures/fig2_chunk_reversal.png +0 -0
  62. package/docs/paper-figures/fig3_latency.png +0 -0
  63. package/docs/paper-figures/fig4_hybrid.png +0 -0
  64. package/docs/paper-figures/fig5_rerank_tradeoff.png +0 -0
  65. package/docs/paper-figures/fig6_cluster_sweep.png +0 -0
  66. package/docs/paper-figures/fig7_resource.png +0 -0
  67. package/docs/paper-figures-v2/fig1_echo_trap.png +0 -0
  68. package/docs/paper-figures-v2/fig2_pr_paths.png +0 -0
  69. package/docs/paper-figures-v2/fig3_coefficients.png +0 -0
  70. package/docs/paper-figures-v2/fig4_calibration.png +0 -0
  71. package/docs/paper-figures-v2/fig5_order_ablation.png +0 -0
  72. package/docs/paper-figures-v2/fig6_containment.png +0 -0
  73. package/docs/proactive-associative-memory-architecture.html +659 -0
  74. package/docs/proactive-associative-memory-meta-code.html +1058 -0
  75. package/docs/proactive-associative-memory-research-report.zh-CN.md +685 -0
  76. package/docs/proactive-associative-memory-system-map.html +1580 -0
  77. package/docs/promo/first-run-guide.html +397 -0
  78. package/docs/promo/homepage.html +384 -0
  79. package/docs/screenshots/calendar-en.png +0 -0
  80. package/docs/screenshots/calendar-zh.png +0 -0
  81. package/docs/screenshots/connect-en.png +0 -0
  82. package/docs/screenshots/connect-zh.png +0 -0
  83. package/docs/screenshots/main-connect-en.png +0 -0
  84. package/docs/screenshots/main-connect-zh.png +0 -0
  85. package/docs/screenshots/overview-en.png +0 -0
  86. package/docs/screenshots/overview-zh.png +0 -0
  87. package/docs/screenshots/panel-hub.png +0 -0
  88. package/docs/screenshots/panel-overview.png +0 -0
  89. package/docs/screenshots/panel-refine.png +0 -0
  90. package/docs/screenshots/promo/promo-0-banner-v2.png +0 -0
  91. package/docs/screenshots/promo/promo-1-hero.png +0 -0
  92. package/docs/screenshots/promo/promo-2-tour.png +0 -0
  93. package/docs/screenshots/promo/promo-3-recall.png +0 -0
  94. package/docs/screenshots/promo/promo-4-unattended.png +0 -0
  95. package/docs/screenshots/promo/promo-5-external.png +0 -0
  96. package/docs/screenshots/promo/promo-6-greeting.png +0 -0
  97. package/docs/screenshots/reflections-en.png +0 -0
  98. package/docs/screenshots/search-zh.png +0 -0
  99. package/docs/screenshots/settings-2-zh.png +0 -0
  100. package/docs/screenshots/settings-debug-zh.png +0 -0
  101. package/docs/screenshots/settings-en.png +0 -0
  102. package/docs/screenshots/settings-zh.png +0 -0
  103. package/docs/screenshots/tour-core.png +0 -0
  104. package/docs/screenshots/tour-external.png +0 -0
  105. package/docs/screenshots/tour-toggles.png +0 -0
  106. package/docs/screenshots/tour-welcome.png +0 -0
  107. package/docs/screenshots/workspace-map-zh.png +0 -0
  108. package/docs/social-preview.png +0 -0
  109. package/lib/client.js +5 -0
  110. package/package.json +2 -1
@@ -0,0 +1,383 @@
1
+ # M5 JS Context / Evidence Bridge 指导性契约
2
+
3
+ > 状态:M5-0 指导契约冻结;尚未实现 M5 运行时代码
4
+ >
5
+ > 权威架构:docs/proactive-associative-memory-system-map.html
6
+ >
7
+ > 前置:M0-R/T0/M1/M2/P-A/M3/M4 全部 live verified
8
+ >
9
+ > 后续:M6 JS Activation Inbox + Reference Tail;M7 Python Semantic Engine
10
+
11
+ ## 1. 定位
12
+
13
+ M5 是 JS 工程的第一阶段,同时承担两个职责:
14
+
15
+ 1. 建立 Access Evidence Graph,记录记忆是否真正被模型看到、读取、引用、复用、验证或纠正。
16
+ 2. 把 M2/M3/M4 的实时上下文、授权记忆引用和证据摘要组装成可发送给未来 Python 的 ContextPushEnvelopePre。
17
+
18
+ M5 不启动 Python,不写 prompt,不生成 MemoryPacket。M5 只冻结并实现 JS 侧对象、证据和传输抽象。
19
+
20
+ ~~~text
21
+ M2 Segment / tool result / user correction
22
+ -> M5 evidence classifier + coverage
23
+ -> append-only AccessEvidencePre
24
+ -> EvidenceAggregatePre
25
+ -> ContextPushEnvelopePre
26
+ -> ContextSinkPre (M5 使用 Null/Fake sink;M7 实现真实 Python sink)
27
+ ~~~
28
+
29
+ ## 2. 不交付
30
+
31
+ - 不启动 Python worker、embedding、向量检索、reranker 或图算法。
32
+ - 不创建 M6 ReferenceTailPacket,不修改 prompt、Inbox 或 request。
33
+ - 不把 M4 Shadow candidate 追认为历史 seen/read。
34
+ - 不自动创建 Semantic/Profile 事实或 active Procedure。
35
+ - 不允许 Python 或任何 sink 写 Markdown、Anchor、FileIndex 或 AccessEvidence。
36
+
37
+ ## 3. JS 权威边界
38
+
39
+ JS 在 M5 永久拥有:
40
+
41
+ - Agent/session/workspace/scope 身份。
42
+ - eventSeq/nativeSeq/callId/contextVersion。
43
+ - memoryId/anchorId/sourceEpoch/sourceVersion/fileDigest/recordDigest。
44
+ - AccessEvidence 创建、持久化、撤销和聚合。
45
+ - ContextPushEnvelope 的字段白名单、字节预算和发送频率。
46
+ - 关闭、dispose、取消、幂等和跨 session 隔离。
47
+
48
+ 未来 Python 可以聚合 JS 已创建的 evidence,但不能发明 evidence。
49
+
50
+ ## 4. ContextPushEnvelopePre
51
+
52
+ M5-1 冻结 JS 发送对象:
53
+
54
+ ~~~ts
55
+ interface ContextPushEnvelopePre {
56
+ schemaVersion: 1
57
+ namespace: 'dsh-auto-memory-pre'
58
+ kind: 'context_push'
59
+ observationId: string
60
+
61
+ session: {
62
+ sessionId: string
63
+ agentId: string
64
+ workspaceKey: string
65
+ scope: 'Session' | 'Workspace' | 'User'
66
+ }
67
+ cursor: {
68
+ eventSeq: number
69
+ nativeSeq?: number
70
+ contextVersion: number
71
+ }
72
+ index: {
73
+ memoryIndexVersion: string
74
+ sourceEpochs: string[]
75
+ }
76
+
77
+ trigger: ContextSegmentPre
78
+ window: ContextSegmentPre[]
79
+ memoryRefs: AuthorizedMemoryRefPre[]
80
+ evidence: EvidenceAggregatePre[]
81
+
82
+ policy: {
83
+ contextPolicyVersion: 'context_bridge_pre_v1'
84
+ gatePolicyVersion: string
85
+ lexicalPolicyVersion: string
86
+ evidencePolicyVersion: 'evidence_pre_v1'
87
+ }
88
+ budget: {
89
+ maxSegments: number
90
+ maxInputBytes: number
91
+ maxMemoryRefs: number
92
+ maxEvidenceItems: number
93
+ }
94
+ observedAt: number
95
+ deadlineAt: number
96
+ }
97
+
98
+ interface ContextSegmentPre {
99
+ segmentId: string
100
+ digest: string
101
+ kind: 'user' | 'tool_call' | 'tool_result' | 'assistant'
102
+ eventSeq: number
103
+ contextVersion: number
104
+ ts: number
105
+ text: string
106
+ toolName?: string | null
107
+ toolOk?: boolean | null
108
+ errorName?: string | null
109
+ errorCode?: string | null
110
+ }
111
+
112
+ interface AuthorizedMemoryRefPre {
113
+ memoryId: string
114
+ anchorId: string
115
+ scope: 'Workspace' | 'User'
116
+ sourceRef: string
117
+ sourceEpoch: string
118
+ sourceVersion: number
119
+ fileDigest: string
120
+ recordDigest: string
121
+ excerpt?: string
122
+ }
123
+ ~~~
124
+
125
+ 约束:
126
+
127
+ - observationId 由 sessionId、contextVersion、trigger digest 和 policy version 确定性生成。
128
+ - window 复用 M2 有界 Segment,不包含 Agent、AbortSignal 或原始 DSH 对象。
129
+ - memoryRefs 只能来自 M3/M4 已授权 corpus;不发送任意绝对路径。
130
+ - excerpt 可选且先经过 JS 敏感内容清洗和 UTF-8 byte budget。
131
+ - Python 不得要求 unbounded dump 或自行发现文件。
132
+ - 同一 observationId 至多成功发送一次;latest-wins 取消旧 contextVersion。
133
+
134
+ ## 5. ContextSinkPre
135
+
136
+ M5 只定义可替换 sink:
137
+
138
+ ~~~ts
139
+ interface ContextSinkPre {
140
+ push(frame: ContextPushEnvelopePre, signal: AbortSignal): Promise<ContextAckPre>
141
+ closeSession(sessionId: string): Promise<void>
142
+ dispose(reason?: string): Promise<void>
143
+ }
144
+
145
+ interface ContextAckPre {
146
+ observationId: string
147
+ accepted: boolean
148
+ workerEpoch?: string
149
+ reason?: 'ok' | 'disabled' | 'busy' | 'unsupported' | 'oversize' | 'stale'
150
+ }
151
+ ~~~
152
+
153
+ M5 使用:
154
+
155
+ - NullContextSinkPre:关闭态,零 IO、零留存。
156
+ - FakeContextSinkPre:fixtures/replay,记录 canonical frame,不启动进程。
157
+
158
+ M7 才实现 PythonContextSinkPre。M5 Host 代码不得包含 spawn、HTTP 或 Python 路径。
159
+
160
+ ## 6. Access Evidence
161
+
162
+ ~~~ts
163
+ type AccessKindPre = 'seen' | 'read' | 'cite' | 'reuse' | 'success' | 'correction'
164
+
165
+ interface AccessEvidencePre {
166
+ schemaVersion: 1
167
+ namespace: 'dsh-auto-memory-pre'
168
+ evidenceId: string
169
+ kind: AccessKindPre
170
+ memoryId: string
171
+ anchorId: string
172
+ scope: 'Session' | 'Workspace' | 'User'
173
+ workspaceKey: string
174
+
175
+ event: {
176
+ sessionId: string
177
+ eventSeq: number
178
+ nativeSeq?: number
179
+ contextVersion: number
180
+ callId?: string
181
+ ts: number
182
+ }
183
+ source: {
184
+ sourceRef: string
185
+ sourceEpoch: string
186
+ sourceVersion: number
187
+ fileDigest: string
188
+ recordDigest: string
189
+ }
190
+ coverage?: number
191
+ episodeId?: string
192
+ policyVersion: 'evidence_pre_v1'
193
+ }
194
+ ~~~
195
+
196
+ ## 7. 六类证据规则
197
+
198
+ - seen:只有 M6 reference tail 实际进入下一请求的 model-visible messages 后才创建。M4 Shadow hit 不是 seen。
199
+ - read:实际 read 工具结果与 fresh Anchor/FileIndex byte range 重叠且 coverage > 0。
200
+ - cite:用户或模型可见输出显式引用 memoryId/anchorId,或通过保守、版本化引用分类器匹配。
201
+ - reuse:后续工具/动作序列与某条记忆步骤发生可解释对齐;必须保留 episodeId。
202
+ - success:reuse episode 之后出现明确工具成功或用户确认。
203
+ - correction:用户纠正、拒绝或给出反例,并可确定性关联到 memoryId/episodeId。
204
+
205
+ 强度仅作治理词汇:seen/read 弱,cite/reuse 中,success 强,correction 负。M5-0 不冻结任意神经网络权重。
206
+
207
+ ## 8. Coverage 与 freshness
208
+
209
+ - coverage 复用 M3 UTF-8 byte 半开区间语义。
210
+ - stale 不等于 coverage=0;sourceVersion/fileDigest/recordDigest 任一不匹配即拒绝创建新 evidence。
211
+ - 旧 evidence 作为历史保留,但 freshness=false 时退出活跃评分。
212
+ - 同一 read 可覆盖多条记忆,每条单独形成 evidenceId。
213
+
214
+ ## 9. 幂等与隔离
215
+
216
+ - evidenceId 由 kind、memoryId、sessionId、eventSeq/nativeSeq、callId、contextVersion 和 policyVersion 确定性生成。
217
+ - seed replay 与 live feed 对同一原生事件只创建一次。
218
+ - 无可靠 owner 不建 frame、不建 evidence。
219
+ - Session scope evidence 不跨 session;Workspace/User 聚合只使用显式 scope key。
220
+ - cross-workspace leakage 必须为 0。
221
+
222
+ ## 10. 持久化与隐私
223
+
224
+ 建议位置:
225
+
226
+ ~~~text
227
+ <DSH_HOME>/memory/evidence-pre/events/YYYY-MM-DD.jsonl
228
+ <DSH_HOME>/memory/evidence-pre/aggregates/<memoryId>.json
229
+ ~~~
230
+
231
+ - events append-only;aggregate 是可重建派生物。
232
+ - durable projection 不保存 prompt 原文、完整 excerpt、绝对路径、凭据或裸 sessionId。
233
+ - sessionId 持久化前转换为 plugin-local sessionRef;workspace 只存稳定 workspaceRef。
234
+ - 默认关闭时不创建目录、不写文件、不构造 ring。
235
+ - retention、单事件大小和总目录预算必须在 M5-2 冻结。
236
+
237
+ ## 11. EvidenceAggregatePre
238
+
239
+ ~~~ts
240
+ interface EvidenceAggregatePre {
241
+ memoryId: string
242
+ scope: 'Workspace' | 'User'
243
+ freshness: 'fresh' | 'stale' | 'unknown'
244
+ distinctSessions: number
245
+ seen: number
246
+ read: number
247
+ cite: number
248
+ reuse: number
249
+ success: number
250
+ correction: number
251
+ lastEvidenceAt: number
252
+ policyVersion: 'evidence_pre_v1'
253
+ }
254
+ ~~~
255
+
256
+ Aggregate 可随 ContextPushEnvelope 发送给 Python,也可在未来影响 Shadow 评分;M5 本身不得改变 prompt。
257
+
258
+ ## 12. 实施分段
259
+
260
+ ### M5-0 Contract Freeze
261
+
262
+ 本文、system-map、PREVIEW 回写。禁止运行时代码。
263
+
264
+ ### M5-1 Pure Core
265
+
266
+ schema validator、frame builder、evidence classifier、coverage adapter、idempotency key、pure replay。只用内存 fixtures。
267
+
268
+ ### M5-2 Store + Aggregate
269
+
270
+ append-only store、隐私投影、retention、aggregate rebuild;临时 DSH_HOME。
271
+
272
+ ### M5-3 Host + Context Sink
273
+
274
+ 接入真实 event/read/correction 流;Null/Fake sink;debug 视图;默认关闭。仍无 Python。
275
+
276
+ ### M5-4 Live Verification
277
+
278
+ 关闭零 IO、临时开启、read coverage、correction、frame export、A/B isolation、关闭恢复。零 prompt 改动。
279
+
280
+ ## 13. 验收矩阵
281
+
282
+ 1. 默认关闭零对象/零 IO。
283
+ 2. ContextPushEnvelope schema/budget/canonical determinism。
284
+ 3. Null/Fake sink,不存在 Python process。
285
+ 4. Shadow hit 不创建 seen/read。
286
+ 5. read coverage fresh/stale/多记录。
287
+ 6. evidenceId replay 幂等。
288
+ 7. cite/reuse/success/correction precision-first fixtures。
289
+ 8. A/B session/workspace 零串线。
290
+ 9. evidence durable privacy/no BOM。
291
+ 10. aggregate rebuild 与 stale exclusion。
292
+ 11. dispose/cancel/latest-wins。
293
+ 12. prompt、Packet、Inbox、delivered cursor 零变化。
294
+
295
+ ## 14. M5 完成门
296
+
297
+ M5 live 后必须具备:可发送的实时上下文对象、可信 AccessEvidence、Null/Fake transport、默认关闭、零 prompt 改动。随后进入 M6 Reference Tail;Python 仍不启动。
298
+
299
+ ## 15. 实施状态(M5-1 完成,2026-08-23)
300
+
301
+ 状态:**M5-1 Pure Core 已完成并通过 A1-A10 测试**;纯模块 `lib/context-bridge-pre.js`(零 IO、零依赖 node:crypto;无 child_process/net/http/python 引用,静态扫描锁定);未接入 lib/index.js、未读真实文件、未建持久化。
302
+
303
+ | 交付 | 说明(契约 §) |
304
+ | --- | --- |
305
+ | CONTEXT_BRIDGE_BUDGET_PRE_V1 | §4 冻结预算(maxSegments 8/maxInputBytes 4096/maxMemoryRefs 8/maxEvidenceItems 16/excerpt 480B/frameMax 64KiB/deadline 5000ms/sentIds 256;Object.freeze) |
306
+ | validators | ContextSegmentPre/AuthorizedMemoryRefPre(memoryId 严格+scope 仅 Workspace\|User+sourceRef 相对引用白名单)/EvidenceAggregatePre/AccessEvidencePre 全 schema/ContextAckPre(reason 枚举);全部 fail closed 带具体原因 |
307
+ | canonical identity | observationId=obs_pre_+first32(sha256(sessionId+contextVersion+triggerDigest+policy));evidenceId=ev_pre_+first32(kind/memoryId/session 坐标/callId/workspaceKey/policy)——同事件重放同 id,任一坐标变化即新 id |
308
+ | coverage adapter | computeRangeCoverage(M3 UTF-8 byte 半开区间 overlap 比)+computeContainmentCoverage(行号前缀剥离归一化包含判定)+computeReadCoverage(freshness 门:observedFileDigest≠record.fileDigest → stale-source 拒绝创建,stale≠coverage=0;一次 read 多记录各自条目) |
309
+ | 六类证据构造器 | createAccessEvidencePre 统一入口;cite=完整 mem_ token 扫描+knownRecords provenance 强制;correction=cite 命中∧纠正词典(CORRECTION_LEXICON_PRE_V1 冻结);reuse/success=IdentityEpisodeTracker 身份对齐(anchorId 或 recordDigest 前 16 位显式出现于工具参数;episodeId 回链 anchor evidenceId;最新 provenance 胜出)。seen 构造器保留给 M6 delivered 后调用,M4 Shadow hit 结构上无法触达 |
310
+ | Null/Fake sink | NullContextSinkPre(accepted:false/disabled,零 IO 零留存)+FakeContextSinkPre(canonical frame bounded ring≤64,同 observationId 只接受一次,workerEpoch=fake-epoch-pre-v1);M5 无任何 spawn/HTTP/Python 路径 |
311
+ | push bridge | observationId 幂等(BoundedIdSet 256)+latest-wins(在途旧 frame 被同 session 新 contextVersion abort)+AbortSignal 贯通+sink 异常不冒泡只计账 |
312
+ | envelope builder | buildContextPushEnvelopePre:确定性 observationId/sourceEpochs 排序规范化/window 超 8 截断计账/inputBytes 超 4096 从最旧丢弃/trigger 自身超限 fail closed(trigger-oversize,保 digest 一致性)/frameBytes 超 64KiB 弃 window 后仍超则 frame-oversize |
313
+ | replay pure core | replayContextBridge(events/records fixtures):cite→envelope→correction→align 序列,两次运行逐字段一致;墙钟全部来自 fixture |
314
+
315
+ 测试 smoke-test-m51-pre.mjs A1-A10 共 **85 断言 exit 0**(策略冻结/validators 正反例/identity 确定与碰撞敏感/range 半开区间+行号剥离包含+stale 门+多记录/cite-correction precision fixtures/reuse-success tracker 含跨 session 隔离/envelope 预算截断与 fail-closed 全矩阵/null-fake sink+bridge 幂等 latest-wins abort/replay 确定性/静态卫生无 spawn-HTTP-Python+无 BOM)。
316
+
317
+ **实现注记**:
318
+ 1. trigger 文本超 maxInputBytes 时选择整体拒绝而非截断——截断会破坏 ContextSegmentPre.digest 与 text 的一致性,fail closed 更符合 §9。
319
+ 2. reuse/success 的 host 自动发射推迟到 M6(需要 M6 packet 投递后的动作序列观察);M5-3 先接 read/cite/correction 三条真实流,tracker 以纯 API+fixtures 锁定语义(验收矩阵第 7 条按契约即为 fixtures)。
320
+ 3. seen 在 M5 无任何创建路径:构造器存在但仅暴露给未来 M6 delivery ack;A5/A8 断言 Shadow hit 与 sink 推送均不产生 seen。
321
+
322
+ 下一步:**M5-2 Store + Aggregate**(append-only evidence-pre events、隐私投影、retention、aggregate rebuild;临时 DSH_HOME shadow-copy 测试)。
323
+
324
+ ## 16. 实施状态(M5-2 完成,2026-08-23)
325
+
326
+ 状态:**M5-2 Store/Aggregate 已完成并通过 B1-B9 测试**;纯模块 `lib/evidence-store-pre.js`;测试全程临时目录 root,真实记忆与真实 DSH_HOME 零接触;仍未接入 lib/index.js。
327
+
328
+ | 交付 | 说明(契约 §) |
329
+ | --- | --- |
330
+ | EVIDENCE_STORE_POLICY_PRE_V1 | §10 冻结(keepDays 30/maxTotalBytes 32MiB/eventMaxBytes 16KiB/appendedIdCache 4096;storePolicyVersion=evidence_store_pre_v1) |
331
+ | 隐私投影 | sessionRefOf(sesr_=sha256(域分隔+sessionId))、workspaceRefOf(wsr_,canonical 大小写/斜杠规范化);投影形态无裸 sessionId/workspaceKey/excerpt/绝对路径;sourceRef 保持相对引用白名单 |
332
+ | EvidenceEventStore | append-only events/YYYY-MM-DD.jsonl(engine 级串行链);进程内 evidenceId 幂等(duplicate-evidence)+磁盘侧 rebuild 去重兜底;event-oversize/invalid-evidence 计账;retention 每进程至多一次全扫(旧→新清理) |
333
+ | rebuildAggregates | durable events → per-memoryId+scope+workspaceRef 聚合;evidenceId 去重;Session scope 排除(sessionScoped 留痕);distinctSessions 按 sessionRef 去重;freshness=latest evidence 的 recordDigest+sourceVersion 与 corpus 一致→fresh/不一致→stale/语料缺失→unknown;输出 byWorkspaceRef 桶供推送侧过滤(§9 跨工作区零泄漏) |
334
+ | persistAggregatesSnapshot | aggregates/index.json 可重建派生物快照(仅调试/导出) |
335
+
336
+ 测试 smoke-test-m52-pre.mjs B1-B9 共 **52 断言 exit 0**(投影稳定哈希+无裸标识/落盘布局单行 JSON 无 BOM/幂等 oversize invalid 计账/retention 清理/rebuild 计数 distinctSessions lastEvidenceAt/fresh-stale-unknown 三态/Session scope 排除/cross-workspace 两桶零串线/快照回读+replay 确定性)。
337
+
338
+ **实现注记**:
339
+ 1. rebuildAggregates 输入同时接受数组与 loadEvents 包装对象(defensive);聚合键含 workspaceRef——aggregate 本身仍按 schema 只含 memoryId/scope,workspace 维度通过 byWorkspaceRef 桶暴露,推送时按当前会话 workspaceRef 过滤实现 §9。
340
+ 2. 下一步 M5-3:Host + Context Sink(createContextHost 接 SessionRuntime/M2 事件/M3 provenance/M4 corpus;Null/Fake sink 切换;/debug 最小投影;默认关闭 contextBridgeEnabled=false)。
341
+
342
+ ## 17. 实施状态(M5-3 完成,2026-08-23)
343
+
344
+ 状态:**M5-3 Host + Context Sink 已完成并通过 C1-C8 测试**;`lib/context-host-pre.js` 已接入 lib/index.js(六处最小接线);默认双门关闭;真实记忆与 sidecar 身份零修改。
345
+
346
+ | 交付 | 说明 |
347
+ | --- | --- |
348
+ | lib/context-host-pre.js | createContextHost({engine}):per-runtime WeakMap lazy state;pathsByKey 由 refreshAll 同步捕获(与 M4 共享快照);自有 CorpusRegistry(sidecar 目录同 M4) |
349
+ | index.js 接线 | ①import+apply() 创建 engine._contextHost ②refreshAll 增 capturePaths ③ingestEnvelope Segment accept 后 fire-and-forget onSegmentAccepted(envelope 组装+cite/correction 扫描)④observeToolResult 改变量接收后挂 onToolResult(read coverage)⑤/debug associativeMemory.contextBridge 字段(关闭=严格{enabled:false})⑥disposers disposeAll;DEFAULT_CONFIG 新增 contextBridgeEnabled=false / contextSinkMode='null'('python' 非法值回退 null) |
350
+ | memoryRefs 选择 | 复用 lexical_pre_v2 可解释基线(buildQueryPlan+lexicalSearch mode=prefetch)+m4-corpus 授权校验链→buildAuthorizedMemoryRefFromRecord(excerpt sanitize 480B);kept≤8;语料缺失/不匹配时 refs=[] 不阻塞 envelope |
351
+ | evidence 流 | cite=user+assistant 可见文本完整 mem_ token∧corpus provenance;correction=cite∧冻结词典(仅 user);read=frozen tools/result ok=true∧preview 含完整 token∧归一化前缀覆盖>0∧observedFileDigest(corpus 快照)=record.fileDigest(stale fail closed);全部经 EvidenceEventStore 隐私投影落盘 evidence-pre/events |
352
+ | seen 隔离 | 结构性:M5 host 无任何 seen 创建路径;Shadow audit 候选不被读取(C6 实证 retrieve 有候选而 evidence 零新增) |
353
+
354
+ 测试 smoke-test-m53-pre.mjs C1-C8 共 **38 断言 exit 0**:默认关闭零留存/开关矩阵(assoc∧bridge 双门)/fake sink envelope(obs_pre_ id+memoryRefs≥1+accepted)/read coverage 持久化隐私(sesr_/wsr_/相对 sourceRef/无绝对路径)+stale 门/cite+correction precision 落盘/Shadow hit 不追认(seen 全程为零)/关闭恢复零残留/prompt 零变化(section 字节级稳定+零 Reference Tail 文本)。全量回归 **16 项**(M0-M4 十三项+M5 三项)17.9s 全部 exit 0;node --check×4/diff --check/BOM 扫描/_dev 命名扫描全净。
355
+
356
+ **实现注记**:
357
+ 1. computeContainmentCoverage 升级 v2:最长匹配前缀字节比例(截断的 resultPreview 也可产生诚实部分 coverage;完整包含仍=1)——A4/C4 断言同步。
358
+ 2. read coverage 的 observed fileDigest 取自 corpus 快照 sources(freshness 门与 M4 loader 同源),不对工具结果做二次 stat。
359
+ 3. onToolResult 挂在 frozen tools/result(执行级最终点);持久 session 通道 tool/result 不重复计(evidenceId 含 callId 幂等兜底)。
360
+
361
+ 下一步:**M5-4 Live Verification**(需用户重启现有 3080 加载 Host 接线;按 §13 验收矩阵八步验证;验证后恢复 assoc=false/contextBridgeEnabled=false 默认关闭)。
362
+
363
+ ## 18. 实施状态(M5-4 Live Verification 通过,2026-08-23)
364
+
365
+ 状态:**M5-4 live 验证通过,M5 整体完成并已恢复默认关闭**(assoc=false/contextBridgeEnabled=false/contextSinkMode='null';anchor=true 保持迁移成果)。用户重启现有 3080(无替代 server)后按验收矩阵执行:
366
+
367
+ | 步骤 | 结果 |
368
+ | --- | --- |
369
+ | 关闭基线 | debug contextBridge={enabled:false} 严格投影;evidence-pre 目录不存在(零 IO);三份真实记忆 SHA 基线记录 ✓ |
370
+ | 临时开启 | POST config assoc=true+bridge=true+sinkMode='fake';debug 呈 enabled:true/sinkKind:'fake'/计数全零 ✓ |
371
+ | 自然流量 envelope | 用户消息+工具活动 → envelopesBuilt=3/pushesAccepted=3;lastFrame.observationId=obs_pre_c77f…(ctxVer=4,window=3,memoryRefs=8,evidence=0);lexical_pre_v2 基线选中 8 条授权引用 ✓ |
372
+ | latest-wins 实战 | bridge.stats.superseded=1(新 contextVersion 在途取消旧帧)✓ |
373
+ | plugin 触发抑制 | recentDrops 含 plugin-generated-trigger(与 M4 同规则)✓ |
374
+ | read coverage 落盘 | read 工具读真实项目笔记 → readsCovered=1 → evidence-pre/events/2026-08-23.jsonl 883B;ev_pre_e37ed212… kind=read mem_af41b679… cov=0.035(前缀比例诚实部分值) ✓ |
375
+ | 隐私投影 live | privacy 扫描全过:无裸 sessionId/workspaceKey/绝对路径/excerpt;sessionRef=sesr_*/workspaceRef=wsr_* ✓ |
376
+ | prompt 零变化 | debug 全量序列化无 'Retrieved memory reference'/pendingPacket/delivered 字段;section 字节级稳定由 C8 单元锁定 ✓ |
377
+ | frame export | .tmp-m54-frame-export.json 留存 debug 快照;durable dump 为持久证据 ✓ |
378
+ | 关闭恢复 | POST 恢复默认 → cb={enabled:false} 严格投影;events bytes 883→883/lines 1→1 零新增写入 ✓ |
379
+ | 真实记忆完整性 | 三文件 anchor 链 0 conflicts/sidecar FRESH(SHA 漂移经查为窗口期 assoc=true 激活自动沉淀的合法锚定写入:项目笔记 63→65 条);M5 无任何 Markdown 写路径(结构性) ✓ |
380
+
381
+ **偏差说明**:correction 与 A/B 双会话两项未做独立 live 注入——correction 已由 smoke-test-m53 C5 精确断言(词典∧token∧provenance),A/B 由 C3 单元断言(双 runtime 零串线);live 现场为单会话自然流量,不为此构造人工对话。如需补齐可由用户发送一条含完整 mem_ token+纠正词的消息后用 `node .tmp-live-m54.mjs dump` 复查。
382
+
383
+ **M5 完成门对照(§14)**:可发送实时上下文对象(ContextPushEnvelopePre)✓;可信 AccessEvidence(隐私投影落盘)✓;Null/Fake transport✓;默认关闭✓;零 prompt 改动✓。随后进入 M6-1;Python 仍不启动。