@haaaiawd/loom 0.1.0 → 0.8.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.
@@ -55,6 +55,7 @@ Intent Map 是 loop 的地图。它不是扁平任务表,是**带依赖关系
55
55
  | 字段 | 说明 | 为什么需要 |
56
56
  |---|---|---|
57
57
  | `id` | 稳定标识(如 `INT-001`) | 全局引用,不随重命名丢失 |
58
+ | `title` | 一句话标题 | `intent next`/`status` 输出时优先展示,让 Agent 不用读完整叙事就能判断当前在做什么 |
58
59
  | `narrative_ref` | 意图叙事的引用(指向愿景文档的章节) | Keeper 验证的依据——"为什么存在" |
59
60
  | `depends_on` | 前置 Intent ID 列表 | 拓扑序计算、依赖检查 |
60
61
  | `acceptance` | 验收契约(什么算"忠实实现") | Keeper 判定通过/偏离的标准 |
@@ -66,20 +67,41 @@ Intent Map 是 loop 的地图。它不是扁平任务表,是**带依赖关系
66
67
  - `acceptance` 的具体形式(Given-When-Then / 用户故事验收 / 自定义)
67
68
  - 是否有额外字段(如 `estimated_effort`、`priority`、`sprint`)
68
69
 
70
+ **system_id 归属规则**(Architect 设计 Intent Map 时必须遵守):
71
+ - 每个 Intent 的验收契约只能要求**该 Intent 自己产出的文件**可运行/可验证
72
+ - 如果 Intent A 的契约要求"能启动",但启动入口文件归 Intent B,这是契约设计错误
73
+ - 正确做法:要么把"最小可启动骨架"划进最早执行的 Intent 的产出范围,要么把契约措辞改为"提供启动入口配置,实际启动在依赖 Intent 完成后验证"
74
+ - Forge 在实现时如果发现契约要求的文件不属于当前 Intent 的产出范围,应该自主判断:要么扩展当前 Intent 的产出(在契约允许的自由空间内),要么标记 `blocked` 报告"契约要求跨 Intent 产出"
75
+
69
76
  **acceptance 质量底线**:`acceptance` 必须具体到可验证——Keeper 读完后能明确判断"满足/不满足"。禁止模糊措辞(如"实现正确即可"、"功能正常")。如果 Keeper 验证时发现 acceptance 无法判定,必须标记 `blocked`,要求 Architect 重新定义。
70
77
 
78
+ **acceptance 承诺分层**:
79
+
80
+ acceptance 不只是"实现什么功能",是"这个 Intent 向系统承诺了什么"。分两层:
81
+ 1. **功能承诺**:这个 Intent 产出什么可观察行为(Given-When-Then)
82
+ 2. **防御承诺**:这个 Intent 不会发生什么(从 `philosophy_anchors` 引用的反模式派生)
83
+
84
+ 防御承诺不是让 Keeper 验证时自己去对照反模式,是 Architect 在设计阶段就把反模式转成可验证的契约。例:`AI_PHILOSOPHY#anti-patterns` "禁止直接 JSON.parse" → 防御契约 "LLM 返回非合法 JSON 时抛明确错误,不返回空数组假装成功"。
85
+
86
+ **Pre-Mortem 设计法**(Architect 设计时用):对每个 Intent 做一次 Pre-Mortem——假设这个 Intent 实现后失败了,最可能的失败原因是什么?把那个失败原因变成 acceptance 里的一条防御契约。这让 acceptance 从"描述成功"升级为"防御失败"。
87
+
71
88
  **acceptance 示例**:
72
89
 
73
90
  ```
74
- 具体可验证:
91
+ 具体可验证(功能承诺 + 防御承诺):
75
92
  "Given 用户已注册且邮箱已验证
76
93
  When 用户输入正确的邮箱和密码
77
94
  Then 用户成功登录并跳转到 /dashboard
78
- And 错误的密码显示'用户名或密码错误'"
95
+ And 错误的密码显示'用户名或密码错误'
96
+ And [防御承诺] 密码错误时不泄露用户是否存在(来自 ENGINEERING_CREED#anti-patterns)"
79
97
 
80
98
  ✓ 具体可验证(性能):
81
99
  "从 MySQL 抽取 100 万行数据完成时间 < 5 分钟(在标准测试环境下)"
82
100
 
101
+ ✓ 具体可验证(防御承诺):
102
+ "LLM 返回非合法 JSON 时抛明确错误,不返回空数组假装成功
103
+ (Pre-Mortem: LLM 返回乱码导致前端崩溃 → 防御契约来自 AI_PHILOSOPHY#anti-patterns)"
104
+
83
105
  ✗ 模糊不可验证:
84
106
  "实现正确即可"
85
107
  "功能正常"
@@ -143,6 +165,16 @@ Verification 是 loop 的验证环节。它不是 code review(那是看代码
143
165
  - 在人类验证完成前,Intent 的总判定为 `blocked`(不能标记 completed)
144
166
  - 如果用户长期不补充判定(默认 7 天),Keeper 将该 Intent 升级为 `blocked`,报告"人类验证超时"
145
167
 
168
+ **AUTO 模式下的 L3 规则**(关键差异):
169
+ - AUTO 模式开启时(`.loom/auto` 存在),**不需要任何 human review**
170
+ - Keeper 遇到 L3 verification_method 时,**自主判定**所有维度,不标 `pending_human`
171
+ - Keeper 用 L1 静态审查 + L2 运行时验证的能耐去覆盖 L3 维度,给出明确判定(passed/deviated)
172
+ - Intent 直接按 Keeper 判定流转,**不停下等人类**
173
+ - AUTO 模式的核心契约:**持续运行,除非出意外否则不允许私自停止**
174
+ - "出意外"定义:blocked(依赖阻塞/契约无法判定/连续 3 轮 deviated 升级)、fatal 错误(Intent Map 损坏/循环依赖)
175
+ - Agent 不允许因为"这个维度我判断不了"就停下来——要么判 passed(有证据),要么判 deviated(有偏离说明),不允许 pending_human
176
+ - **验证记录必须说明**:summary 字段里要写明"AUTO 模式下 L3 维度由 Keeper 自主判定,用 L1+L2 能耐覆盖",让后续审查者知道这是自主判定而非人类确认
177
+
146
178
  **自由空间**(哲学决定):
147
179
  - 哪些 Intent 用 L1、哪些用 L2、哪些用 L3——由 Architect 在 Intent Map 中通过 `verification_method` 字段声明
148
180
  - 验证脚本的具体形式(单元测试 / 集成测试 / 评估集 / 性能基准)由 Architect 和哲学决定
@@ -186,29 +218,98 @@ Verification 是 loop 的验证环节。它不是 code review(那是看代码
186
218
  **验证记录格式**:
187
219
 
188
220
  ```json
189
- // verifications/INT-{id}.json
221
+ // verifications/INT-{id}.json — 多轮验证追加模式
190
222
  {
191
223
  "intent_id": "INT-001",
192
- "verdict": "passed | deviated | blocked | pending_human",
193
- "fidelity": "high | medium | low",
194
- "verification_level": "L1 | L2 | L3",
195
- "checked_at": "ISO 8601 时间戳",
196
- "dimensions_checked": ["intent_fidelity", "philosophy_consistency", "baseline_compliance", "acceptance"],
197
- "pending_human_dimensions": ["acceptance"],
198
- "notes_ref": "verifications/INT-001.md"
224
+ "records": [
225
+ {
226
+ "round": 1,
227
+ "verdict": "passed | deviated | blocked | pending_human",
228
+ "timestamp": "ISO 8601 时间戳",
229
+ "summary": "验证摘要——具体证据,不是'看起来没问题'",
230
+ "dimensions": {
231
+ "intent_fidelity": {
232
+ "verdict": "passed",
233
+ "evidence": "对照 01_VISION.md#int-001 意图叙事第 2 段,extract.js 实现了 prompt→LLM→parse→validate 编排,忠实于'把模糊变清晰'"
234
+ },
235
+ "philosophy_consistency": {
236
+ "verdict": "passed",
237
+ "evidence": "AI_PHILOSOPHY#anti-patterns '禁止直接 JSON.parse' → extract.js L43-47 有 try/catch;'禁止无超时调用' → llm.js L32-33 有 AbortController;ENGINEERING_CREED#anti-patterns '禁止硬编码密钥' → grep sk- 在 src/ 0 命中"
238
+ },
239
+ "baseline_compliance": {
240
+ "verdict": "passed",
241
+ "evidence": "B1 结构设计→02_ARCHITECTURE.md 有目录结构;B2 禁止硬编码→config.js 集中管理;B3 接口契约→05_VERIFICATION.md 有 schema;B4 决策可追溯→ADR-001 存在;B5 意图回溯→每个文件头有意图注释"
242
+ },
243
+ "acceptance_achievement": {
244
+ "verdict": "passed",
245
+ "evidence": "契约#1 prompt 约束完整→prompts/extract.js L19-32;契约#2 schema 校验→validate.js L50-62;契约#5 测试 6/6 pass→reproduction_command 可复现"
246
+ }
247
+ },
248
+ "reproduction_command": "LLM_API_KEY=mock npm test",
249
+ "deviation_detail": "偏离说明(deviated 时必填)",
250
+ "reset_suggested": false
251
+ }
252
+ ]
199
253
  }
200
254
  ```
201
255
 
202
- ```markdown
203
- <!-- verifications/INT-001.md -->
256
+ **字段说明**:
257
+ - `intent_id`:Intent ID,如 `INT-001`
258
+ - `records`:验证记录数组,每次验证追加一条
259
+ - `round`:轮次,从 1 开始递增
260
+ - `verdict`:总判定,四选一
261
+ - `timestamp`:ISO 8601 时间戳
262
+ - `summary`:验证摘要——具体证据,不是"看起来没问题"
263
+ - `dimensions`:四个维度的判定结果,**每个维度必须是 `{ verdict, evidence }` 对象**——`verdict` 是枚举值,`evidence` 是具体证据字符串。不允许只写"合规",必须写"对照了什么 + 在代码哪里看到/没看到"
264
+ - `reproduction_command`:复现验证的命令——别人拿到项目后跑这个命令能复现验证结果。如 `LLM_API_KEY=mock npm test`。L2 运行时验证必填,L1 静态审查可选
265
+ - `deviation_detail`:偏离说明(deviated 时必填)
266
+ - `reset_suggested`:是否建议重置上下文(context rot 严重时)
267
+
268
+ **evidence 的质量底线**:evidence 必须具体到可定位——"在 X 文件 Y 行看到 Z"或"对照哲学锚点 A 的反模式 B,代码里 C 处有/没有对应处理"。模糊的 evidence("看起来没问题"、"基本合规")等于未验证。CLI 会校验 evidence 非空,但内容质量由 Keeper 的诚实度保证。
269
+
270
+ **`loom verify write` 的输入格式**(单条记录,CLI 自动包装成上面的数组格式):
271
+ ```json
272
+ {
273
+ "intent_id": "INT-001",
274
+ "verdict": "passed",
275
+ "timestamp": "2026-06-28T12:00:00.000Z",
276
+ "summary": "6/6 测试通过,验收契约全部达成",
277
+ "reproduction_command": "LLM_API_KEY=mock npm test",
278
+ "dimensions": {
279
+ "intent_fidelity": {
280
+ "verdict": "passed",
281
+ "evidence": "对照意图叙事第 2 段,extract.js 实现了完整编排"
282
+ },
283
+ "philosophy_consistency": {
284
+ "verdict": "passed",
285
+ "evidence": "AI_PHILOSOPHY 反模式逐条对照:JSON.parse 有 try/catch、fetch 有超时、无硬编码密钥"
286
+ },
287
+ "baseline_compliance": {
288
+ "verdict": "passed",
289
+ "evidence": "B1-B5 逐条合规,见 summary"
290
+ },
291
+ "acceptance_achievement": {
292
+ "verdict": "passed",
293
+ "evidence": "6 条契约全部达成,npm test 6/6 pass"
294
+ }
295
+ }
296
+ }
297
+ ```
298
+
299
+ **验证叙事 MD 文件**(可选但推荐——JSON 存判定,MD 存详细证据):
300
+ ```
301
+ verifications/INT-001.md
302
+ ```
204
303
  Keeper 验证 INT-001:
205
- - 意图忠实度:[判定 + 理由]
206
- - 哲学一致性:[判定 + 理由]
207
- - 底线合规:[判定 + 理由]
208
- - 验收达成:[判定 + 理由]
304
+ - 意图忠实度:[判定 + 具体证据——对照意图叙事第 X 段,实现中……]
305
+ - 哲学一致性:[判定 + 哪条哲学约束合规/违规]
306
+ - 底线合规:[判定 + B1-B5 各条合规情况]
307
+ - 验收达成:[判定 + 契约第 N 条:证据……]
209
308
  - 总判定:[passed/deviated/blocked]
309
+ - 复现命令:[reproduction_command]
210
310
  - 偏离说明(如有):[偏离什么、修正方向]
211
- ```
311
+
312
+ MD 文件不是必须的(JSON 的 summary 字段已包含摘要),但当验证复杂、证据多时,MD 提供更完整的叙事。Keeper 至少要写 JSON,推荐 JSON + MD 都写。
212
313
 
213
314
  ---
214
315
 
@@ -307,9 +408,49 @@ Intent Loop 的固定骨架。底线之上,具体形态由哲学决定。
307
408
 
308
409
  ### Loop 终止条件
309
410
 
310
- - 所有 Intent 的 `status` 为 `completed` → 项目阶段完成
411
+ - **不动点达成**:所有 Intent 的 `status` 为 `completed`,且没有 `needs_review` → 项目阶段完成
311
412
  - 用户主动停止
312
413
  - 阻塞无法解决,Keeper 判定 `blocked` 且无法通过对话修正
414
+ - **无法收敛**:收敛趟数超过最大值(默认 3 趟),仍有 `needs_review` → blocked,报告"无法收敛,可能存在系统性问题需要 Architect 介入"
415
+
416
+ ### 不动点收敛机制
417
+
418
+ Intent Loop 不是单纯的线性推进——它是**收敛到不动点**的过程。
419
+
420
+ **默认单趟**:大多数项目按拓扑序验证所有 Intent,全部 passed → done。不需要多趟。
421
+
422
+ **触发收敛**:当 Pass 1 结束后存在 `needs_review` 的 Intent(修某个 Intent 时影响了已完成的 Intent),自动进入收敛趟。
423
+
424
+ ```
425
+ Pass 1(默认): 按拓扑序验证所有 Intent
426
+ - 每个 Intent: Forge 实现 → Keeper 验证
427
+ - deviated → 修 → 重验(最多 3 轮 → blocked)
428
+ - 修的时候影响已完成的 Intent → 标记 needs_review
429
+ - passed → 下一个
430
+
431
+ Pass 1 结束:
432
+ - 有 needs_review? → Pass 2
433
+ - 没有? → 不动点达成 → done
434
+
435
+ Pass 2(收敛趟): 重验所有 needs_review 的 Intent
436
+ - needs_review → in_progress → Keeper 重新验证
437
+ - deviated → 修 → 重验
438
+ - 修的时候又影响别的 → 标记 needs_review
439
+ - passed → completed
440
+
441
+ Pass 2 结束:
442
+ - 还有 needs_review? → Pass 3
443
+ - 没有? → done
444
+
445
+ Pass 3(最大趟数): 同上
446
+ - 结束后还有 needs_review? → blocked, 报告"无法收敛"
447
+ ```
448
+
449
+ **收敛趟数怎么数**:一个 Intent 从 `completed` 被标记为 `needs_review` 算一次。同一个 Intent 被标记多次 needs_review 算多次。累计标记次数超过最大趟数(默认 3)→ 无法收敛。
450
+
451
+ **为什么是不动点**:每趟收敛都解决一些问题,但如果修 A 时引入了影响 B 的问题,B 就需要重验。当一趟完整 pass 没有产生任何新的 needs_review,说明"再验一遍也不会发现新东西"——这就是不动点。
452
+
453
+ **AUTO 模式下**:收敛自动进行,不需要人类确认每趟 pass。Keeper 在每趟结束时检查 needs_review 数量,决定继续还是结束。
313
454
 
314
455
  ---
315
456
 
@@ -50,13 +50,28 @@ Philosophy Weaver 是一个**独立的 Agent 步骤**,在项目启动时运行
50
50
 
51
51
  Weaver 自己决定要产出几个文档、多详细——这取决于项目特征。
52
52
 
53
+ ### 灵感来源的硬约束
54
+
55
+ 哲学文档的"灵感来源"章节不是装饰——它是搜索过程的证据。CLI 会校验灵感来源质量(`loom philosophy check`):
56
+
57
+ 1. **至少 3 个独立源**——少于 3 个说明搜索不充分
58
+ 2. **至少 2 个非 Wikipedia 链接**——Wikipedia 是常识入口,不是深度源。需要原著、论文、工程博客、标准文档等
59
+ 3. **每个源必须有选取理由**——必须说明"为什么选这个源"、萃取/转译关系
60
+ 4. **源类型不能单一**——Wikipedia 占比超过 70% 会报警
61
+
62
+ **如果 Agent 从训练数据"背"几个熟悉的名字(如 Unix Philosophy、Dieter Rams)就交差,校验会失败。** 必须真正走搜索漏斗,找到原著、深度解读、实践案例。
63
+
64
+ `loom doctor` 也会自动跑灵感来源校验——不达标的哲学文档会被标记为问题。
65
+
53
66
  ---
54
67
 
55
- ## 哲学维度分层
68
+ ## 哲学织造的两个轴
69
+
70
+ Weaver 从两个正交的轴织造哲学:
56
71
 
57
- Weaver 从三个层次织造哲学。不是所有层次都需要——按项目特征激活。
72
+ ### 轴一:通用层(回答"为什么")
58
73
 
59
- ### 第一层:通用层(所有项目都需要)
74
+ 所有项目都需要。回答产品为什么存在、代码怎么写、团队怎么协作。
60
75
 
61
76
  | 维度 | 回答什么 | 必须产出 |
62
77
  |---|---|---|
@@ -64,40 +79,66 @@ Weaver 从三个层次织造哲学。不是所有层次都需要——按项目
64
79
  | 工程哲学 | 怎么写代码?什么不做?什么是好代码? | ENGINEERING_CREED.md |
65
80
  | 协作哲学 | 怎么决策?怎么处理冲突? | 融入 DECISION_RUBRIC.md 或独立文档 |
66
81
 
67
- ### 第二层:领域层(按项目特征激活)
82
+ 通用层三个维度必跑,不可跳过。参考源指引见 `dimensions/universal/` 下的维度文件。
68
83
 
69
- | 维度 | 触发条件 | 产出(按需) |
70
- |---|---|---|
71
- | 前端/UX 哲学 | 项目有用户界面 | UX_PHILOSOPHY.md |
72
- | 游戏设计哲学 | 项目是游戏 | GAME_DESIGN_PHILOSOPHY.md |
73
- | 后端/基础设施哲学 | 项目是后端/平台 | BACKEND_PHILOSOPHY.md |
74
- | AI/ML 哲学 | 项目涉及 AI/ML | AI_PHILOSOPHY.md |
84
+ ### 轴二:实现部分层(回答"怎么做")
75
85
 
76
- **子触发**:领域层内部还有子触发。例如前端/UX 哲学内部,如果项目涉及 3D,激活 3D/沉浸式子维度。
86
+ 按项目特征**动态拆解**——不预设"有哪些部分",由 Agent 根据项目特征自行识别。
77
87
 
78
- ### 第三层:交叉层(跨领域,按需)
88
+ **拆解方法论**:见 `dimensions/PART_DECOMPOSITION.md`。核心流程:
79
89
 
80
- | 维度 | 触发条件 | 产出 |
81
- |---|---|---|
82
- | 体验心理学 | 面向终端用户 | 融入 UX_PHILOSOPHY 或独立 |
83
- | 性能哲学 | 性能敏感 | PERFORMANCE_PHILOSOPHY.md 或融入工程哲学 |
84
- | 安全哲学 | 涉及敏感数据/系统 | SECURITY_PHILOSOPHY.md 或融入工程哲学 |
85
- | 商业/增长哲学 | 2C 需要增长 | GROWTH_PHILOSOPHY.md 或融入产品哲学 |
90
+ 1. **识别项目类型**(CLI 工具 / Agent 系统 / Web 前端 / 后端服务 / 游戏 / ...)
91
+ 2. **拆解实现部分**——问三个问题:
92
+ - 用户接触面是什么?(CLI 输出 / 对话格式 / 页面交互 / ...)
93
+ - 内部由哪些子系统组成?(转换引擎 / 工具调度 / 路由 / ...)
94
+ - 每个子系统的职责边界在哪?
95
+ 3. **对每个部分独立走搜索漏斗**——搜"这个部分该怎么做、什么标准、有什么好实践"
96
+ 4. **产出部分哲学文档**——每个部分有北极星、该做什么、不该做什么、参考实践
86
97
 
87
- ### 维度激活规则
98
+ **拆解原则**:
99
+ - 按职责拆,不按文件拆
100
+ - 粒度适中——太粗没有约束力,太细是架构不是哲学
101
+ - 用户接触面优先——用户能看到的部分,哲学约束最重要
102
+ - 每个部分能独立搜索到好实践
88
103
 
89
- **Weaver 自动判断**激活哪些维度,基于项目特征。用户在检查点确认或调整。
104
+ **拆解示例**:
90
105
 
91
- Weaver 判断逻辑:
92
- 1. 读取项目特征
93
- 2. 扫描 `dimensions/` 目录,读取每个维度文件的触发条件
94
- 3. 对照触发条件,列出建议激活的维度
95
- 4. 展示给用户确认
96
- 5. 用户可同意、可拒绝、可补充
106
+ CLI 工具(如 md2html):
107
+ ```
108
+ ├── CLI 交互设计 — 参数解析、--help、--version、用法提示
109
+ ├── CLI 输出美学 — 成功反馈格式、颜色策略、Rule of Silence 的正确理解
110
+ ├── CLI 错误呈现 — 错误结构、修复建议、退出码语义
111
+ ├── 转换引擎 — 纯函数、子集策略、透传 vs 报错
112
+ └── 产物设计 — HTML 结构、CSS 内联、可预测性
113
+ ```
97
114
 
98
- **维度库结构**:`dimensions/` 目录下按分层组织——通用层、领域层、交叉层各一个子目录,每个维度一个 MD 文件。每个维度文件必须包含:触发条件、引导问题、参考源指引、落地要求。Weaver 扫描目录结构获取维度清单,读取每个文件的触发条件判断是否激活。
115
+ Agent 系统:
116
+ ```
117
+ ├── 系统架构 — 编排 vs 控制、进程边界、IPC 机制
118
+ ├── 工具调用哲学 — 委托边界、失控收回、工具描述怎么写
119
+ ├── 上下文压缩 — 什么时候压缩、压缩什么、保留什么
120
+ ├── 提示词工程 — 角色激活、约束注入、上下文窗口管理
121
+ ├── 验证哲学 — 怎么信、怎么验、自动化 vs 人类
122
+ └── 失败与恢复 — 崩溃恢复、状态一致性、回滚策略
123
+ ```
124
+
125
+ ### 两轴的关系
126
+
127
+ - 通用层是地基——没有产品哲学,实现部分的哲学就没有判断基准
128
+ - 实现部分层是落地——没有部分哲学,通用层就飘在空中,Forge 实现时不知道该对照什么
129
+ - 两层正交,都需要
99
130
 
100
- 如果 `dimensions/` 下没有对应维度文件,Weaver 按"织造漏斗"(搜索→萃取→转译→落地)自主走——维度表告诉你"有哪些维度可激活",织造漏斗告诉你"怎么织造"。维度文件只是给 Weaver 特定领域的额外指引,不是织造的前提。
131
+ ### 交叉维度(按需,跨部分)
132
+
133
+ 某些维度不属于单个实现部分,而是跨多个部分:
134
+
135
+ | 维度 | 触发条件 | 产出 |
136
+ |---|---|---|
137
+ | 性能哲学 | 性能敏感 | 融入相关部分哲学或独立文档 |
138
+ | 安全哲学 | 涉及敏感数据/系统 | 融入相关部分哲学或独立文档 |
139
+ | 体验心理学 | 面向终端用户 | 融入用户接触面部分哲学 |
140
+
141
+ 交叉维度不单独成层——它们融入相关的实现部分哲学中。
101
142
 
102
143
  ---
103
144
 
@@ -201,29 +242,33 @@ Step 0:内化 BASELINE
201
242
  → 底线是织造的硬约束
202
243
 
203
244
  Step 1:项目特征识别
204
- → 识别项目类型(2C/2B/工具/平台/游戏/基础设施)
245
+ → 识别项目类型(CLI 工具 / Agent 系统 / Web 前端 / 后端服务 / 游戏 / ...)
205
246
  → 识别规模(小/中/大)
206
- → 识别领域(前端/后端/AI/数据/...)
207
247
  → 识别核心价值(这个产品为什么要存在)
208
248
 
209
- Step 2:维度激活
210
- 对照维度库,判断激活哪些哲学维度
211
- 展示建议激活的维度,用户确认或调整
212
- 通用层三个维度必跑
213
- 领域层和交叉层按触发条件激活
214
-
215
- Step 3:逐维度织造
216
- 对每个激活的维度,走"搜索→萃取→转译→落地"漏斗
217
- 通用层先织造(产品→工程→协作)
218
- 领域层后织造
219
- → 交叉层最后
220
-
221
- Step 4:整合与冲突解决
222
- 检查维度间冲突(如性能哲学 vs 体验哲学)
249
+ Step 2:实现部分拆解
250
+ 按 dimensions/PART_DECOMPOSITION.md 的方法论拆解
251
+ 问三个问题:用户接触面是什么?内部由哪些子系统组成?每个子系统的职责边界?
252
+ 产出"实现部分清单"——本项目拆解出哪些部分
253
+ 展示给用户确认或调整
254
+
255
+ Step 3:通用层织造
256
+ 织造产品哲学、工程哲学、协作哲学
257
+ 参照 dimensions/universal/ 下的维度指引搜索
258
+ 每个维度走"搜索→萃取→转译→落地"漏斗
259
+
260
+ Step 4:实现部分层织造
261
+ → 对 Step 2 拆解出的每个部分,独立走搜索漏斗
262
+ 搜"这个部分该怎么做、什么标准、有什么好实践"
263
+ → 产出部分哲学文档(独立文件或融入通用层文档的章节)
264
+ → 每个部分必须有:北极星、该做什么、不该做什么、参考实践、灵感来源
265
+
266
+ Step 5:整合与冲突解决
267
+ → 检查部分间冲突(如 CLI 输出美学 vs CLI 错误呈现的格式冲突)
223
268
  → 产出 DECISION_RUBRIC.md(冲突取舍规则)
224
269
  → 确保所有哲学文档不与 BASELINE 冲突
225
270
 
226
- Step 5:版本锚定
271
+ Step 6:版本锚定
227
272
  → 哲学文档写入 .loom/v{N}/00_PHILOSOPHY/
228
273
  → 版本升级时可重新织造,旧版保留
229
274
  → 记录织造日志(参考了哪些源、为什么这么织)
@@ -231,8 +276,8 @@ Step 5:版本锚定
231
276
 
232
277
  ### 人类检查点
233
278
 
234
- Step 2(维度激活)后:用户确认激活的维度。
235
- Step 4(整合)后:用户确认冲突取舍规则。
279
+ Step 2(实现部分拆解)后:用户确认拆解出的部分清单。
280
+ Step 5(整合)后:用户确认冲突取舍规则。
236
281
 
237
282
  其他步骤 Weaver 自主推进,不需要逐步批准。
238
283
 
@@ -269,7 +314,15 @@ Weaver 织造时读取对应维度文件,按其指引搜索和萃取。
269
314
 
270
315
  维度库是**可扩展**的——用户或 Agent 可以添加新维度。但新维度必须包含上述四要素,否则 Weaver 无法使用。
271
316
 
272
- > **注**:`dimensions/` 当前包含 `SEARCH_METHODOLOGY.md`(检索方法论)。维度文件按需填充——Weaver 首次运行时如果维度文件不存在,可根据 PHILOSOPHY_WEAVER.md 中的维度表自主判断。
317
+ > **注**:`dimensions/` 当前包含:
318
+ > - `SEARCH_METHODOLOGY.md` — 检索方法论(怎么找到优质思想)
319
+ > - `PART_DECOMPOSITION.md` — 实现部分拆解方法论(怎么识别项目由哪些部分组成)
320
+ > - `universal/PRODUCT_PHILOSOPHY.md` — 产品哲学维度指引(参考源清单 + 落地要求)
321
+ > - `universal/ENGINEERING_CREED.md` — 工程哲学维度指引
322
+ > - `universal/COLLABORATION_PHILOSOPHY.md` — 协作哲学维度指引
323
+ > - `examples/` — 参考案例库(按项目类型组织,每个类型一个子目录)
324
+ >
325
+ > 通用层三个维度已填充,Weaver 织造时必须读取对应维度文件,按其参考源指引搜索。实现部分层不预设——Weaver 按 `PART_DECOMPOSITION.md` 的方法论自行拆解,`examples/` 提供参考案例但不强制遵循。
273
326
 
274
327
  ---
275
328
 
@@ -278,12 +331,13 @@ Weaver 织造时读取对应维度文件,按其指引搜索和萃取。
278
331
  | 由这份文件规定(元规范) | 由 Weaver 织造(哲学) |
279
332
  |---|---|
280
333
  | 织造漏斗是"搜索→萃取→转译→落地" | 每步的具体内容 |
281
- | 哲学分为三层(通用/领域/交叉) | 激活哪些领域和交叉维度 |
334
+ | 哲学分两个轴(通用层 + 实现部分层) | 拆解出哪些实现部分 |
282
335
  | 通用层三个维度必跑 | 三个维度的具体内容 |
336
+ | 实现部分按 PART_DECOMPOSITION.md 拆解 | 每个部分的具体哲学 |
283
337
  | 哲学文档必须包含 5 个结构要素 | 每个要素的具体内容 |
284
338
  | DECISION_RUBRIC 必须有冲突取舍规则 | 规则的具体内容 |
285
339
  | 哲学必须内化 BASELINE | 内化的具体表达方式 |
286
340
  | 哲学跟随版本演进 | 演进时变什么、为什么变 |
287
- | 维度库是 Weaver 的弹药库 | 维度库的具体内容(待填充) |
341
+ | 灵感来源必须通过源多样性校验 | 具体引用哪些源 |
288
342
 
289
343
  元规范定义"怎么织造",哲学定义"织出什么"。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haaaiawd/loom",
3
- "version": "0.1.0",
3
+ "version": "0.8.0",
4
4
  "description": "LOOM — 哲学驱动开发框架。Agent 通过 CLI 访问 Intent Map / 哲学 / 验证记录,不直接读文件",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "cli/bin",
11
11
  "cli/src",
12
+ "cli/help",
12
13
  "meta",
13
14
  "roles",
14
15
  "templates",
@@ -34,8 +35,8 @@
34
35
  "license": "MIT",
35
36
  "repository": {
36
37
  "type": "git",
37
- "url": "git+https://github.com/haaaiawd/loom.git"
38
- },
39
- "homepage": "https://github.com/haaaiawd/loom#readme",
38
+ "url": "git+https://github.com/Haaaiawd/loom.git"
39
+ },
40
+ "homepage": "https://github.com/Haaaiawd/loom#readme",
40
41
  "author": "haaaiawd"
41
42
  }
@@ -96,4 +96,16 @@ Intent Map 是你的核心产出。它不是扁平任务表,是带依赖关系
96
96
 
97
97
  Intent Map 的 `acceptance` 字段是 Keeper 验证的**唯一真相源**。05_VERIFICATION.md 是验收契约的详细展开——如果 `acceptance` 字段空间不够,可以引用 05_VERIFICATION.md 的章节。但 Keeper 验证时读的是 `acceptance` 字段,CLI 会解析引用获取实际内容。验证契约的形式由产品哲学决定(Given-When-Then / 用户故事验收 / 自定义)。
98
98
 
99
+ **验收契约设计思想——承诺先于功能**:
100
+
101
+ acceptance 不只是"实现什么功能",是"这个 Intent 向系统承诺了什么"。设计 acceptance 时分两层:
102
+ 1. **功能承诺**:这个 Intent 产出什么可观察行为(Given-When-Then)
103
+ 2. **防御承诺**:这个 Intent 不会发生什么(从哲学反模式派生——"不返回空数组假装成功"、"不硬编码密钥"、"不无超时调用")
104
+
105
+ **Pre-Mortem 设计法**:对每个 Intent,设计 acceptance 前先做一次 Pre-Mortem——假设这个 Intent 实现后失败了,最可能的失败原因是什么?把那个失败原因变成 acceptance 里的一条防御性契约。
106
+
107
+ 例:INT-001(todo 提取)Pre-Mortem → "LLM 返回乱码导致前端崩溃" → 防御契约:"LLM 返回非合法 JSON 时抛明确错误,不返回空数组假装成功"。
108
+
109
+ 防御承诺来自 `philosophy_anchors` 引用的哲学反模式。Architect 设计 acceptance 时必须从反模式派生防御契约——不是让 Keeper 验证时自己去对照反模式,是在设计阶段就把反模式转成可验证的契约。
110
+
99
111
  **验证方式声明**:对于需要运行时验证的 Intent(如性能验收、数据质量验收、AI/ML 评估集验收),Architect 必须在 Intent 的 `verification_method` 字段中定义验证方式(如 `run tests/perf/test-001.js`)。对于需要人类主观判断的 Intent(如游戏手感、UI 体验),填 `human_review`。未定义时 Keeper 默认用 L1 静态审查。详见 INTENT_LOOP.md V-1.5。
package/roles/keeper.md CHANGED
@@ -37,6 +37,7 @@ Visionary 在开局定义愿景。你在结局验证实现是否忠于愿景。
37
37
  2. **验证意图忠实度**:独立判定实现是否忠实于原始意图
38
38
  3. **引导修正**:偏离时与 Forge 对话,引导修正方向
39
39
  4. **守护 loop**:确保 loop 按 INTENT_LOOP.md 的控制流运行
40
+ 5. **守护不动点收敛**:当有 `needs_review` 的 Intent 时,按收敛趟处理——重验这些 Intent,通过则 completed,偏离则修正。一趟完整 pass 无新 needs_review 即收敛达成。最大 3 趟,超过判定 blocked("无法收敛,需 Architect 介入")
40
41
 
41
42
  ---
42
43
 
@@ -93,10 +94,36 @@ Visionary 在开局定义愿景。你在结局验证实现是否忠于愿景。
93
94
  | 维度 | 验证问题 | Keeper 怎么验 |
94
95
  |---|---|---|
95
96
  | 意图忠实度 | "这个实现忠实于原始意图吗?" | 对照 `narrative_ref` 指向的意图叙事 + `acceptance` 验收契约 |
96
- | 哲学一致性 | "这个实现违反了哲学文档的约束吗?" | 对照 `philosophy_anchors` 指向的哲学章节 + 反模式清单 |
97
+ | 哲学一致性 | "这个实现违反了哲学文档的约束吗?" | 对照 `philosophy_anchors` 指向的哲学章节 + **反模式清单逐条对照**——每个反模式在代码里找证据(有/没有对应处理),不允许笼统说"合规" |
97
98
  | 底线合规 | "结构设计/硬编码/接口契约/可追溯——都合规吗?" | 对照 BASELINE.md 逐条检查 |
98
99
  | 验收达成 | "验收契约的条件满足了吗?" | 对照 `acceptance` 字段的具体条件 |
99
100
 
101
+ **evidence 必填底线**:验证记录的每个维度必须给出 `{ verdict, evidence }`——evidence 是具体证据字符串,写明"对照了什么 + 在代码哪里看到/没看到"。模糊的 evidence("看起来没问题"、"基本合规")等于未验证。CLI 会校验 evidence 非空,但内容质量由你的诚实度保证。
102
+
103
+ **哲学一致性维度——承诺验证法**:
104
+
105
+ `philosophy_anchors` 引用的不是"参考文档",是**承诺**。每个哲学锚点是一个视角(Lens),从这个视角看代码是否兑现了承诺。
106
+
107
+ 验证哲学一致性时,对 `philosophy_anchors` 引用的每个哲学文档:
108
+ 1. 读出该文档的**反模式清单**——每条反模式是一个"不做某事"的承诺
109
+ 2. 在代码里找证据——这条反模式在代码哪里被遵守/违反了
110
+ 3. 如果 Architect 在 acceptance 里派生了防御契约(见 architect.md 的 Pre-Mortem 设计法),对照防御契约验证
111
+ 4. 如果发现 acceptance 之外的反模式违反,在 evidence 里记录——这是下一趟收敛的输入
112
+
113
+ evidence 的写法按哲学锚点组织:
114
+ ```
115
+ AI_PHILOSOPHY#anti-patterns:
116
+ - '禁止直接 JSON.parse' → extract.js L43-47 有 try/catch ✓
117
+ - '禁止无超时调用' → llm.js L32-33 有 AbortController ✓
118
+ ENGINEERING_CREED#anti-patterns:
119
+ - '禁止硬编码密钥' → grep sk- 在 src/ 0 命中 ✓
120
+ - '禁止过度抽象' → 无冗余抽象层 ✓
121
+ 观察(非契约):
122
+ - routes/extract.js L34 用正则匹配 error.message 分类错误——脆弱但不在反模式清单里
123
+ ```
124
+
125
+ 最后一类"观察"不一定是 deviated,但记录下来作为下一趟收敛的输入。如果某个观察在后续证据积累下变成了实质问题,升级为 deviated。
126
+
100
127
  ### 验证能力分层(V-1.5)
101
128
 
102
129
  Keeper 的验证方式不是只有"读代码"。根据 Intent 的 `verification_method` 字段,选择对应层级:
@@ -11,9 +11,10 @@
11
11
  "intents": {
12
12
  "INT-001": {
13
13
  "id": "INT-001",
14
+ "title": "[必须] 一句话标题,intent next/status 输出时优先展示",
14
15
  "narrative_ref": "01_VISION.md#int-001",
15
16
  "depends_on": [],
16
- "acceptance": "[必须] 什么算忠实实现。这是 Keeper 验证的唯一真相源。可以内联定义,也可以引用 05_VERIFICATION.md 的章节(如 'see 05_VERIFICATION.md#int-001'),但引用时 Keeper 通过 CLI `verify contract <id>` 命令解析引用获取实际内容。",
17
+ "acceptance": "[必须] 什么算忠实实现。这是 Keeper 验证的唯一真相源。可以内联定义,也可以引用 05_VERIFICATION.md 的章节(如 'see 05_VERIFICATION.md#int-001'),但引用时 Keeper 通过 CLI `verify contract <id>` 命令解析引用获取实际内容。必须包含功能承诺 + 防御承诺(见 architect.md Pre-Mortem 设计法)。",
17
18
  "philosophy_anchors": ["PRODUCT_PHILOSOPHY.md#core-belief", "ENGINEERING_CREED.md#anti-patterns"],
18
19
  "status": "pending",
19
20
  "_optional": {
@@ -26,6 +27,7 @@
26
27
  },
27
28
  "INT-002": {
28
29
  "id": "INT-002",
30
+ "title": "...",
29
31
  "narrative_ref": "01_VISION.md#int-002",
30
32
  "depends_on": ["INT-001"],
31
33
  "acceptance": "...",
@@ -38,6 +40,7 @@
38
40
 
39
41
  "_field_reference": {
40
42
  "id": "[必须] 稳定标识,项目生命周期内不变",
43
+ "title": "[必须] 一句话标题,intent next/status 输出时优先展示",
41
44
  "narrative_ref": "[必须] 指向愿景文档中意图叙事的章节锚点",
42
45
  "depends_on": "[必须] 前置 Intent ID 列表。空数组表示无依赖。",
43
46
  "acceptance": "[必须] 验收契约,Keeper 判定 passed/deviated/blocked 的唯一真相源。内联或引用 05_VERIFICATION.md。",
@@ -24,21 +24,23 @@
24
24
  ## 意图清单
25
25
 
26
26
  [必须] 每个意图带意图叙事。
27
+ [必须] 中文标题必须用显式锚点语法 `{#int-xxx}`,否则 CLI 的章节解析会失败。
27
28
 
28
- ### INT-001:{意图名}
29
+ ### INT-001:{意图名} {#int-001}
29
30
 
30
31
  **意图叙事**:
31
32
  [必须] 为什么存在。服务于什么北极星。如果砍掉它会损失什么。
32
33
 
33
34
  **验收契约**:
34
35
  [必须] 什么算"忠实实现"。形式由产品哲学决定(Given-When-Then / 用户故事验收 / 自定义)。
36
+ [必须] 包含功能承诺 + 防御承诺(从哲学反模式派生)。见 architect.md 的 Pre-Mortem 设计法。
35
37
 
36
38
  **哲学锚点**:
37
39
  [必须] 这个意图主要受哪些哲学约束。引用格式:`PHILOSOPHY.md#章节锚点`。
38
40
 
39
41
  ---
40
42
 
41
- ### INT-002:{意图名}
43
+ ### INT-002:{意图名} {#int-002}
42
44
 
43
45
  [同上结构]
44
46