dsh-memu-memory 1.1.2 → 1.2.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 (199) hide show
  1. package/AGENTS.md +8 -6
  2. package/README.md +50 -5
  3. package/README.zh.md +49 -5
  4. package/docs/active-memory-ab.md +385 -0
  5. package/docs/binding-lifecycle.md +99 -0
  6. package/docs/contributing.md +6 -4
  7. package/docs/emotion-model-spec.md +281 -0
  8. package/docs/env-and-commands.md +13 -0
  9. package/docs/host-api.md +35 -3
  10. package/docs/memory-semantics.md +40 -11
  11. package/docs/recall-benchmark.md +238 -0
  12. package/docs/troubleshooting.md +395 -366
  13. package/lib/active-memory.js +165 -0
  14. package/lib/activity-log.js +190 -0
  15. package/lib/backup.js +1103 -0
  16. package/lib/binding-diagnostics.js +635 -0
  17. package/lib/client.js +728 -58
  18. package/lib/consolidation-ledger.js +347 -0
  19. package/lib/consolidation-receipt.js +284 -0
  20. package/lib/consolidation-snapshot.js +274 -0
  21. package/lib/consolidation-worker.js +115 -0
  22. package/lib/curator.js +81 -37
  23. package/lib/cycle.js +43 -6
  24. package/lib/embedding-catalog.js +763 -0
  25. package/lib/embedding-download.js +407 -0
  26. package/lib/embedding-runtime.js +710 -0
  27. package/lib/engine.js +2 -2
  28. package/lib/index.js +36 -0
  29. package/lib/inject.js +232 -103
  30. package/lib/local-embedding-entry.js +145 -0
  31. package/lib/local-embedding-manager.js +267 -0
  32. package/lib/local-embedding-protocol.js +173 -0
  33. package/lib/local-embedding-worker.js +652 -0
  34. package/lib/local-vector-service.js +283 -0
  35. package/lib/memory.js +599 -57
  36. package/lib/memu-config.js +10 -22
  37. package/lib/memu.js +53 -19
  38. package/lib/mood.js +268 -39
  39. package/lib/paths.js +24 -0
  40. package/lib/preset-scope.js +1 -1
  41. package/lib/private.js +450 -29
  42. package/lib/prompts/private-consolidation.coding.md +1 -0
  43. package/lib/prompts/private-consolidation.md +1 -0
  44. package/lib/prompts/private-consolidation.mixed.md +1 -0
  45. package/lib/prompts/private-consolidation.rp.md +1 -0
  46. package/lib/prompts.js +4 -4
  47. package/lib/remote-summary.js +51 -25
  48. package/lib/rpc.js +54 -5
  49. package/lib/state.js +137 -172
  50. package/lib/tools.js +58 -7
  51. package/lib/vector-migration.js +878 -0
  52. package/lib/vector-profile.js +968 -0
  53. package/package.json +4 -2
  54. package/scripts/acceptance-local.mjs +7 -5
  55. package/scripts/active-memory-ab-live.mjs +655 -0
  56. package/scripts/active-memory-ab.mjs +1302 -0
  57. package/scripts/chain-matrix.mjs +537 -0
  58. package/scripts/check-all.mjs +29 -1
  59. package/scripts/check-doc-drift.mjs +353 -0
  60. package/scripts/diagnose-bindings.mjs +176 -0
  61. package/scripts/local-runtime-install.mjs +142 -0
  62. package/scripts/local-runtime-verify.mjs +56 -0
  63. package/scripts/local-vector-verify.mjs +93 -0
  64. package/scripts/recall-bench.mjs +813 -0
  65. package/scripts/repetition-ab-scenarios.mjs +93 -0
  66. package/scripts/repetition-detector-snapshot.mjs +314 -0
  67. package/scripts/repetition-eval-live.mjs +360 -0
  68. package/scripts/repetition-eval.mjs +702 -0
  69. package/tests/activation.test.mjs +89 -0
  70. package/tests/active-memory-ab.test.mjs +745 -0
  71. package/tests/active-memory.test.mjs +129 -0
  72. package/tests/activity-log.test.mjs +126 -0
  73. package/tests/activity-wiring.test.mjs +103 -0
  74. package/tests/appendix-b.test.mjs +212 -0
  75. package/tests/appendix-b2.test.mjs +166 -0
  76. package/tests/audit-regression.test.mjs +272 -0
  77. package/tests/audit-safety.test.mjs +227 -0
  78. package/tests/backend-compensation.test.mjs +272 -0
  79. package/tests/backup.test.mjs +793 -0
  80. package/tests/binding-diagnostics.test.mjs +720 -0
  81. package/tests/browser.test.mjs +366 -0
  82. package/tests/client-render.test.mjs +892 -0
  83. package/tests/coalesce.test.mjs +113 -0
  84. package/tests/config.test.mjs +159 -0
  85. package/tests/consolidation-credential.test.mjs +320 -0
  86. package/tests/consolidation-fork.test.mjs +357 -0
  87. package/tests/consolidation-ledger.test.mjs +298 -0
  88. package/tests/consolidation-snapshot.test.mjs +321 -0
  89. package/tests/consolidation-value.test.mjs +89 -0
  90. package/tests/context-scope.test.mjs +40 -0
  91. package/tests/cue.test.mjs +44 -0
  92. package/tests/curator-probe.test.mjs +433 -0
  93. package/tests/curator.test.mjs +150 -0
  94. package/tests/cycle.test.mjs +411 -0
  95. package/tests/disclosure.test.mjs +231 -0
  96. package/tests/doc-drift.test.mjs +222 -0
  97. package/tests/embedding-catalog.test.mjs +266 -0
  98. package/tests/embedding-download.test.mjs +391 -0
  99. package/tests/embedding-runtime.test.mjs +389 -0
  100. package/tests/emotion-chain.test.mjs +84 -0
  101. package/tests/emotion-contract.test.mjs +445 -0
  102. package/tests/engine.test.mjs +35 -0
  103. package/tests/fixtures/active-memory-ab/README.md +56 -0
  104. package/tests/fixtures/active-memory-ab/cases/01-clean-dense-turn.json +351 -0
  105. package/tests/fixtures/active-memory-ab/cases/02-clean-thin-turn.json +122 -0
  106. package/tests/fixtures/active-memory-ab/cases/03-clean-starved-small.json +125 -0
  107. package/tests/fixtures/active-memory-ab/cases/04-clean-large-thin.json +137 -0
  108. package/tests/fixtures/active-memory-ab/cases/05-clean-half-step.json +166 -0
  109. package/tests/fixtures/active-memory-ab/cases/06-clean-duplicate-reread.json +197 -0
  110. package/tests/fixtures/active-memory-ab/cases/07-clean-recent-recall.json +125 -0
  111. package/tests/fixtures/active-memory-ab/cases/08-global-relevant.json +111 -0
  112. package/tests/fixtures/active-memory-ab/cases/09-global-irrelevant-conflict.json +158 -0
  113. package/tests/fixtures/active-memory-ab/cases/10-no-human-turn.json +97 -0
  114. package/tests/fixtures/active-memory-ab/cases/11-clean-scale-100.json +137 -0
  115. package/tests/fixtures/active-memory-ab/cases/12-clean-scale-1000.json +137 -0
  116. package/tests/fixtures/active-memory-ab/cases/13-clean-scale-5000.json +137 -0
  117. package/tests/fixtures/active-memory-ab/cases/14-clean-scale-20000.json +137 -0
  118. package/tests/fixtures/active-memory-ab/lead-ai-reviewed-reference.json +191 -0
  119. package/tests/fixtures/active-memory-ab/manifest.json +199 -0
  120. package/tests/fixtures/recall-bench/01-paraphrase.json +184 -0
  121. package/tests/fixtures/recall-bench/02-exact.json +153 -0
  122. package/tests/fixtures/recall-bench/03-negation.json +173 -0
  123. package/tests/fixtures/recall-bench/04-no-answer.json +162 -0
  124. package/tests/fixtures/recall-bench/05-conflict.json +194 -0
  125. package/tests/fixtures/recall-bench/06-boundary.json +273 -0
  126. package/tests/fixtures/recall-bench/07-secret.json +191 -0
  127. package/tests/fixtures/recall-bench/08-coding.json +164 -0
  128. package/tests/fixtures/recall-bench-gold-candidates/01-paraphrase.json +193 -0
  129. package/tests/fixtures/recall-bench-gold-candidates/02-exact.json +197 -0
  130. package/tests/fixtures/recall-bench-gold-candidates/03-negation.json +244 -0
  131. package/tests/fixtures/recall-bench-gold-candidates/04-no-answer.json +189 -0
  132. package/tests/fixtures/recall-bench-gold-candidates/05-conflict.json +245 -0
  133. package/tests/fixtures/recall-bench-gold-candidates/06-boundary.json +279 -0
  134. package/tests/fixtures/recall-bench-gold-candidates/07-secret.json +224 -0
  135. package/tests/fixtures/recall-bench-gold-candidates/08-coding.json +218 -0
  136. package/tests/fixtures/repetition-eval/01-zh-rp.json +93 -0
  137. package/tests/fixtures/repetition-eval/02-en.json +97 -0
  138. package/tests/fixtures/repetition-eval/03-code.json +91 -0
  139. package/tests/fixtures/repetition-eval/04-names.json +116 -0
  140. package/tests/fixtures/repetition-eval/05-user-quote.json +96 -0
  141. package/tests/fixtures/repetition-eval/06-agreement.json +86 -0
  142. package/tests/graph-view.test.mjs +187 -0
  143. package/tests/graph.test.mjs +77 -0
  144. package/tests/hook-order.test.mjs +72 -0
  145. package/tests/humanlike.test.mjs +232 -0
  146. package/tests/hybrid-recall.test.mjs +92 -0
  147. package/tests/inbound.test.mjs +393 -0
  148. package/tests/inject-guide.test.mjs +364 -0
  149. package/tests/inject.test.mjs +222 -0
  150. package/tests/injection-budget-settings.test.mjs +35 -0
  151. package/tests/injection-budget.test.mjs +64 -0
  152. package/tests/injection-chain.test.mjs +191 -0
  153. package/tests/loader-register.mjs +3 -0
  154. package/tests/loader.mjs +12 -0
  155. package/tests/local-embedding-entry.test.mjs +95 -0
  156. package/tests/local-embedding-manager.test.mjs +476 -0
  157. package/tests/local-embedding-protocol.test.mjs +95 -0
  158. package/tests/local-embedding-worker.test.mjs +346 -0
  159. package/tests/managed-memory.test.mjs +536 -0
  160. package/tests/managed-runtime.test.mjs +40 -0
  161. package/tests/media.test.mjs +132 -0
  162. package/tests/migration-payload.test.mjs +42 -0
  163. package/tests/mood.test.mjs +109 -0
  164. package/tests/multiprocess.test.mjs +29 -0
  165. package/tests/new-session-gate.test.mjs +361 -0
  166. package/tests/package-shipping.test.mjs +84 -0
  167. package/tests/preset-scope.test.mjs +212 -0
  168. package/tests/prompts.test.mjs +250 -0
  169. package/tests/react-snapshot.test.mjs +23 -0
  170. package/tests/recall-bench.test.mjs +306 -0
  171. package/tests/remote.test.mjs +140 -0
  172. package/tests/rename.test.mjs +30 -0
  173. package/tests/repetition-detector-snapshot.test.mjs +231 -0
  174. package/tests/repetition-eval-live.test.mjs +177 -0
  175. package/tests/repetition-eval.test.mjs +373 -0
  176. package/tests/salient-date.test.mjs +142 -0
  177. package/tests/settings-beat.test.mjs +221 -0
  178. package/tests/short-term.test.mjs +166 -0
  179. package/tests/sidebar-beat.test.mjs +208 -0
  180. package/tests/sidebar-refresh.test.mjs +123 -0
  181. package/tests/sidebar.test.mjs +70 -0
  182. package/tests/snippet.test.mjs +47 -0
  183. package/tests/source-kind.test.mjs +52 -0
  184. package/tests/state.test.mjs +150 -0
  185. package/tests/stats.test.mjs +112 -0
  186. package/tests/storage.test.mjs +125 -0
  187. package/tests/stubs/dsh-llm.js +5 -0
  188. package/tests/stubs/dsh-session.js +7 -0
  189. package/tests/stubs/dsh-tools.js +101 -0
  190. package/tests/tool-schema.test.mjs +73 -0
  191. package/tests/tools.test.mjs +184 -0
  192. package/tests/ui-defaults.test.mjs +57 -0
  193. package/tests/update-fields.test.mjs +138 -0
  194. package/tests/vector-migration.test.mjs +733 -0
  195. package/tests/vector-profile.test.mjs +425 -0
  196. package/tests/visibility-migration.test.mjs +152 -0
  197. package/tests/webui-auth.test.mjs +454 -0
  198. package/tests/webui.test.mjs +164 -0
  199. package/tests/windows-env.test.mjs +89 -0
@@ -0,0 +1,194 @@
1
+ {
2
+ "name": "conflict — 冲突与待核对",
3
+ "status": "synthetic-draft-not-gold",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "subclass": "conflict",
7
+ "notes": "Synthetic draft only. Superseded and pending-review entries must not win over the current fact.",
8
+ "entries": {
9
+ "mem-rb-con-home-old": {
10
+ "id": "mem-rb-con-home-old",
11
+ "title": "住在城西",
12
+ "content": "林夏之前住在城西梧桐路,房租便宜但离公司远。",
13
+ "tags": [
14
+ "住址"
15
+ ],
16
+ "ageDays": 200,
17
+ "status": "superseded"
18
+ },
19
+ "mem-rb-con-home-new": {
20
+ "id": "mem-rb-con-home-new",
21
+ "title": "搬到城东",
22
+ "content": "林夏上个月搬到城东滨河路,离公司步行十五分钟。",
23
+ "tags": [
24
+ "住址"
25
+ ],
26
+ "ageDays": 20
27
+ },
28
+ "mem-rb-con-job-old": {
29
+ "id": "mem-rb-con-job-old",
30
+ "title": "在广告公司",
31
+ "content": "她在广告公司做文案,常加班。",
32
+ "tags": [
33
+ "工作"
34
+ ],
35
+ "ageDays": 400,
36
+ "status": "superseded"
37
+ },
38
+ "mem-rb-con-job-new": {
39
+ "id": "mem-rb-con-job-new",
40
+ "title": "自由撰稿",
41
+ "content": "林夏现在自由撰稿,主要接人物访谈,不再坐班。",
42
+ "tags": [
43
+ "工作"
44
+ ],
45
+ "ageDays": 30
46
+ },
47
+ "mem-rb-con-phone-old": {
48
+ "id": "mem-rb-con-phone-old",
49
+ "title": "旧手机号",
50
+ "content": "旧手机号尾号 4432。",
51
+ "tags": [
52
+ "手机"
53
+ ],
54
+ "ageDays": 365,
55
+ "status": "superseded"
56
+ },
57
+ "mem-rb-con-phone-new": {
58
+ "id": "mem-rb-con-phone-new",
59
+ "title": "新手机号",
60
+ "content": "新手机号尾号 7910,旧号已经停机。",
61
+ "tags": [
62
+ "手机"
63
+ ],
64
+ "ageDays": 10
65
+ },
66
+ "mem-rb-con-pending": {
67
+ "id": "mem-rb-con-pending",
68
+ "title": "待核对:搬去南方",
69
+ "content": "有人说林夏准备搬去南方,这条还没确认。",
70
+ "tags": [
71
+ "待核对"
72
+ ],
73
+ "ageDays": 2,
74
+ "status": "pending_review"
75
+ },
76
+ "mem-rb-con-current-city": {
77
+ "id": "mem-rb-con-current-city",
78
+ "title": "暂住杭州",
79
+ "content": "林夏目前暂住杭州,还没有准备搬去南方,等项目结束再决定。",
80
+ "tags": [
81
+ "住址"
82
+ ],
83
+ "ageDays": 5
84
+ }
85
+ },
86
+ "samples": [
87
+ {
88
+ "id": "rb-con-home",
89
+ "draft": true,
90
+ "notGold": true,
91
+ "subclass": "conflict",
92
+ "query": "林夏现在住哪儿?",
93
+ "context": {},
94
+ "time": "2026-10-12T12:00:00+08:00",
95
+ "expectedIds": [
96
+ "mem-rb-con-home-new"
97
+ ],
98
+ "forbiddenIds": [
99
+ "mem-rb-con-home-old"
100
+ ],
101
+ "noAnswer": false,
102
+ "library": [
103
+ "mem-rb-con-home-new",
104
+ "mem-rb-con-home-old",
105
+ "mem-rb-con-current-city",
106
+ "mem-rb-con-pending"
107
+ ]
108
+ },
109
+ {
110
+ "id": "rb-con-job",
111
+ "draft": true,
112
+ "notGold": true,
113
+ "subclass": "conflict",
114
+ "query": "她现在做什么工作?",
115
+ "context": {},
116
+ "time": "2026-10-13T12:00:00+08:00",
117
+ "expectedIds": [
118
+ "mem-rb-con-job-new"
119
+ ],
120
+ "forbiddenIds": [
121
+ "mem-rb-con-job-old"
122
+ ],
123
+ "noAnswer": false,
124
+ "library": [
125
+ "mem-rb-con-job-new",
126
+ "mem-rb-con-job-old",
127
+ "mem-rb-con-current-city"
128
+ ]
129
+ },
130
+ {
131
+ "id": "rb-con-phone",
132
+ "draft": true,
133
+ "notGold": true,
134
+ "subclass": "conflict",
135
+ "query": "她的手机尾号是多少?",
136
+ "context": {},
137
+ "time": "2026-10-14T12:00:00+08:00",
138
+ "expectedIds": [
139
+ "mem-rb-con-phone-new"
140
+ ],
141
+ "forbiddenIds": [
142
+ "mem-rb-con-phone-old"
143
+ ],
144
+ "noAnswer": false,
145
+ "library": [
146
+ "mem-rb-con-phone-new",
147
+ "mem-rb-con-phone-old",
148
+ "mem-rb-con-current-city"
149
+ ]
150
+ },
151
+ {
152
+ "id": "rb-con-pending",
153
+ "draft": true,
154
+ "notGold": true,
155
+ "subclass": "conflict",
156
+ "query": "她准备搬去南方吗?",
157
+ "context": {},
158
+ "time": "2026-10-15T12:00:00+08:00",
159
+ "expectedIds": [
160
+ "mem-rb-con-current-city"
161
+ ],
162
+ "forbiddenIds": [
163
+ "mem-rb-con-pending"
164
+ ],
165
+ "noAnswer": false,
166
+ "library": [
167
+ "mem-rb-con-current-city",
168
+ "mem-rb-con-pending",
169
+ "mem-rb-con-home-new"
170
+ ]
171
+ },
172
+ {
173
+ "id": "rb-con-old-new",
174
+ "draft": true,
175
+ "notGold": true,
176
+ "subclass": "conflict",
177
+ "query": "林夏之前住城西还是现在住城东?",
178
+ "context": {},
179
+ "time": "2026-10-16T12:00:00+08:00",
180
+ "expectedIds": [
181
+ "mem-rb-con-home-new"
182
+ ],
183
+ "forbiddenIds": [
184
+ "mem-rb-con-home-old"
185
+ ],
186
+ "noAnswer": false,
187
+ "library": [
188
+ "mem-rb-con-home-new",
189
+ "mem-rb-con-home-old",
190
+ "mem-rb-con-current-city"
191
+ ]
192
+ }
193
+ ]
194
+ }
@@ -0,0 +1,273 @@
1
+ {
2
+ "name": "boundary — 角色/世界边界",
3
+ "status": "synthetic-draft-not-gold",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "subclass": "boundary",
7
+ "notes": "Synthetic draft only. Same wording appears in a foreign channel/character/world/branch; context must exclude it.",
8
+ "entries": {
9
+ "mem-rb-bnd-world-jade": {
10
+ "id": "mem-rb-bnd-world-jade",
11
+ "title": "玉佩",
12
+ "content": "掌门把青玉佩交给林夏,说凭玉佩可以调动三名暗卫。",
13
+ "tags": [
14
+ "信物"
15
+ ],
16
+ "ageDays": 8,
17
+ "context": {
18
+ "worldId": "jianghu"
19
+ }
20
+ },
21
+ "mem-rb-bnd-world-spaceship": {
22
+ "id": "mem-rb-bnd-world-spaceship",
23
+ "title": "舰桥玉佩",
24
+ "content": "星舰舰长把青玉佩交给林夏保管,凭玉佩可以调动舰队守卫。",
25
+ "tags": [
26
+ "信物"
27
+ ],
28
+ "ageDays": 8,
29
+ "context": {
30
+ "worldId": "scifi"
31
+ }
32
+ },
33
+ "mem-rb-bnd-char-lin": {
34
+ "id": "mem-rb-bnd-char-lin",
35
+ "title": "林夏的旧伤",
36
+ "content": "林夏左肩有一道旧伤,阴天会疼,不能提重物。",
37
+ "tags": [
38
+ "旧伤"
39
+ ],
40
+ "ageDays": 18,
41
+ "context": {
42
+ "characterId": "lin"
43
+ }
44
+ },
45
+ "mem-rb-bnd-char-shen": {
46
+ "id": "mem-rb-bnd-char-shen",
47
+ "title": "沈砚的旧伤",
48
+ "content": "沈砚左肩也有旧伤,阴天会疼,但他从不说。",
49
+ "tags": [
50
+ "旧伤"
51
+ ],
52
+ "ageDays": 18,
53
+ "context": {
54
+ "characterId": "shen"
55
+ }
56
+ },
57
+ "mem-rb-bnd-channel-group": {
58
+ "id": "mem-rb-bnd-channel-group",
59
+ "title": "群里说过的事",
60
+ "content": "群里约好周五晚上八点开黑,迟到的人发红包。",
61
+ "tags": [
62
+ "约定"
63
+ ],
64
+ "ageDays": 6,
65
+ "context": {
66
+ "channelId": "group"
67
+ }
68
+ },
69
+ "mem-rb-bnd-channel-private": {
70
+ "id": "mem-rb-bnd-channel-private",
71
+ "title": "私下约定",
72
+ "content": "私下也约了周五晚上八点开黑,但只有林夏知道。",
73
+ "tags": [
74
+ "约定"
75
+ ],
76
+ "ageDays": 6,
77
+ "context": {
78
+ "channelId": "private"
79
+ }
80
+ },
81
+ "mem-rb-bnd-branch-a": {
82
+ "id": "mem-rb-bnd-branch-a",
83
+ "title": "A 线结局",
84
+ "content": "在 A 线里,林夏留在北境,成为守夜人。",
85
+ "tags": [
86
+ "结局"
87
+ ],
88
+ "ageDays": 14,
89
+ "context": {
90
+ "branchId": "route-a"
91
+ }
92
+ },
93
+ "mem-rb-bnd-branch-b": {
94
+ "id": "mem-rb-bnd-branch-b",
95
+ "title": "B 线结局",
96
+ "content": "在 B 线里,林夏没有留在北境,而是回江南开茶馆。",
97
+ "tags": [
98
+ "结局"
99
+ ],
100
+ "ageDays": 14,
101
+ "context": {
102
+ "branchId": "route-b"
103
+ }
104
+ },
105
+ "mem-rb-bnd-known": {
106
+ "id": "mem-rb-bnd-known",
107
+ "title": "只有沈砚知道",
108
+ "content": "沈砚知道林夏把信藏在第三块砖下,只有他能取。",
109
+ "tags": [
110
+ "秘密"
111
+ ],
112
+ "ageDays": 9,
113
+ "context": {
114
+ "knownBy": [
115
+ "shen"
116
+ ]
117
+ }
118
+ },
119
+ "mem-rb-bnd-public-letter": {
120
+ "id": "mem-rb-bnd-public-letter",
121
+ "title": "信的位置",
122
+ "content": "林夏把信藏在第三块砖下,谁都可以取。",
123
+ "tags": [
124
+ "信"
125
+ ],
126
+ "ageDays": 9,
127
+ "context": {}
128
+ }
129
+ },
130
+ "samples": [
131
+ {
132
+ "id": "rb-bnd-world",
133
+ "draft": true,
134
+ "notGold": true,
135
+ "subclass": "boundary",
136
+ "query": "林夏凭玉佩可以调动多少人?",
137
+ "context": {
138
+ "worldId": "jianghu",
139
+ "characterId": "lin"
140
+ },
141
+ "time": "2026-10-17T12:00:00+08:00",
142
+ "expectedIds": [
143
+ "mem-rb-bnd-world-jade"
144
+ ],
145
+ "forbiddenIds": [
146
+ "mem-rb-bnd-world-spaceship"
147
+ ],
148
+ "noAnswer": false,
149
+ "library": [
150
+ "mem-rb-bnd-world-jade",
151
+ "mem-rb-bnd-world-spaceship",
152
+ "mem-rb-bnd-char-lin"
153
+ ]
154
+ },
155
+ {
156
+ "id": "rb-bnd-char",
157
+ "draft": true,
158
+ "notGold": true,
159
+ "subclass": "boundary",
160
+ "query": "谁左肩有旧伤,阴天会疼?",
161
+ "context": {
162
+ "characterId": "lin",
163
+ "worldId": "jianghu"
164
+ },
165
+ "time": "2026-10-18T12:00:00+08:00",
166
+ "expectedIds": [
167
+ "mem-rb-bnd-char-lin"
168
+ ],
169
+ "forbiddenIds": [
170
+ "mem-rb-bnd-char-shen"
171
+ ],
172
+ "noAnswer": false,
173
+ "library": [
174
+ "mem-rb-bnd-char-lin",
175
+ "mem-rb-bnd-char-shen",
176
+ "mem-rb-bnd-world-jade"
177
+ ]
178
+ },
179
+ {
180
+ "id": "rb-bnd-channel",
181
+ "draft": true,
182
+ "notGold": true,
183
+ "subclass": "boundary",
184
+ "query": "周五晚上八点约好做什么?",
185
+ "context": {
186
+ "channelId": "group"
187
+ },
188
+ "time": "2026-10-19T12:00:00+08:00",
189
+ "expectedIds": [
190
+ "mem-rb-bnd-channel-group"
191
+ ],
192
+ "forbiddenIds": [
193
+ "mem-rb-bnd-channel-private"
194
+ ],
195
+ "noAnswer": false,
196
+ "library": [
197
+ "mem-rb-bnd-channel-group",
198
+ "mem-rb-bnd-channel-private",
199
+ "mem-rb-bnd-public-letter"
200
+ ]
201
+ },
202
+ {
203
+ "id": "rb-bnd-branch",
204
+ "draft": true,
205
+ "notGold": true,
206
+ "subclass": "boundary",
207
+ "query": "林夏最后留在北境了吗?",
208
+ "context": {
209
+ "branchId": "route-a",
210
+ "worldId": "jianghu"
211
+ },
212
+ "time": "2026-10-10T12:00:00+08:00",
213
+ "expectedIds": [
214
+ "mem-rb-bnd-branch-a"
215
+ ],
216
+ "forbiddenIds": [
217
+ "mem-rb-bnd-branch-b"
218
+ ],
219
+ "noAnswer": false,
220
+ "library": [
221
+ "mem-rb-bnd-branch-a",
222
+ "mem-rb-bnd-branch-b",
223
+ "mem-rb-bnd-world-jade"
224
+ ]
225
+ },
226
+ {
227
+ "id": "rb-bnd-known",
228
+ "draft": true,
229
+ "notGold": true,
230
+ "subclass": "boundary",
231
+ "query": "信藏在第几块砖下?",
232
+ "context": {
233
+ "characterId": "lin"
234
+ },
235
+ "time": "2026-10-11T12:00:00+08:00",
236
+ "expectedIds": [
237
+ "mem-rb-bnd-public-letter"
238
+ ],
239
+ "forbiddenIds": [
240
+ "mem-rb-bnd-known"
241
+ ],
242
+ "noAnswer": false,
243
+ "library": [
244
+ "mem-rb-bnd-public-letter",
245
+ "mem-rb-bnd-known",
246
+ "mem-rb-bnd-char-lin"
247
+ ]
248
+ },
249
+ {
250
+ "id": "rb-bnd-world-2",
251
+ "draft": true,
252
+ "notGold": true,
253
+ "subclass": "boundary",
254
+ "query": "谁把青玉佩交给林夏?",
255
+ "context": {
256
+ "worldId": "jianghu"
257
+ },
258
+ "time": "2026-10-12T12:00:00+08:00",
259
+ "expectedIds": [
260
+ "mem-rb-bnd-world-jade"
261
+ ],
262
+ "forbiddenIds": [
263
+ "mem-rb-bnd-world-spaceship"
264
+ ],
265
+ "noAnswer": false,
266
+ "library": [
267
+ "mem-rb-bnd-world-jade",
268
+ "mem-rb-bnd-world-spaceship",
269
+ "mem-rb-bnd-public-letter"
270
+ ]
271
+ }
272
+ ]
273
+ }
@@ -0,0 +1,191 @@
1
+ {
2
+ "name": "secret — 自动 vs 显式",
3
+ "status": "synthetic-draft-not-gold",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "subclass": "secret",
7
+ "notes": "Synthetic draft only. Secret entries must stay out of automatic recall but appear on explicit recall when declared.",
8
+ "entries": {
9
+ "mem-rb-sec-public-anniv": {
10
+ "id": "mem-rb-sec-public-anniv",
11
+ "title": "纪念日",
12
+ "content": "两人把相识纪念日定在五月二十日,每年会去吃一次面。",
13
+ "tags": [
14
+ "纪念日"
15
+ ],
16
+ "ageDays": 30
17
+ },
18
+ "mem-rb-sec-secret-gift": {
19
+ "id": "mem-rb-sec-secret-gift",
20
+ "title": "偷偷准备的礼物",
21
+ "content": "林夏偷偷订了一枚刻字戒指,准备在纪念日当天送出,不想提前被知道。",
22
+ "tags": [
23
+ "礼物"
24
+ ],
25
+ "ageDays": 4,
26
+ "visibility": "secret"
27
+ },
28
+ "mem-rb-sec-secret-budget": {
29
+ "id": "mem-rb-sec-secret-budget",
30
+ "title": "旅行预算底线",
31
+ "content": "这次旅行最多花八千,超过就不去了,这个数不想让同行的人知道。",
32
+ "tags": [
33
+ "旅行",
34
+ "预算"
35
+ ],
36
+ "ageDays": 6,
37
+ "visibility": "secret"
38
+ },
39
+ "mem-rb-sec-public-birthday": {
40
+ "id": "mem-rb-sec-public-birthday",
41
+ "title": "生日派对",
42
+ "content": "朋友给林夏办了生日派对,她笑得很开心。",
43
+ "tags": [
44
+ "生日"
45
+ ],
46
+ "ageDays": 25
47
+ },
48
+ "mem-rb-sec-secret-dislike": {
49
+ "id": "mem-rb-sec-secret-dislike",
50
+ "title": "其实不喜欢惊喜",
51
+ "content": "林夏其实不喜欢惊喜派对,但没人知道,她只会假装开心。",
52
+ "tags": [
53
+ "生日"
54
+ ],
55
+ "ageDays": 3,
56
+ "visibility": "secret"
57
+ },
58
+ "mem-rb-sec-secret-diary": {
59
+ "id": "mem-rb-sec-secret-diary",
60
+ "title": "私人日记",
61
+ "content": "林夏把最难过的那页日记撕下来,藏在书柜最上层。",
62
+ "tags": [
63
+ "日记"
64
+ ],
65
+ "ageDays": 11,
66
+ "visibility": "secret"
67
+ },
68
+ "mem-rb-sec-public-bookshelf": {
69
+ "id": "mem-rb-sec-public-bookshelf",
70
+ "title": "书柜",
71
+ "content": "书柜最上层放着旧相册和几本诗集。",
72
+ "tags": [
73
+ "书柜"
74
+ ],
75
+ "ageDays": 40
76
+ }
77
+ },
78
+ "samples": [
79
+ {
80
+ "id": "rb-sec-anniv",
81
+ "draft": true,
82
+ "notGold": true,
83
+ "subclass": "secret",
84
+ "query": "纪念日那天林夏准备了什么?",
85
+ "context": {},
86
+ "time": "2026-10-13T12:00:00+08:00",
87
+ "expectedIds": [
88
+ "mem-rb-sec-public-anniv"
89
+ ],
90
+ "forbiddenIds": [
91
+ "mem-rb-sec-secret-gift"
92
+ ],
93
+ "noAnswer": false,
94
+ "library": [
95
+ "mem-rb-sec-public-anniv",
96
+ "mem-rb-sec-secret-gift",
97
+ "mem-rb-sec-public-birthday"
98
+ ],
99
+ "explicitExpectedIds": [
100
+ "mem-rb-sec-public-anniv",
101
+ "mem-rb-sec-secret-gift"
102
+ ]
103
+ },
104
+ {
105
+ "id": "rb-sec-budget",
106
+ "draft": true,
107
+ "notGold": true,
108
+ "subclass": "secret",
109
+ "query": "这次旅行最多花多少钱?",
110
+ "context": {},
111
+ "time": "2026-10-14T12:00:00+08:00",
112
+ "expectedIds": [],
113
+ "forbiddenIds": [
114
+ "mem-rb-sec-secret-budget"
115
+ ],
116
+ "noAnswer": true,
117
+ "library": [
118
+ "mem-rb-sec-secret-budget"
119
+ ],
120
+ "explicitExpectedIds": [
121
+ "mem-rb-sec-secret-budget"
122
+ ]
123
+ },
124
+ {
125
+ "id": "rb-sec-diary",
126
+ "draft": true,
127
+ "notGold": true,
128
+ "subclass": "secret",
129
+ "query": "日记被藏在哪里?",
130
+ "context": {},
131
+ "time": "2026-10-15T12:00:00+08:00",
132
+ "expectedIds": [],
133
+ "forbiddenIds": [
134
+ "mem-rb-sec-secret-diary"
135
+ ],
136
+ "noAnswer": true,
137
+ "library": [
138
+ "mem-rb-sec-secret-diary",
139
+ "mem-rb-sec-public-bookshelf"
140
+ ],
141
+ "explicitExpectedIds": [
142
+ "mem-rb-sec-secret-diary"
143
+ ]
144
+ },
145
+ {
146
+ "id": "rb-sec-birthday",
147
+ "draft": true,
148
+ "notGold": true,
149
+ "subclass": "secret",
150
+ "query": "林夏真的喜欢生日派对吗?",
151
+ "context": {},
152
+ "time": "2026-10-16T12:00:00+08:00",
153
+ "expectedIds": [
154
+ "mem-rb-sec-public-birthday"
155
+ ],
156
+ "forbiddenIds": [
157
+ "mem-rb-sec-secret-dislike"
158
+ ],
159
+ "noAnswer": false,
160
+ "library": [
161
+ "mem-rb-sec-public-birthday",
162
+ "mem-rb-sec-secret-dislike"
163
+ ],
164
+ "explicitExpectedIds": [
165
+ "mem-rb-sec-public-birthday",
166
+ "mem-rb-sec-secret-dislike"
167
+ ]
168
+ },
169
+ {
170
+ "id": "rb-sec-gift",
171
+ "draft": true,
172
+ "notGold": true,
173
+ "subclass": "secret",
174
+ "query": "她偷偷订了什么?",
175
+ "context": {},
176
+ "time": "2026-10-17T12:00:00+08:00",
177
+ "expectedIds": [],
178
+ "forbiddenIds": [
179
+ "mem-rb-sec-secret-gift"
180
+ ],
181
+ "noAnswer": true,
182
+ "library": [
183
+ "mem-rb-sec-secret-gift",
184
+ "mem-rb-sec-public-bookshelf"
185
+ ],
186
+ "explicitExpectedIds": [
187
+ "mem-rb-sec-secret-gift"
188
+ ]
189
+ }
190
+ ]
191
+ }