pmem-ai 0.6.0 → 0.6.2
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 +49 -0
- package/README.md +11 -9
- package/dist/commands/distill.js +1 -1
- package/dist/commands/distill.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +15 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/integration.d.ts.map +1 -1
- package/dist/commands/integration.js +57 -3
- package/dist/commands/integration.js.map +1 -1
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +117 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/rebuild.d.ts.map +1 -1
- package/dist/commands/rebuild.js +27 -1
- package/dist/commands/rebuild.js.map +1 -1
- package/dist/commands/recall.d.ts +1 -1
- package/dist/commands/recall.d.ts.map +1 -1
- package/dist/commands/recall.js +34 -3
- package/dist/commands/recall.js.map +1 -1
- package/dist/commands/rename.d.ts +6 -0
- package/dist/commands/rename.d.ts.map +1 -0
- package/dist/commands/rename.js +177 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +335 -133
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +61 -39
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/consistency.d.ts +10 -0
- package/dist/core/consistency.d.ts.map +1 -0
- package/dist/core/consistency.js +97 -0
- package/dist/core/consistency.js.map +1 -0
- package/dist/core/db.d.ts +9 -0
- package/dist/core/db.d.ts.map +1 -1
- package/dist/core/db.js +4 -0
- package/dist/core/db.js.map +1 -1
- package/dist/core/fs.d.ts +6 -0
- package/dist/core/fs.d.ts.map +1 -1
- package/dist/core/fs.js +32 -2
- package/dist/core/fs.js.map +1 -1
- package/dist/core/manifest.js +1 -1
- package/dist/core/manifest.js.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/handover-v0.4.md +2 -0
- package/docs/handover-v0.6.md +152 -0
- package/docs/project-roadmap.md +42 -5
- package/docs/usage.md +13 -14
- package/docs/v0.4 pre-design.md +2 -0
- package/docs/v0.5 pre-design.md +2 -0
- package/docs/v0.6 pre-design.md +2 -0
- package/docs/v0.6.1 pre-design.md +566 -0
- package/docs/v0.6.2 pre-design.md +657 -0
- package/package.json +3 -2
- package/skills/pmem/SKILL.md +12 -10
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
# v0.6.1 前置设计决策
|
|
2
|
+
|
|
3
|
+
本文档记录 pmem v0.6.1 开工前的产品与技术决策。v0.6.1 的核心定位:
|
|
4
|
+
|
|
5
|
+
> **Actionable Update Suggestions**
|
|
6
|
+
>
|
|
7
|
+
> v0.6 已经完成 Agent-native Workflow Polish 并发布到 npm (`pmem-ai@0.6.0`)。
|
|
8
|
+
>
|
|
9
|
+
> v0.6.1 不新增大型子系统,不改变 memory schema,不做 embedding、MCP/REST、Graph UI、telemetry 或远程服务。
|
|
10
|
+
> v0.6.1 只解决一个真实使用中暴露出来的急痛点:`pmem update --suggest` 在长期项目里输出过于冗长,重复 dirty flags 和历史建议会让 agent / 用户误判当前记忆仍有问题。
|
|
11
|
+
>
|
|
12
|
+
> v0.6.1 要回答的唯一问题:**pmem 能否把 update suggestions 从“完整事件日志”变成“可行动的当前摘要”,并与 verify 语义保持一致?**
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 一、背景:v0.6 后真实使用反馈
|
|
17
|
+
|
|
18
|
+
用户反馈显示,`pmem update --suggest --format json` 在长期项目中存在信噪比问题:
|
|
19
|
+
|
|
20
|
+
| 现象 | 影响 |
|
|
21
|
+
|------|------|
|
|
22
|
+
| 一个实际工作变更触发大量历史 dirty flags | Agent 难以判断当前任务真正要处理什么 |
|
|
23
|
+
| 同一 card 因同类原因重复出现很多次 | 输出体积膨胀,重复建议掩盖有效建议 |
|
|
24
|
+
| 当前会话项与历史遗留项混杂 | 用户无法快速判断哪些是当前相关 |
|
|
25
|
+
| `--format json` 机器友好但人类调试困难 | 调试时需要手工归并、筛选、推断 |
|
|
26
|
+
| `pmem verify` 已 100/100,但 `update --suggest` 仍有大量建议 | 用户误以为 memory consistency 仍有问题 |
|
|
27
|
+
| dirty flags 缺少过期 / 聚合 / 生命周期 | 长期项目噪声持续累积 |
|
|
28
|
+
|
|
29
|
+
一句话结论:
|
|
30
|
+
|
|
31
|
+
> pmem 当前的记忆一致性能力是有价值的,但 `update --suggest` 缺少去重、分级和生命周期边界,导致长会话 / 多阶段项目里输出会快速膨胀。
|
|
32
|
+
|
|
33
|
+
v0.6.1 的目标是先修输出语义和行动性,不在 patch release 中引入完整 dirty lifecycle 子系统。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 二、v0.6.1 产品目标
|
|
38
|
+
|
|
39
|
+
### 一句话目标
|
|
40
|
+
|
|
41
|
+
> **`pmem update --suggest` 默认展示当前可行动摘要,隐藏重复和历史噪声,并明确区分 verify blocking 问题与非阻塞维护建议。**
|
|
42
|
+
|
|
43
|
+
### 用户对象
|
|
44
|
+
|
|
45
|
+
| 用户 | 需求 |
|
|
46
|
+
|------|------|
|
|
47
|
+
| Code agent | 能从 JSON 中直接判断当前是否需要行动、是否影响 verify、是否只是历史建议 |
|
|
48
|
+
| 项目维护者 | 能用 compact 输出快速看懂当前 dirty 状态 |
|
|
49
|
+
| 调试者 | 能按需查看 history / duplicates,而不是默认被历史噪声淹没 |
|
|
50
|
+
| 长期项目使用者 | 不因旧 dirty flags 反复出现而失去对 pmem 的信任 |
|
|
51
|
+
|
|
52
|
+
### 成功标准
|
|
53
|
+
|
|
54
|
+
1. 同一 `target + reason + matched_file` 的 dirty flag / suggestion 默认聚合展示,并保留 `count`。
|
|
55
|
+
2. suggestions 输出包含 severity 和 verify 相关字段:`blocking | warning | info`、`blocks_verify`。
|
|
56
|
+
3. 默认输出区分 `blocking_for_verify`、`current_suggestions`、`historical_dirty_flags`。
|
|
57
|
+
4. 默认隐藏重复历史项,提供 `--include-history` 查看。
|
|
58
|
+
5. `--format compact` 输出能让人类 10 秒内看懂当前是否需要行动。
|
|
59
|
+
6. `--format json` 输出保留机器可解析结构,不再只是扁平数组。
|
|
60
|
+
7. 当 `pmem verify` 已无 blocking consistency issues 时,`update --suggest` 明确说明没有阻塞项。
|
|
61
|
+
8. 不引入完整 `pmem dirty` 子命令或 dirty lifecycle 状态机;这些进入 v0.6.2。
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 三、范围划分
|
|
66
|
+
|
|
67
|
+
### P0 — v0.6.1 必须完成
|
|
68
|
+
|
|
69
|
+
| # | 功能 | 说明 |
|
|
70
|
+
|---|------|------|
|
|
71
|
+
| 1 | suggestion 去重聚合 | 按 `target + reason + matched_file` 聚合,输出 `count` 和 `sources` |
|
|
72
|
+
| 2 | 输出分级 | 区分 `blocking_for_verify`、`current_suggestions`、`historical_dirty_flags` |
|
|
73
|
+
| 3 | severity 字段 | 每条 suggestion 带 `severity`、`blocks_verify`、`is_historical`、`is_duplicate` |
|
|
74
|
+
| 4 | compact summary | `--format compact` 输出 affected cards、blocking 数、hidden duplicates、hidden history |
|
|
75
|
+
| 5 | JSON 结构化摘要 | `--format json` 输出 `summary` + `groups`,便于 agent 决策 |
|
|
76
|
+
| 6 | `--include-history` | 默认隐藏历史 dirty flags;显式 flag 才展示完整历史组 |
|
|
77
|
+
| 7 | verify/suggest 语义对齐 | 共享 verify 检查逻辑,避免 verify 100/100 时 suggest 看起来仍阻塞 |
|
|
78
|
+
| 8 | E2E 噪声场景 | 构造重复 dirty flags,验证默认输出聚合和隐藏历史 |
|
|
79
|
+
|
|
80
|
+
### P1 — v0.6.1 可选,优先推迟到 v0.6.2
|
|
81
|
+
|
|
82
|
+
| 功能 | 说明 |
|
|
83
|
+
|------|------|
|
|
84
|
+
| `pmem dirty list` | dirty flags 独立查询命令 |
|
|
85
|
+
| `pmem dirty resolve --auto` | 自动标记已解决 dirty flags |
|
|
86
|
+
| `pmem dirty prune --older-than 7d` | 清理历史 dirty flags |
|
|
87
|
+
| 完整 dirty lifecycle | `open / resolved / superseded / ignored / archived` |
|
|
88
|
+
| `--current-session` / `--since-session` | 依赖 dirty lifecycle 和 session 语义,先不做 P0 |
|
|
89
|
+
| auto-cleanup | 依赖 lifecycle 状态机,放到 v0.6.2 |
|
|
90
|
+
|
|
91
|
+
### 明确不做
|
|
92
|
+
|
|
93
|
+
| 不做 | 原因 |
|
|
94
|
+
|------|------|
|
|
95
|
+
| 改变 dirty_flags SQLite schema | v0.6.1 是 patch release,优先复用现有 `resolved_at` |
|
|
96
|
+
| 自动删除历史 flags | 删除是不可逆操作,需 lifecycle 设计支撑 |
|
|
97
|
+
| 新增远程 / 服务化能力 | 与本次反馈无关 |
|
|
98
|
+
| 改变 exit code 协议 | `update --suggest` exit 1 仍表示有建议,不是错误 → **v0.6.2 已变更:exit 1 不再作为 workflow signal** |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 四、输出语义设计
|
|
103
|
+
|
|
104
|
+
### 1. 新核心概念
|
|
105
|
+
|
|
106
|
+
| 概念 | 定义 |
|
|
107
|
+
|------|------|
|
|
108
|
+
| blocking_for_verify | 当前会导致 `pmem verify` warning/error 的一致性问题 |
|
|
109
|
+
| current_suggestions | 当前仍值得 agent 处理,但不阻塞 verify 的建议 |
|
|
110
|
+
| historical_dirty_flags | 历史遗留、重复或已不影响当前一致性的 dirty flags |
|
|
111
|
+
| duplicate_hidden | 被聚合隐藏的重复 dirty flag 数 |
|
|
112
|
+
| historical_hidden | 默认未展示的历史项数 |
|
|
113
|
+
|
|
114
|
+
`update --suggest` 不再把所有 unresolved dirty flags 等价展示。它应该回答:
|
|
115
|
+
|
|
116
|
+
1. 是否有阻塞当前 verify 的问题。
|
|
117
|
+
2. 当前真正需要处理哪些 cards。
|
|
118
|
+
3. 隐藏了多少重复 / 历史噪声。
|
|
119
|
+
4. 如何查看完整历史。
|
|
120
|
+
|
|
121
|
+
### 2. compact 输出
|
|
122
|
+
|
|
123
|
+
无阻塞但有历史项:
|
|
124
|
+
|
|
125
|
+
```txt
|
|
126
|
+
Memory update suggestions
|
|
127
|
+
|
|
128
|
+
Blocking for verify: 0
|
|
129
|
+
Current suggestions: 0
|
|
130
|
+
Historical hidden: 7
|
|
131
|
+
Duplicate flags hidden: 18
|
|
132
|
+
|
|
133
|
+
No blocking memory consistency issues.
|
|
134
|
+
Historical suggestions are available with --include-history.
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
有当前建议:
|
|
138
|
+
|
|
139
|
+
```txt
|
|
140
|
+
Memory update suggestions
|
|
141
|
+
|
|
142
|
+
Affected cards: 3
|
|
143
|
+
Blocking for verify: 1
|
|
144
|
+
Current suggestions: 2
|
|
145
|
+
Historical hidden: 7
|
|
146
|
+
Duplicate flags hidden: 18
|
|
147
|
+
|
|
148
|
+
Blocking:
|
|
149
|
+
- module.runtime_executor (stale_memory, crates/sprflow-runtime/src/executor.rs, count 4)
|
|
150
|
+
|
|
151
|
+
Current:
|
|
152
|
+
- trace.phase2_evaluation_accepted_2026-05-21 (file_changed, count 3)
|
|
153
|
+
|
|
154
|
+
Next:
|
|
155
|
+
- Update or confirm affected cards with pmem update --confirm -s "<summary>" -n "<next step>"
|
|
156
|
+
- Use --include-history to inspect older dirty flags.
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 3. JSON 输出
|
|
160
|
+
|
|
161
|
+
建议结构:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"summary": {
|
|
166
|
+
"affected_cards": 3,
|
|
167
|
+
"blocking": 1,
|
|
168
|
+
"warning": 2,
|
|
169
|
+
"info": 0,
|
|
170
|
+
"duplicates_hidden": 18,
|
|
171
|
+
"historical_hidden": 7,
|
|
172
|
+
"verify_blocking": true
|
|
173
|
+
},
|
|
174
|
+
"message": "1 blocking memory consistency issue and 2 current suggestion(s).",
|
|
175
|
+
"next_steps": [
|
|
176
|
+
"Update or confirm affected cards with pmem update --confirm -s \"<summary>\" -n \"<next step>\"",
|
|
177
|
+
"Use --include-history to inspect older dirty flags."
|
|
178
|
+
],
|
|
179
|
+
"groups": {
|
|
180
|
+
"blocking_for_verify": [
|
|
181
|
+
{
|
|
182
|
+
"target": "module.runtime_executor",
|
|
183
|
+
"reason": "stale_memory",
|
|
184
|
+
"matched_file": "crates/sprflow-runtime/src/executor.rs",
|
|
185
|
+
"count": 4,
|
|
186
|
+
"severity": "blocking",
|
|
187
|
+
"blocks_verify": true,
|
|
188
|
+
"is_duplicate": false,
|
|
189
|
+
"is_historical": false,
|
|
190
|
+
"created_at_first": "2026-05-22T08:00:00.000Z",
|
|
191
|
+
"created_at_last": "2026-05-22T09:30:00.000Z"
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
"current_suggestions": [],
|
|
195
|
+
"historical_dirty_flags": []
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
当未传 `--include-history` 时,`historical_dirty_flags` 可以为空数组,但 `summary.historical_hidden` 必须保留。
|
|
201
|
+
|
|
202
|
+
### 4. exit code
|
|
203
|
+
|
|
204
|
+
保留现有协议:
|
|
205
|
+
|
|
206
|
+
| 状态 | exit code |
|
|
207
|
+
|------|-----------|
|
|
208
|
+
| 无 blocking、无 current suggestions、无可展示历史 | 0 |
|
|
209
|
+
| 有 blocking 或 current suggestions | 1 |
|
|
210
|
+
| 仅有 hidden historical suggestions | 0 |
|
|
211
|
+
| 命令错误 | 2 |
|
|
212
|
+
|
|
213
|
+
这样可以避免“verify 已通过,但历史项导致 agent 以为仍需处理”的误判。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 五、技术方案
|
|
218
|
+
|
|
219
|
+
### 1. 共享 verify 检查逻辑
|
|
220
|
+
|
|
221
|
+
总工建议的两条路径:
|
|
222
|
+
|
|
223
|
+
| 路径 | 评价 |
|
|
224
|
+
|------|------|
|
|
225
|
+
| A. suggest 内联 verify 检查 | 实现快,但会复制 verify stale-memory 逻辑,未来漂移 |
|
|
226
|
+
| B. 抽出共享检测函数 | 更符合长期维护,能真正对齐 verify/suggest 语义 |
|
|
227
|
+
|
|
228
|
+
v0.6.1 采用 **B:共享检测函数**。
|
|
229
|
+
|
|
230
|
+
建议新增:
|
|
231
|
+
|
|
232
|
+
```txt
|
|
233
|
+
src/core/consistency.ts
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
核心职责:
|
|
237
|
+
|
|
238
|
+
```ts
|
|
239
|
+
export interface ConsistencyIssue {
|
|
240
|
+
type: string;
|
|
241
|
+
severity: 'blocking' | 'warning' | 'info';
|
|
242
|
+
card_id?: string;
|
|
243
|
+
file_path?: string;
|
|
244
|
+
message: string;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function checkStaleMemory(pmemPath: string): ConsistencyIssue[];
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
`verify.ts` 和 `update.ts` 都调用这层函数:
|
|
251
|
+
|
|
252
|
+
- `verify.ts` 负责把 issues 转成 verify 输出和 score。
|
|
253
|
+
- `update.ts` 负责把 issues 与 dirty flags / suggestions 交叉归类。
|
|
254
|
+
|
|
255
|
+
v0.6.1 不必一次性迁移 verify 的全部 10 项检查,P0 只抽出与 `stale_memory` / dirty suggestion 语义相关的部分。
|
|
256
|
+
|
|
257
|
+
### 2. Dirty flag 聚合
|
|
258
|
+
|
|
259
|
+
当前 `dirty_flags` 表已有:
|
|
260
|
+
|
|
261
|
+
```txt
|
|
262
|
+
scope
|
|
263
|
+
target
|
|
264
|
+
reason
|
|
265
|
+
created_at
|
|
266
|
+
resolved_at
|
|
267
|
+
session_id
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
v0.6.1 不改 schema。聚合 key:
|
|
271
|
+
|
|
272
|
+
```txt
|
|
273
|
+
target + reason + matched_file
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
`matched_file` 来源优先级:
|
|
277
|
+
|
|
278
|
+
1. dirty flag reason payload 中已有文件信息时使用它。
|
|
279
|
+
2. 若 reason 只是 `file_changed`,从 card 的 `source_files` / paths 反查。
|
|
280
|
+
3. 无法确定时为 `null`,聚合 key 使用 `target + reason + null`。
|
|
281
|
+
|
|
282
|
+
聚合输出字段:
|
|
283
|
+
|
|
284
|
+
```ts
|
|
285
|
+
interface AggregatedSuggestion {
|
|
286
|
+
target: string;
|
|
287
|
+
reason: string;
|
|
288
|
+
matched_file: string | null;
|
|
289
|
+
count: number;
|
|
290
|
+
severity: 'blocking' | 'warning' | 'info';
|
|
291
|
+
blocks_verify: boolean;
|
|
292
|
+
is_duplicate: boolean;
|
|
293
|
+
is_historical: boolean;
|
|
294
|
+
created_at_first: string;
|
|
295
|
+
created_at_last: string;
|
|
296
|
+
sources: Array<{
|
|
297
|
+
scope: string;
|
|
298
|
+
target: string;
|
|
299
|
+
reason: string;
|
|
300
|
+
created_at: string;
|
|
301
|
+
session_id?: string | null;
|
|
302
|
+
}>;
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 3. Historical 判定
|
|
307
|
+
|
|
308
|
+
v0.6.1 不引入完整 lifecycle,因此 historical 是输出层分类,不写回 DB。
|
|
309
|
+
|
|
310
|
+
建议判定规则:
|
|
311
|
+
|
|
312
|
+
| 条件 | 分类 |
|
|
313
|
+
|------|------|
|
|
314
|
+
| 对应 verify issue | `blocking_for_verify` |
|
|
315
|
+
| dirty flag created_at 在最近 active / latest session 之后 | `current_suggestions` |
|
|
316
|
+
| dirty flag target 与当前 changed files 有直接 source_files 关联 | `current_suggestions` |
|
|
317
|
+
| 聚合组 count > 1 且没有 verify issue | duplicate hidden / historical |
|
|
318
|
+
| created_at 早于最近 update_log 或 session end,且不阻塞 verify | `historical_dirty_flags` |
|
|
319
|
+
| 无法判断但不阻塞 verify | `current_suggestions`,避免误藏 |
|
|
320
|
+
|
|
321
|
+
原则:**宁可把不确定项留在 current,也不要把可能需要处理的项藏进 history。**
|
|
322
|
+
|
|
323
|
+
### 4. CLI option
|
|
324
|
+
|
|
325
|
+
`pmem update --suggest` 新增:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
--include-history
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
现有:
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
--format compact|json
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
行为:
|
|
338
|
+
|
|
339
|
+
| 命令 | 行为 |
|
|
340
|
+
|------|------|
|
|
341
|
+
| `pmem update --suggest` | 默认 compact,隐藏历史 |
|
|
342
|
+
| `pmem update --suggest --format compact` | 同上 |
|
|
343
|
+
| `pmem update --suggest --format json` | 输出 summary + groups,隐藏 history details |
|
|
344
|
+
| `pmem update --suggest --include-history` | compact 中展示 historical section |
|
|
345
|
+
| `pmem update --suggest --format json --include-history` | JSON 中填充 `groups.historical_dirty_flags` |
|
|
346
|
+
|
|
347
|
+
### 5. 与 `pmem verify` 对齐
|
|
348
|
+
|
|
349
|
+
如果共享 consistency check 没有 blocking issues,`update --suggest` 必须输出:
|
|
350
|
+
|
|
351
|
+
```txt
|
|
352
|
+
No blocking memory consistency issues.
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
JSON:
|
|
356
|
+
|
|
357
|
+
```json
|
|
358
|
+
{
|
|
359
|
+
"summary": {
|
|
360
|
+
"verify_blocking": false,
|
|
361
|
+
"blocking": 0
|
|
362
|
+
},
|
|
363
|
+
"message": "No blocking memory consistency issues."
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
注意:`verify` 的 score 可能仍有非 dirty 类型 warning。v0.6.1 只保证 `update --suggest` 不把非阻塞历史 dirty flags 表达成 blocking issue。
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 六、E2E 测试设计
|
|
372
|
+
|
|
373
|
+
### E2E 1:重复 dirty flags 聚合
|
|
374
|
+
|
|
375
|
+
流程:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
pmem init v061-duplicates --description "x" --stage "y" --next "z"
|
|
379
|
+
mkdir -p src .pmem/modules
|
|
380
|
+
# 写入含 source_files 的 module card
|
|
381
|
+
pmem rebuild
|
|
382
|
+
# 多次修改同一个 source file 并 mark-dirty --auto
|
|
383
|
+
pmem update --suggest --format json
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
验收:
|
|
387
|
+
|
|
388
|
+
- 同一 target/reason/matched_file 只出现一个聚合项。
|
|
389
|
+
- 聚合项 `count > 1`。
|
|
390
|
+
- `summary.duplicates_hidden > 0`。
|
|
391
|
+
|
|
392
|
+
### E2E 2:verify 通过但有历史 dirty flags
|
|
393
|
+
|
|
394
|
+
流程:
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
pmem verify
|
|
398
|
+
pmem update --suggest --format compact
|
|
399
|
+
pmem update --suggest --format json
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
验收:
|
|
403
|
+
|
|
404
|
+
- compact 输出 `No blocking memory consistency issues.`。
|
|
405
|
+
- JSON `summary.verify_blocking === false`。
|
|
406
|
+
- 仅历史项时 exit code 为 0。
|
|
407
|
+
|
|
408
|
+
### E2E 3:include-history
|
|
409
|
+
|
|
410
|
+
流程:
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
pmem update --suggest --format json
|
|
414
|
+
pmem update --suggest --format json --include-history
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
验收:
|
|
418
|
+
|
|
419
|
+
- 默认 `groups.historical_dirty_flags` 为空或省略详情。
|
|
420
|
+
- `--include-history` 填充 historical details。
|
|
421
|
+
- 两者 summary 中 hidden count 一致。
|
|
422
|
+
|
|
423
|
+
### E2E 4:blocking issue 分组
|
|
424
|
+
|
|
425
|
+
流程:
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# 构造 source_files 指向已变更但 card 未更新的 stale memory
|
|
429
|
+
pmem verify
|
|
430
|
+
pmem update --suggest --format json
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
验收:
|
|
434
|
+
|
|
435
|
+
- 对应 card 进入 `groups.blocking_for_verify`。
|
|
436
|
+
- `severity === "blocking"`。
|
|
437
|
+
- `blocks_verify === true`。
|
|
438
|
+
- exit code 为 1。
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 七、文档更新
|
|
443
|
+
|
|
444
|
+
### README.md
|
|
445
|
+
|
|
446
|
+
新增:
|
|
447
|
+
|
|
448
|
+
- `update --suggest` 输出结构说明。
|
|
449
|
+
- `--include-history` 使用说明。
|
|
450
|
+
- verify/suggest 关系说明。
|
|
451
|
+
- exit code 中补充“仅 hidden history 不返回 1”。
|
|
452
|
+
|
|
453
|
+
### docs/usage.md
|
|
454
|
+
|
|
455
|
+
补充长期项目建议:
|
|
456
|
+
|
|
457
|
+
```bash
|
|
458
|
+
pmem update --suggest --format compact
|
|
459
|
+
pmem update --suggest --format json --include-history
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### CHANGELOG.md
|
|
463
|
+
|
|
464
|
+
新增 `0.6.1 - Actionable Update Suggestions` planned / released section。
|
|
465
|
+
|
|
466
|
+
### release checklist
|
|
467
|
+
|
|
468
|
+
新增 `docs/release-checklist-v0.6.1.md`,聚焦:
|
|
469
|
+
|
|
470
|
+
- version bump 到 `0.6.1`
|
|
471
|
+
- compact/json output snapshot
|
|
472
|
+
- duplicate aggregation E2E
|
|
473
|
+
- verify/suggest alignment E2E
|
|
474
|
+
- npm publish smoke
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## 八、实现顺序
|
|
479
|
+
|
|
480
|
+
```txt
|
|
481
|
+
Step 0: 冻结 v0.6.1 pre-design(本文档)
|
|
482
|
+
↓
|
|
483
|
+
Step 1: 抽出 consistency check
|
|
484
|
+
- src/core/consistency.ts
|
|
485
|
+
- verify.ts 调用共享 stale-memory check
|
|
486
|
+
↓
|
|
487
|
+
Step 2: 聚合 dirty flags / suggestions
|
|
488
|
+
- AggregatedSuggestion 类型
|
|
489
|
+
- target + reason + matched_file key
|
|
490
|
+
- duplicates_hidden / historical_hidden summary
|
|
491
|
+
↓
|
|
492
|
+
Step 3: 输出结构改造
|
|
493
|
+
- compact summary
|
|
494
|
+
- json summary + groups
|
|
495
|
+
- severity / blocks_verify / is_historical
|
|
496
|
+
↓
|
|
497
|
+
Step 4: CLI option
|
|
498
|
+
- --include-history
|
|
499
|
+
- exit code 调整:仅 hidden history 返回 0
|
|
500
|
+
↓
|
|
501
|
+
Step 5: E2E / docs / release checklist
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## 九、验收清单
|
|
507
|
+
|
|
508
|
+
### 产品验收
|
|
509
|
+
|
|
510
|
+
- [ ] 长期项目中重复 dirty flags 不再默认刷屏。
|
|
511
|
+
- [ ] 人类能从 compact 输出看出当前是否有 blocking issue。
|
|
512
|
+
- [ ] Agent 能从 JSON `summary` 和 `groups` 判断下一步。
|
|
513
|
+
- [ ] verify 100/100 时 suggest 不再表现得像还有阻塞问题。
|
|
514
|
+
- [ ] 历史项可通过 `--include-history` 查看。
|
|
515
|
+
|
|
516
|
+
### 工程验收
|
|
517
|
+
|
|
518
|
+
- [ ] `npm test` 通过。
|
|
519
|
+
- [ ] `npm run build` 通过。
|
|
520
|
+
- [ ] duplicate aggregation E2E 通过。
|
|
521
|
+
- [ ] verify/suggest alignment E2E 通过。
|
|
522
|
+
- [ ] include-history E2E 通过。
|
|
523
|
+
- [ ] exit code snapshot 与文档一致。
|
|
524
|
+
|
|
525
|
+
### 发布验收
|
|
526
|
+
|
|
527
|
+
- [ ] `package.json` version 为 `0.6.1`。
|
|
528
|
+
- [ ] `package-lock.json` root version 为 `0.6.1`。
|
|
529
|
+
- [ ] `src/index.ts` Commander version 为 `0.6.1`。
|
|
530
|
+
- [ ] `CHANGELOG.md` 包含 `0.6.1`。
|
|
531
|
+
- [ ] npm pack / install smoke 通过。
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## 十、v0.6.1 最终决策表
|
|
536
|
+
|
|
537
|
+
| 问题 | 最终决策 |
|
|
538
|
+
|------|---------|
|
|
539
|
+
| v0.6.1 主线 | Actionable Update Suggestions |
|
|
540
|
+
| 是否改 dirty_flags schema | 不改 |
|
|
541
|
+
| 是否新增 `pmem dirty` 子命令 | 不做,推迟到 v0.6.2 |
|
|
542
|
+
| 是否做完整 dirty lifecycle | 不做,推迟到 v0.6.2 |
|
|
543
|
+
| 是否做 `--current-session` | 不做 P0,等待 lifecycle 设计 |
|
|
544
|
+
| 是否 auto-cleanup | 不做 P0,避免无 lifecycle 的隐式删除 |
|
|
545
|
+
| 是否改变 exit code 协议 | 不改变主协议;仅 hidden history 不触发 exit 1 |
|
|
546
|
+
| 最重要交付 | 去重聚合 + 分级输出 + compact summary + verify/suggest 对齐 |
|
|
547
|
+
| 成功定义 | `update --suggest` 默认输出当前可行动事项,而不是历史事件日志 |
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
## 十一、v0.6.1 一句话定义
|
|
552
|
+
|
|
553
|
+
> **pmem v0.6.1 是一次针对 `update --suggest` 的行动性补丁:把重复和历史噪声折叠起来,把 verify-blocking 问题凸显出来,让 agent 和用户都能清楚判断当前是否需要处理记忆。**
|
|
554
|
+
|
|
555
|
+
更工程化:
|
|
556
|
+
|
|
557
|
+
```txt
|
|
558
|
+
pmem v0.6.1 =
|
|
559
|
+
pmem-ai@0.6.0
|
|
560
|
+
+ aggregated suggestions
|
|
561
|
+
+ severity and blocks_verify metadata
|
|
562
|
+
+ compact actionable summary
|
|
563
|
+
+ hidden historical noise by default
|
|
564
|
+
+ --include-history
|
|
565
|
+
+ shared verify/suggest stale-memory check
|
|
566
|
+
```
|