dsh-memu-memory 1.1.3 → 1.2.1

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 (184) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +39 -6
  3. package/README.zh.md +39 -7
  4. package/docs/active-memory-ab.md +385 -0
  5. package/docs/binding-lifecycle.md +99 -0
  6. package/docs/contributing.md +3 -3
  7. package/docs/emotion-model-spec.md +281 -0
  8. package/docs/env-and-commands.md +8 -0
  9. package/docs/host-api.md +2 -2
  10. package/docs/memory-semantics.md +12 -10
  11. package/docs/recall-benchmark.md +238 -0
  12. package/docs/troubleshooting.md +396 -395
  13. package/lib/active-memory.js +165 -0
  14. package/lib/activity-log.js +23 -6
  15. package/lib/binding-diagnostics.js +8 -3
  16. package/lib/client.js +335 -35
  17. package/lib/consolidation-ledger.js +347 -0
  18. package/lib/consolidation-receipt.js +284 -0
  19. package/lib/consolidation-snapshot.js +274 -0
  20. package/lib/consolidation-worker.js +144 -0
  21. package/lib/curator.js +86 -31
  22. package/lib/cycle.js +40 -6
  23. package/lib/graph.js +139 -5
  24. package/lib/index.js +33 -1
  25. package/lib/inject.js +104 -76
  26. package/lib/local-embedding-manager.js +24 -6
  27. package/lib/memory.js +534 -88
  28. package/lib/mood.js +268 -39
  29. package/lib/preset-scope.js +1 -1
  30. package/lib/private.js +430 -43
  31. package/lib/prompts/private-consolidation.coding.md +1 -0
  32. package/lib/prompts/private-consolidation.md +1 -0
  33. package/lib/prompts/private-consolidation.mixed.md +1 -0
  34. package/lib/prompts/private-consolidation.rp.md +1 -0
  35. package/lib/prompts.js +4 -4
  36. package/lib/remote-summary.js +51 -25
  37. package/lib/rpc.js +54 -5
  38. package/lib/state.js +29 -12
  39. package/lib/text-similarity.js +106 -0
  40. package/lib/tools.js +113 -10
  41. package/lib/vector-migration.js +28 -3
  42. package/lib/vector-profile.js +51 -0
  43. package/package.json +4 -2
  44. package/scripts/acceptance-local.mjs +2 -1
  45. package/scripts/active-memory-ab-live.mjs +655 -0
  46. package/scripts/active-memory-ab.mjs +1302 -0
  47. package/scripts/chain-matrix.mjs +11 -1
  48. package/scripts/check-all.mjs +10 -1
  49. package/scripts/replay.mjs +573 -0
  50. package/tests/activation.test.mjs +89 -0
  51. package/tests/active-memory-ab.test.mjs +745 -0
  52. package/tests/active-memory.test.mjs +129 -0
  53. package/tests/activity-log.test.mjs +126 -0
  54. package/tests/activity-wiring.test.mjs +103 -0
  55. package/tests/appendix-b.test.mjs +216 -0
  56. package/tests/appendix-b2.test.mjs +166 -0
  57. package/tests/audit-regression.test.mjs +272 -0
  58. package/tests/audit-safety.test.mjs +227 -0
  59. package/tests/backend-compensation.test.mjs +272 -0
  60. package/tests/backup.test.mjs +793 -0
  61. package/tests/binding-diagnostics.test.mjs +720 -0
  62. package/tests/browser.test.mjs +366 -0
  63. package/tests/client-render.test.mjs +892 -0
  64. package/tests/coalesce.test.mjs +113 -0
  65. package/tests/config.test.mjs +159 -0
  66. package/tests/consolidation-credential.test.mjs +331 -0
  67. package/tests/consolidation-feed.test.mjs +96 -0
  68. package/tests/consolidation-fork.test.mjs +489 -0
  69. package/tests/consolidation-ledger.test.mjs +298 -0
  70. package/tests/consolidation-snapshot.test.mjs +360 -0
  71. package/tests/consolidation-value.test.mjs +89 -0
  72. package/tests/context-scope.test.mjs +40 -0
  73. package/tests/cue.test.mjs +44 -0
  74. package/tests/curator-commit.test.mjs +277 -0
  75. package/tests/curator-probe.test.mjs +433 -0
  76. package/tests/curator.test.mjs +150 -0
  77. package/tests/cycle.test.mjs +411 -0
  78. package/tests/disclosure.test.mjs +231 -0
  79. package/tests/doc-drift.test.mjs +222 -0
  80. package/tests/embedding-catalog.test.mjs +266 -0
  81. package/tests/embedding-download.test.mjs +391 -0
  82. package/tests/embedding-runtime.test.mjs +389 -0
  83. package/tests/emotion-chain.test.mjs +84 -0
  84. package/tests/emotion-contract.test.mjs +445 -0
  85. package/tests/engine.test.mjs +35 -0
  86. package/tests/fixtures/active-memory-ab/README.md +56 -0
  87. package/tests/fixtures/active-memory-ab/cases/01-clean-dense-turn.json +351 -0
  88. package/tests/fixtures/active-memory-ab/cases/02-clean-thin-turn.json +122 -0
  89. package/tests/fixtures/active-memory-ab/cases/03-clean-starved-small.json +125 -0
  90. package/tests/fixtures/active-memory-ab/cases/04-clean-large-thin.json +137 -0
  91. package/tests/fixtures/active-memory-ab/cases/05-clean-half-step.json +166 -0
  92. package/tests/fixtures/active-memory-ab/cases/06-clean-duplicate-reread.json +197 -0
  93. package/tests/fixtures/active-memory-ab/cases/07-clean-recent-recall.json +125 -0
  94. package/tests/fixtures/active-memory-ab/cases/08-global-relevant.json +111 -0
  95. package/tests/fixtures/active-memory-ab/cases/09-global-irrelevant-conflict.json +158 -0
  96. package/tests/fixtures/active-memory-ab/cases/10-no-human-turn.json +97 -0
  97. package/tests/fixtures/active-memory-ab/cases/11-clean-scale-100.json +137 -0
  98. package/tests/fixtures/active-memory-ab/cases/12-clean-scale-1000.json +137 -0
  99. package/tests/fixtures/active-memory-ab/cases/13-clean-scale-5000.json +137 -0
  100. package/tests/fixtures/active-memory-ab/cases/14-clean-scale-20000.json +137 -0
  101. package/tests/fixtures/active-memory-ab/lead-ai-reviewed-reference.json +191 -0
  102. package/tests/fixtures/active-memory-ab/manifest.json +199 -0
  103. package/tests/fixtures/recall-bench/01-paraphrase.json +184 -0
  104. package/tests/fixtures/recall-bench/02-exact.json +153 -0
  105. package/tests/fixtures/recall-bench/03-negation.json +173 -0
  106. package/tests/fixtures/recall-bench/04-no-answer.json +162 -0
  107. package/tests/fixtures/recall-bench/05-conflict.json +194 -0
  108. package/tests/fixtures/recall-bench/06-boundary.json +273 -0
  109. package/tests/fixtures/recall-bench/07-secret.json +191 -0
  110. package/tests/fixtures/recall-bench/08-coding.json +164 -0
  111. package/tests/fixtures/recall-bench-gold-candidates/01-paraphrase.json +193 -0
  112. package/tests/fixtures/recall-bench-gold-candidates/02-exact.json +197 -0
  113. package/tests/fixtures/recall-bench-gold-candidates/03-negation.json +244 -0
  114. package/tests/fixtures/recall-bench-gold-candidates/04-no-answer.json +189 -0
  115. package/tests/fixtures/recall-bench-gold-candidates/05-conflict.json +245 -0
  116. package/tests/fixtures/recall-bench-gold-candidates/06-boundary.json +279 -0
  117. package/tests/fixtures/recall-bench-gold-candidates/07-secret.json +224 -0
  118. package/tests/fixtures/recall-bench-gold-candidates/08-coding.json +218 -0
  119. package/tests/fixtures/repetition-eval/01-zh-rp.json +93 -0
  120. package/tests/fixtures/repetition-eval/02-en.json +97 -0
  121. package/tests/fixtures/repetition-eval/03-code.json +91 -0
  122. package/tests/fixtures/repetition-eval/04-names.json +116 -0
  123. package/tests/fixtures/repetition-eval/05-user-quote.json +96 -0
  124. package/tests/fixtures/repetition-eval/06-agreement.json +86 -0
  125. package/tests/graph-cascade.test.mjs +190 -0
  126. package/tests/graph-view.test.mjs +187 -0
  127. package/tests/graph.test.mjs +94 -0
  128. package/tests/hook-order.test.mjs +72 -0
  129. package/tests/humanlike.test.mjs +232 -0
  130. package/tests/hybrid-recall.test.mjs +122 -0
  131. package/tests/inbound.test.mjs +393 -0
  132. package/tests/inject-guide.test.mjs +364 -0
  133. package/tests/inject.test.mjs +222 -0
  134. package/tests/injection-budget-settings.test.mjs +35 -0
  135. package/tests/injection-budget.test.mjs +64 -0
  136. package/tests/injection-chain.test.mjs +191 -0
  137. package/tests/loader-register.mjs +3 -0
  138. package/tests/loader.mjs +12 -0
  139. package/tests/local-embedding-entry.test.mjs +95 -0
  140. package/tests/local-embedding-manager.test.mjs +476 -0
  141. package/tests/local-embedding-protocol.test.mjs +95 -0
  142. package/tests/local-embedding-worker.test.mjs +346 -0
  143. package/tests/managed-memory.test.mjs +591 -0
  144. package/tests/managed-runtime.test.mjs +40 -0
  145. package/tests/media.test.mjs +132 -0
  146. package/tests/migration-payload.test.mjs +42 -0
  147. package/tests/mood.test.mjs +109 -0
  148. package/tests/multiprocess.test.mjs +29 -0
  149. package/tests/new-session-gate.test.mjs +361 -0
  150. package/tests/package-shipping.test.mjs +84 -0
  151. package/tests/preset-scope.test.mjs +212 -0
  152. package/tests/prompts.test.mjs +250 -0
  153. package/tests/react-snapshot.test.mjs +23 -0
  154. package/tests/recall-bench.test.mjs +306 -0
  155. package/tests/recall-dedup.test.mjs +417 -0
  156. package/tests/remote.test.mjs +140 -0
  157. package/tests/rename.test.mjs +30 -0
  158. package/tests/repetition-detector-snapshot.test.mjs +231 -0
  159. package/tests/repetition-eval-live.test.mjs +177 -0
  160. package/tests/repetition-eval.test.mjs +373 -0
  161. package/tests/salient-date.test.mjs +142 -0
  162. package/tests/settings-beat.test.mjs +221 -0
  163. package/tests/short-term.test.mjs +166 -0
  164. package/tests/sidebar-beat.test.mjs +212 -0
  165. package/tests/sidebar-refresh.test.mjs +123 -0
  166. package/tests/sidebar.test.mjs +70 -0
  167. package/tests/snippet.test.mjs +47 -0
  168. package/tests/source-kind.test.mjs +52 -0
  169. package/tests/state.test.mjs +150 -0
  170. package/tests/stats.test.mjs +112 -0
  171. package/tests/storage.test.mjs +125 -0
  172. package/tests/stubs/dsh-llm.js +5 -0
  173. package/tests/stubs/dsh-session.js +7 -0
  174. package/tests/stubs/dsh-tools.js +101 -0
  175. package/tests/tool-schema.test.mjs +73 -0
  176. package/tests/tools.test.mjs +184 -0
  177. package/tests/ui-defaults.test.mjs +57 -0
  178. package/tests/update-fields.test.mjs +138 -0
  179. package/tests/vector-migration.test.mjs +790 -0
  180. package/tests/vector-profile.test.mjs +425 -0
  181. package/tests/visibility-migration.test.mjs +152 -0
  182. package/tests/webui-auth.test.mjs +454 -0
  183. package/tests/webui.test.mjs +165 -0
  184. package/tests/windows-env.test.mjs +89 -0
@@ -0,0 +1,218 @@
1
+ {
2
+ "name": "coding — 人工金标候选(待审核)",
3
+ "status": "gold-candidate-pending-review",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "gold": false,
7
+ "review": "pending",
8
+ "subclass": "coding",
9
+ "notes": "候选样本,尚未经过人工逐条确认,不是 gold set。少量工程约束,用于防止跨域召回退化。",
10
+ "entries": {
11
+ "mem-gcc-code-date": {
12
+ "id": "mem-gcc-code-date",
13
+ "title": "日期格式",
14
+ "content": "新接口的日期统一用 ISO 8601 UTC 字符串,例如 2026-10-29T00:00:00Z,不要传本地时间。",
15
+ "tags": [
16
+ "api",
17
+ "date"
18
+ ],
19
+ "ageDays": 9
20
+ },
21
+ "mem-gcc-code-migrate": {
22
+ "id": "mem-gcc-code-migrate",
23
+ "title": "迁移目录",
24
+ "content": "数据库迁移脚本放在 db/migrations,文件名用时间戳加描述。",
25
+ "tags": [
26
+ "database",
27
+ "migration"
28
+ ],
29
+ "ageDays": 12
30
+ },
31
+ "mem-gcc-code-log": {
32
+ "id": "mem-gcc-code-log",
33
+ "title": "日志脱敏",
34
+ "content": "日志里不能打印 access token、refresh token 和用户手机号,只保留请求 id。",
35
+ "tags": [
36
+ "logging",
37
+ "security"
38
+ ],
39
+ "ageDays": 18
40
+ },
41
+ "mem-gcc-code-retry": {
42
+ "id": "mem-gcc-code-retry",
43
+ "title": "请求重试",
44
+ "content": "前端请求失败最多重试两次,间隔 300ms 和 900ms,不做无限重试。",
45
+ "tags": [
46
+ "frontend",
47
+ "retry"
48
+ ],
49
+ "ageDays": 20
50
+ },
51
+ "mem-gcc-code-verify": {
52
+ "id": "mem-gcc-code-verify",
53
+ "title": "提交前命令",
54
+ "content": "提交前必须跑 npm run verify,它会执行 lint、类型检查和单测。",
55
+ "tags": [
56
+ "workflow",
57
+ "test"
58
+ ],
59
+ "ageDays": 7
60
+ },
61
+ "mem-gcc-code-feature": {
62
+ "id": "mem-gcc-code-feature",
63
+ "title": "功能开关",
64
+ "content": "新功能默认关,通过 featureFlags.newRecall 控制,灰度到 10% 再全量。",
65
+ "tags": [
66
+ "feature-flag"
67
+ ],
68
+ "ageDays": 25
69
+ },
70
+ "mem-gcc-code-error": {
71
+ "id": "mem-gcc-code-error",
72
+ "title": "错误码",
73
+ "content": "业务错误码固定五位,前两位是模块编号,后三位是错误序号。",
74
+ "tags": [
75
+ "api",
76
+ "error"
77
+ ],
78
+ "ageDays": 30
79
+ },
80
+ "mem-gcc-code-commit": {
81
+ "id": "mem-gcc-code-commit",
82
+ "title": "提交信息",
83
+ "content": "提交信息用 conventional commits,scope 写模块名,不写句号。",
84
+ "tags": [
85
+ "git",
86
+ "commit"
87
+ ],
88
+ "ageDays": 5
89
+ }
90
+ },
91
+ "samples": [
92
+ {
93
+ "id": "gcc-code-date",
94
+ "status": "gold-candidate-pending-review",
95
+ "draft": true,
96
+ "notGold": true,
97
+ "gold": false,
98
+ "review": "pending",
99
+ "subclass": "coding",
100
+ "query": "新接口的日期字段该传什么格式?",
101
+ "context": {},
102
+ "time": "2026-10-07T12:00:00+08:00",
103
+ "expectedIds": [
104
+ "mem-gcc-code-date"
105
+ ],
106
+ "forbiddenIds": [
107
+ "mem-gcc-code-migrate"
108
+ ],
109
+ "noAnswer": false,
110
+ "library": [
111
+ "mem-gcc-code-date",
112
+ "mem-gcc-code-migrate",
113
+ "mem-gcc-code-error",
114
+ "mem-gcc-code-commit"
115
+ ]
116
+ },
117
+ {
118
+ "id": "gcc-code-migrate",
119
+ "status": "gold-candidate-pending-review",
120
+ "draft": true,
121
+ "notGold": true,
122
+ "gold": false,
123
+ "review": "pending",
124
+ "subclass": "coding",
125
+ "query": "数据库迁移脚本放在哪个目录?",
126
+ "context": {},
127
+ "time": "2026-10-08T12:00:00+08:00",
128
+ "expectedIds": [
129
+ "mem-gcc-code-migrate"
130
+ ],
131
+ "forbiddenIds": [
132
+ "mem-gcc-code-feature"
133
+ ],
134
+ "noAnswer": false,
135
+ "library": [
136
+ "mem-gcc-code-migrate",
137
+ "mem-gcc-code-log",
138
+ "mem-gcc-code-verify",
139
+ "mem-gcc-code-feature"
140
+ ]
141
+ },
142
+ {
143
+ "id": "gcc-code-retry",
144
+ "status": "gold-candidate-pending-review",
145
+ "draft": true,
146
+ "notGold": true,
147
+ "gold": false,
148
+ "review": "pending",
149
+ "subclass": "coding",
150
+ "query": "请求失败最多重试几次,间隔多久?",
151
+ "context": {},
152
+ "time": "2026-10-09T12:00:00+08:00",
153
+ "expectedIds": [
154
+ "mem-gcc-code-retry"
155
+ ],
156
+ "forbiddenIds": [
157
+ "mem-gcc-code-commit"
158
+ ],
159
+ "noAnswer": false,
160
+ "library": [
161
+ "mem-gcc-code-retry",
162
+ "mem-gcc-code-date",
163
+ "mem-gcc-code-feature",
164
+ "mem-gcc-code-commit"
165
+ ]
166
+ },
167
+ {
168
+ "id": "gcc-code-verify",
169
+ "status": "gold-candidate-pending-review",
170
+ "draft": true,
171
+ "notGold": true,
172
+ "gold": false,
173
+ "review": "pending",
174
+ "subclass": "coding",
175
+ "query": "提交前必须跑哪个命令?",
176
+ "context": {},
177
+ "time": "2026-10-10T12:00:00+08:00",
178
+ "expectedIds": [
179
+ "mem-gcc-code-verify"
180
+ ],
181
+ "forbiddenIds": [
182
+ "mem-gcc-code-log"
183
+ ],
184
+ "noAnswer": false,
185
+ "library": [
186
+ "mem-gcc-code-verify",
187
+ "mem-gcc-code-log",
188
+ "mem-gcc-code-retry",
189
+ "mem-gcc-code-error"
190
+ ]
191
+ },
192
+ {
193
+ "id": "gcc-code-log",
194
+ "status": "gold-candidate-pending-review",
195
+ "draft": true,
196
+ "notGold": true,
197
+ "gold": false,
198
+ "review": "pending",
199
+ "subclass": "coding",
200
+ "query": "日志里哪些字段必须脱敏?",
201
+ "context": {},
202
+ "time": "2026-10-11T12:00:00+08:00",
203
+ "expectedIds": [
204
+ "mem-gcc-code-log"
205
+ ],
206
+ "forbiddenIds": [
207
+ "mem-gcc-code-error"
208
+ ],
209
+ "noAnswer": false,
210
+ "library": [
211
+ "mem-gcc-code-log",
212
+ "mem-gcc-code-error",
213
+ "mem-gcc-code-verify",
214
+ "mem-gcc-code-migrate"
215
+ ]
216
+ }
217
+ ]
218
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "repetition-eval-dialogue",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "window": 4,
7
+ "id": "zh-rp-baseline",
8
+ "pairId": "zh-rp",
9
+ "category": "zh-rp",
10
+ "condition": "baseline",
11
+ "description": "中文 RP:重复叙述套话 vs 姓名、用户原话与事实结论。",
12
+ "turns": [
13
+ {
14
+ "role": "user",
15
+ "text": "外面在下雨。林眠把铜钥匙放在门垫下,说雨停之前别回头。"
16
+ },
17
+ {
18
+ "role": "assistant",
19
+ "text": "林眠没有立刻回答。她轻轻叹了口气,眼底闪过一丝复杂的神色,只把铜钥匙推到桌角。"
20
+ },
21
+ {
22
+ "role": "user",
23
+ "text": "你为什么把钥匙留下?"
24
+ },
25
+ {
26
+ "role": "assistant",
27
+ "text": "林眠轻轻叹了口气,眼底闪过一丝复杂的神色,说铜钥匙一直在门垫下,雨停之前别回头。"
28
+ },
29
+ {
30
+ "role": "user",
31
+ "text": "那你自己呢?"
32
+ },
33
+ {
34
+ "role": "assistant",
35
+ "text": "林眠轻轻叹了口气,眼底闪过一丝复杂的神色,望向窗外,没有说自己会不会留下。"
36
+ }
37
+ ],
38
+ "labels": {
39
+ "necessaryPhrases": [
40
+ {
41
+ "text": "林眠",
42
+ "category": "name",
43
+ "turn": 1
44
+ },
45
+ {
46
+ "text": "铜钥匙",
47
+ "category": "fact",
48
+ "turn": 1
49
+ },
50
+ {
51
+ "text": "林眠",
52
+ "category": "name",
53
+ "turn": 3
54
+ },
55
+ {
56
+ "text": "铜钥匙",
57
+ "category": "fact",
58
+ "turn": 3
59
+ },
60
+ {
61
+ "text": "雨停之前别回头",
62
+ "category": "user-quote",
63
+ "turn": 3
64
+ },
65
+ {
66
+ "text": "林眠",
67
+ "category": "name",
68
+ "turn": 5
69
+ }
70
+ ],
71
+ "facts": [
72
+ {
73
+ "id": "zh-rp-f1",
74
+ "turn": 1,
75
+ "requiredTerms": [
76
+ "铜钥匙",
77
+ "桌角"
78
+ ],
79
+ "description": "铜钥匙被推到桌角"
80
+ },
81
+ {
82
+ "id": "zh-rp-f2",
83
+ "turn": 3,
84
+ "requiredTerms": [
85
+ "铜钥匙",
86
+ "门垫下",
87
+ "雨停之前别回头"
88
+ ],
89
+ "description": "钥匙位置与用户原话"
90
+ }
91
+ ]
92
+ }
93
+ }
@@ -0,0 +1,97 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "repetition-eval-dialogue",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "window": 4,
7
+ "id": "en-baseline",
8
+ "pairId": "en",
9
+ "category": "en",
10
+ "condition": "baseline",
11
+ "description": "English: repeated atmospheric filler vs name, quote, agreement and facts.",
12
+ "turns": [
13
+ {
14
+ "role": "user",
15
+ "text": "Mara, meet at the lighthouse at dusk. Don't open the blue door until I arrive."
16
+ },
17
+ {
18
+ "role": "assistant",
19
+ "text": "Mara nodded. A quiet sense of dread settled over the room, and the rain kept falling against the glass."
20
+ },
21
+ {
22
+ "role": "user",
23
+ "text": "Did you check the door?"
24
+ },
25
+ {
26
+ "role": "assistant",
27
+ "text": "A quiet sense of dread settled over the room. The rain kept falling. Mara promised, \"Meet at the lighthouse at dusk,\" then repeated, \"Don't open the blue door.\""
28
+ },
29
+ {
30
+ "role": "user",
31
+ "text": "What about the lighthouse?"
32
+ },
33
+ {
34
+ "role": "assistant",
35
+ "text": "Mara checked the lock, then went home. She said nothing about the letter."
36
+ }
37
+ ],
38
+ "labels": {
39
+ "necessaryPhrases": [
40
+ {
41
+ "text": "Mara",
42
+ "category": "name",
43
+ "turn": 1
44
+ },
45
+ {
46
+ "text": "Mara",
47
+ "category": "name",
48
+ "turn": 3
49
+ },
50
+ {
51
+ "text": "Meet at the lighthouse at dusk",
52
+ "category": "agreement",
53
+ "turn": 3
54
+ },
55
+ {
56
+ "text": "Don't open the blue door",
57
+ "category": "user-quote",
58
+ "turn": 3
59
+ },
60
+ {
61
+ "text": "Mara",
62
+ "category": "name",
63
+ "turn": 5
64
+ }
65
+ ],
66
+ "facts": [
67
+ {
68
+ "id": "en-f1",
69
+ "turn": 1,
70
+ "requiredTerms": [
71
+ "nodded",
72
+ "rain",
73
+ "glass"
74
+ ],
75
+ "description": "Mara nodded; rain against the glass"
76
+ },
77
+ {
78
+ "id": "en-f2",
79
+ "turn": 3,
80
+ "requiredTerms": [
81
+ "blue door",
82
+ "lighthouse"
83
+ ],
84
+ "description": "The door and the lighthouse are both named"
85
+ },
86
+ {
87
+ "id": "en-f3",
88
+ "turn": 5,
89
+ "requiredTerms": [
90
+ "lock",
91
+ "letter"
92
+ ],
93
+ "description": "Lock checked; letter not discussed"
94
+ }
95
+ ]
96
+ }
97
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "repetition-eval-dialogue",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "window": 4,
7
+ "id": "code-baseline",
8
+ "pairId": "code",
9
+ "category": "code",
10
+ "condition": "baseline",
11
+ "description": "Code explanation: repeated filler vs code identifiers and factual diagnosis.",
12
+ "turns": [
13
+ {
14
+ "role": "user",
15
+ "text": "Why does parseConfig return the wrong port for the staging profile?"
16
+ },
17
+ {
18
+ "role": "assistant",
19
+ "text": "As you can see, the parser reads the default before the profile override. `parseConfig` returns `config.port` from the base object."
20
+ },
21
+ {
22
+ "role": "user",
23
+ "text": "Can you show the smallest fix?"
24
+ },
25
+ {
26
+ "role": "assistant",
27
+ "text": "As you can see, the override must be applied after the defaults. The function should merge the profile before reading the port.\n```js\nexport function parseConfig(raw) {\n const base = JSON.parse(raw)\n return { ...base, port: base.port }\n}\n```"
28
+ },
29
+ {
30
+ "role": "user",
31
+ "text": "Why is the port still wrong?"
32
+ },
33
+ {
34
+ "role": "assistant",
35
+ "text": "As you can see, `parseConfig` still returns the base port because the profile is never merged. If callers only read the result, keep it typed as `ReadOnlyMap`."
36
+ }
37
+ ],
38
+ "labels": {
39
+ "necessaryPhrases": [
40
+ {
41
+ "text": "parseConfig",
42
+ "category": "code-identifier",
43
+ "turn": 1
44
+ },
45
+ {
46
+ "text": "parseConfig",
47
+ "category": "code-identifier",
48
+ "turn": 3
49
+ },
50
+ {
51
+ "text": "parseConfig",
52
+ "category": "code-identifier",
53
+ "turn": 5
54
+ },
55
+ {
56
+ "text": "ReadOnlyMap",
57
+ "category": "code-identifier",
58
+ "turn": 5
59
+ }
60
+ ],
61
+ "facts": [
62
+ {
63
+ "id": "code-f1",
64
+ "turn": 1,
65
+ "requiredTerms": [
66
+ "default",
67
+ "profile override"
68
+ ],
69
+ "description": "Default read before profile override"
70
+ },
71
+ {
72
+ "id": "code-f2",
73
+ "turn": 3,
74
+ "requiredTerms": [
75
+ "override",
76
+ "defaults"
77
+ ],
78
+ "description": "Override after defaults"
79
+ },
80
+ {
81
+ "id": "code-f3",
82
+ "turn": 5,
83
+ "requiredTerms": [
84
+ "base port",
85
+ "profile"
86
+ ],
87
+ "description": "Profile never merged; base port returned"
88
+ }
89
+ ]
90
+ }
91
+ }
@@ -0,0 +1,116 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "repetition-eval-dialogue",
4
+ "draft": true,
5
+ "notGold": true,
6
+ "window": 4,
7
+ "id": "names-baseline",
8
+ "pairId": "names",
9
+ "category": "names",
10
+ "condition": "baseline",
11
+ "description": "中文姓名:姓名必须反复出现,叙述套话才算复读。",
12
+ "turns": [
13
+ {
14
+ "role": "user",
15
+ "text": "沈砚和周晚第一次见面是在医院走廊。"
16
+ },
17
+ {
18
+ "role": "assistant",
19
+ "text": "沈砚没有看周晚,只把病历合上。他沉默了片刻,才说周晚不该来这里。"
20
+ },
21
+ {
22
+ "role": "user",
23
+ "text": "他们以前认识吗?"
24
+ },
25
+ {
26
+ "role": "assistant",
27
+ "text": "沈砚记得,周晚以前来过这家医院。他沉默了片刻,把病历推到周晚面前。"
28
+ },
29
+ {
30
+ "role": "user",
31
+ "text": "病历上写了什么?"
32
+ },
33
+ {
34
+ "role": "assistant",
35
+ "text": "沈砚没有回答。他沉默了片刻,看向周晚,说病历上只有日期。"
36
+ }
37
+ ],
38
+ "labels": {
39
+ "necessaryPhrases": [
40
+ {
41
+ "text": "沈砚",
42
+ "category": "name",
43
+ "turn": 1
44
+ },
45
+ {
46
+ "text": "周晚",
47
+ "category": "name",
48
+ "turn": 1
49
+ },
50
+ {
51
+ "text": "病历",
52
+ "category": "fact",
53
+ "turn": 1
54
+ },
55
+ {
56
+ "text": "沈砚",
57
+ "category": "name",
58
+ "turn": 3
59
+ },
60
+ {
61
+ "text": "周晚",
62
+ "category": "name",
63
+ "turn": 3
64
+ },
65
+ {
66
+ "text": "病历",
67
+ "category": "fact",
68
+ "turn": 3
69
+ },
70
+ {
71
+ "text": "沈砚",
72
+ "category": "name",
73
+ "turn": 5
74
+ },
75
+ {
76
+ "text": "周晚",
77
+ "category": "name",
78
+ "turn": 5
79
+ },
80
+ {
81
+ "text": "病历",
82
+ "category": "fact",
83
+ "turn": 5
84
+ }
85
+ ],
86
+ "facts": [
87
+ {
88
+ "id": "names-f1",
89
+ "turn": 1,
90
+ "requiredTerms": [
91
+ "病历",
92
+ "合上"
93
+ ],
94
+ "description": "病历被合上"
95
+ },
96
+ {
97
+ "id": "names-f2",
98
+ "turn": 3,
99
+ "requiredTerms": [
100
+ "医院",
101
+ "病历"
102
+ ],
103
+ "description": "医院与病历"
104
+ },
105
+ {
106
+ "id": "names-f3",
107
+ "turn": 5,
108
+ "requiredTerms": [
109
+ "病历",
110
+ "日期"
111
+ ],
112
+ "description": "病历上只有日期"
113
+ }
114
+ ]
115
+ }
116
+ }