@haaaiawd/loom 1.1.0 → 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.
package/cli/src/verify.js CHANGED
@@ -8,9 +8,11 @@ import { getIntent, getEffectiveVerificationEpoch, hasLegacyIntentRevision } fro
8
8
  import { formatIntentRef, resolveIntentRef } from './shared/intent-ref.js';
9
9
  import { resolveQualityProofReference } from './shared/proof-reference.js';
10
10
  import { validateAtelierRecord } from './atelier.js';
11
+ import { assertExpertiseReady } from './expertise-pack.js';
11
12
 
12
13
  /** 合法判定结果 */
13
- const VALID_VERDICTS = ['passed', 'deviated', 'blocked', 'pending_human'];
14
+ const VALID_VERDICTS = ['passed', 'deviated', 'blocked', 'pending_human'];
15
+ const VALID_VERIFICATION_CONTEXTS = ['independent_thread', 'human_review'];
14
16
 
15
17
  /** 每个 Intent 都必须覆盖的基础验证维度。 */
16
18
  const BASE_DIMENSIONS = [
@@ -46,6 +48,7 @@ function getRequiredDimensions(intent) {
46
48
  export function writeVerification(versionDir, verificationsDir, record) {
47
49
  const errors = [];
48
50
  let atelierEvidence = null;
51
+ let expertiseEvidence = null;
49
52
  if (!record.intent_id) errors.push('缺少 intent_id');
50
53
  if (!record.verdict || !VALID_VERDICTS.includes(record.verdict)) {
51
54
  errors.push(`verdict 非法: "${record.verdict}" (合法: ${VALID_VERDICTS.join('|')})`);
@@ -57,6 +60,15 @@ export function writeVerification(versionDir, verificationsDir, record) {
57
60
  errors.push(`Intent ${record.intent_id} 当前状态为 ${intent.status};只能为 in_progress 或 needs_review 的 Intent 写入验证记录`);
58
61
  }
59
62
  const requiredDimensions = getRequiredDimensions(intent);
63
+ if (record.verdict === 'passed') {
64
+ const provenance = record.verification_provenance;
65
+ if (!provenance || typeof provenance !== 'object') {
66
+ errors.push('passed 必须声明 verification_provenance(verified_by + context);实现者自检不能单独闭合 Intent');
67
+ } else {
68
+ if (typeof provenance.verified_by !== 'string' || !provenance.verified_by.trim()) errors.push('verification_provenance.verified_by 必须是非空验证者标识');
69
+ if (!VALID_VERIFICATION_CONTEXTS.includes(provenance.context)) errors.push(`verification_provenance.context 非法: ${provenance.context}(合法: ${VALID_VERIFICATION_CONTEXTS.join('|')})`);
70
+ }
71
+ }
60
72
  // dimensions 结构校验:每个维度必须是 { verdict, evidence } 对象
61
73
  if (record.dimensions) {
62
74
  for (const dim of requiredDimensions) {
@@ -104,6 +116,13 @@ export function writeVerification(versionDir, verificationsDir, record) {
104
116
  errors.push(error.message);
105
117
  }
106
118
  }
119
+ if (record.verdict === 'passed' && intent) {
120
+ try {
121
+ expertiseEvidence = assertExpertiseReady(versionDir, record.intent_id);
122
+ } catch (error) {
123
+ errors.push(`passed 前必须闭合外部能力获取强门: ${error.message}`);
124
+ }
125
+ }
107
126
  if (intent?.quality_strategy === 'atelier' && record.verdict === 'passed') {
108
127
  try {
109
128
  atelierEvidence = validateAtelierRecord(versionDir, record.intent_id);
@@ -155,13 +174,22 @@ export function writeVerification(versionDir, verificationsDir, record) {
155
174
  verification_epoch: getEffectiveVerificationEpoch(intent),
156
175
  verdict: record.verdict,
157
176
  timestamp: record.timestamp,
158
- summary: record.summary,
177
+ summary: record.summary,
178
+ verification_provenance: record.verification_provenance,
159
179
  dimensions: record.dimensions,
160
180
  atelier: atelierEvidence ? {
161
181
  record_ref: `09_ATELIER/${record.intent_id}.json`,
162
182
  stance_revision: atelierEvidence.stance_revision,
163
183
  status: atelierEvidence.status,
164
184
  } : undefined,
185
+ expertise: expertiseEvidence ? {
186
+ record_ref: `10_EXPERTISE_PACKS/${record.intent_id}.json`,
187
+ intent_revision: expertiseEvidence.intent_revision,
188
+ required_node_ids: expertiseEvidence.required_node_ids,
189
+ source_count: expertiseEvidence.source_count,
190
+ capsule_count: expertiseEvidence.capsule_count,
191
+ pack_digest: expertiseEvidence.pack_digest,
192
+ } : undefined,
165
193
  reproduction_command: record.reproduction_command,
166
194
  deviation_detail: record.deviation_detail,
167
195
  reset_suggested: record.reset_suggested,
@@ -226,7 +254,7 @@ export function getAcrossVersionVerificationHistory(currentVersionDir, inputRef)
226
254
 
227
255
  /**
228
256
  * 快捷创建验证记录——Agent 不用手动构造完整 JSON。
229
- * 内部用 summary 填充适用维度的 evidence,生成标准记录格式。
257
+ * 快捷记录只能用于低风险的结构化核验;passed 仍必须显式声明独立验证来源。
230
258
  * @param {string} versionDir — 当前 .loom/v{N}/ 目录
231
259
  * @param {string} verificationsDir — verifications/ 目录路径
232
260
  * @param {string} intentId — 如 "INT-001"
@@ -262,6 +290,7 @@ export function createQuickVerification(versionDir, verificationsDir, intentId,
262
290
  summary,
263
291
  dimensions,
264
292
  reproduction_command: extras.reproduction_command || null,
293
+ verification_provenance: extras.verification_provenance || null,
265
294
  deviation_detail: extras.deviation_detail || null,
266
295
  });
267
296
  }
@@ -110,6 +110,13 @@ Forge 在实现前形成临时 Expertise Pack:
110
110
 
111
111
  Capability Graph 先提供当前 Intent 相关的项目事实、风险、约束和 Capability Brief;Expertise Compiler 再按 Brief 的获取计划加载真实技能、工具或资料。它不把整张图或历史会话当成当前任务上下文。
112
112
 
113
+ 当 capability 显式为 `external_required`,或高影响 capability 未显式豁免时,External
114
+ Acquisition Gate 启用。Forge 只能自行生成 Search Plan,必须实际使用 find skill、
115
+ 网络、官方文档或研究资料获取内容,再把可回查来源与项目化 Capability Capsules 写入
116
+ `.loom/vN/10_EXPERTISE_PACKS/<intent-id>.json`。Graph 不保存固定站点、Skill 或关键词。
117
+ 模型记忆、未打开的搜索摘要和自生成原则不能替代来源。Pack 绑定 Intent revision;Keeper
118
+ 不继承 Capsule 结论,而是重新打开关键来源并在 passed 记录中绑定当前 Pack。
119
+
113
120
  `quality_strategy=atelier` 时运行 Identity Compiler:将项目判断编译为可执行的 Authorial
114
121
  Stance,而不是模仿名人的 Persona。Forge 在 `.loom/vN/09_ATELIER/<intent-id>.json`
115
122
  保存唯一 Atelier Record;普通 Intent 不创建该文件。
@@ -69,6 +69,11 @@ Context Pack 不会清除 Agent 既有记忆。发生冲突时,以 system、de
69
69
  Expertise Pack。Domain、Taste、Author、Critic、Verifier 是按需认知职能,不是新增角色。
70
70
  Author 只在需要形成创作命题时启用,不是常驻 Persona。
71
71
 
72
+ 未显式豁免的高影响专业能力会让 Context Pack 先打开 External Acquisition Gate:Forge
73
+ 从项目事实派生查询并实际检索,将来源化 Capability Capsules 写入当前
74
+ Intent revision 的 `10_EXPERTISE_PACKS`;门闭合后才注入 Author/Atelier。Keeper 只接收
75
+ Pack 的证据入口和计数,必须独立重开关键来源,不继承 Forge 的综合结论。
76
+
72
77
  ### Quality Arena
73
78
 
74
79
  答案明确时直接实现;声明质量提升时保存基线、比较机制不同的候选。完成契约是
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haaaiawd/loom",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "LOOM — 哲学驱动开发框架。Agent 通过 CLI 访问 Intent Map / 哲学 / 验证记录,不直接读文件",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,7 +15,8 @@
15
15
  "templates",
16
16
  "dimensions",
17
17
  "README.md",
18
- "CHANGELOG.md"
18
+ "CHANGELOG.md",
19
+ "EXTERNAL_ACQUISITION_DESIGN.md"
19
20
  ],
20
21
  "publishConfig": {
21
22
  "access": "public",
@@ -29,7 +29,7 @@
29
29
  1. 一个 Intent 产生可观察的完整结果,能独立验证,并可在一次受控工作周期内完成。
30
30
  2. 在创建正式 Intent Map 前,先用 Capability Graph 检查适用的用户旅程、体验、系统、资产、横切质量和风险;每个透镜必须展开、覆盖或明确排除。
31
31
  3. Graph 不是任务列表:未知与调研留在 Graph;只有边界清楚、可独立验证的结果才进入 Intent Map。
32
- 4. 高影响 capability 节点需要外部知识、专业方法或会进入当前 Intent 时,创建短小的 Capability Brief;不要为每个低价值叶子制造文档。
32
+ 4. 高影响 capability 默认进入外部获取强门并创建短小的 Capability Brief;只有证据表明按任务自适应更合适时才显式写 `acquisition_mode: adaptive`,纯内部机械任务可写带理由的 `project_only`。Graph 不保存网站、Skill 或关键词,不为低价值叶子制造文档。
33
33
  5. 每个 Intent 必须回链至少一个 Graph 节点;每个高影响 Graph 节点必须有明确路由。
34
34
  6. 只引入当前目标确实需要的边界和抽象;不为想象中的扩展性提前付费。
35
35
  7. `acceptance` 是完成契约:包含功能承诺、关键失败边界和防御承诺。
@@ -41,7 +41,9 @@
41
41
  12. `creative_scope` 说明 Forge 可以大胆改变什么、必须保持什么。
42
42
  13. 每个高影响 `outcome` 必须用 `validated_by` 连接到一个 `evidence` 节点。该节点必须写出 `verification.method`、`target`、`procedure`、`pass_criteria` 和 `artifact`,并回链负责把证据真正产出的 Intent。`artifact` 必须是当前版本 `verifications/` 或 `08_ASSET_LIBRARY/files/` 中实际存在的文件。`target` 是结果实际被接收、呈现或消费的位置:用户界面、目标宿主、外部系统、交付物或人工验收现场。不能用“接口返回成功”“URL 可访问”替代目标宿主中的可观察结果。
43
43
  14. 对每个重要 Intent 做简短 Pre-Mortem:最可能出现什么“表面完成”,并将其转成
44
- acceptance 或 verification_method
44
+ acceptance 或 verification_method。当 narrative 的核心现象可能被一个更容易实现、但
45
+ 语义不同的代理替换时,写 `semantic_guard`:明确哪种替代不算完成,以及 Keeper 应
46
+ 使用什么反例验证它。它不把 Intent 切成技术碎片,只防止“看似相近”偷换用户结果。
45
47
  15. 新要求、论文/资料发现、Keeper 或 Forge 发现先进入 `07_GRAPH_PROPOSALS/`,带来源、观察证据和候选类型。Architect 明确判定它已被覆盖、需要改 Graph、生成/修订 Intent、改变 acceptance,还是 Minor/Major;不得把候选静默写入正式 Graph。
46
48
  16. 当项目使用素材时,`08_ASSET_LIBRARY/manifest.json` 是唯一可用素材与来源/作者/许可/哈希的真相源。只允许已批准、可验证的本地资产进入交付;若资产构成结果证据,让 evidence 节点与资产记录双向回链。
47
49
  17. `quality_strategy` 缺失等价于 `adaptive`。只有结果确实需要作者命题、媒介原型和独立候选比较时才设为 `atelier`,且必须同时声明 `quality_contract` 与 `creative_scope`。
package/roles/forge.md CHANGED
@@ -45,8 +45,15 @@ Stance。Stance 至少包含 creative thesis、gaze、tension、signature bet、
45
45
  medium grammar、surprise budget、anti-fixation 与 verification lens。人格故事、设计师
46
46
  名号和风格形容词不能替代这些决策。
47
47
 
48
- Context Pack 中出现 Skill 名称只代表可发现。只有实际检查环境并加载后,才算进入
49
- Expertise Pack。Pack 默认只存在于当前工作上下文,不新增项目文件。
48
+ Context Pack 中出现 Skill 名称只代表可发现。若 External Acquisition Gate 为 OPEN,
49
+ 先从 Capability question、项目事实、媒介约束与已观察缺口派生 Search Plan,并实际使用
50
+ find skill、网络、官方文档或研究资料。模型自行生成的常识、未打开的搜索摘要和只有标题的
51
+ 结果不能成为来源。
52
+
53
+ required Pack 写入 `.loom/vN/10_EXPERTISE_PACKS/<intent-id>.json`,只保存来源定位和
54
+ 项目化 Capability Capsules,不复制第三方内容。每个 Capsule 必须直接引用已打开的外部
55
+ 来源并写出规则、决策门、失败模式与验证信号。运行 `loom expertise validate <intent-id>`
56
+ 闭合强门后,才能进入 Author/Atelier 或非机械性实现。
50
57
 
51
58
  Author 的观察先分流:当前命题、机制、媒介语法或候选选择失效,写入 Atelier Record 的
52
59
  `corrections[]` 并递增 `stance_revision`;新的用户结果、约束、研究证据、风险、能力缺口
package/roles/keeper.md CHANGED
@@ -33,6 +33,8 @@ Keeper 默认运行在新的 Agent thread 中。只接收:
33
33
  - BASELINE、acceptance 与按需的 quality_contract。
34
34
  - verification_method、当前产物与可复现入口。
35
35
  - 当前 revision 的验证历史。
36
+ - External Acquisition Gate required 时,读取当前 Expertise Pack 的 evidence binding,
37
+ 重新打开至少一个决定性来源;不继承 Forge 的 Capsule 结论。
36
38
  - `quality_strategy=atelier` 时,读取当前 revision 的 Atelier Record 及其产物引用;不接收
37
39
  Forge 为结果辩护的隐藏推理。
38
40
 
@@ -50,6 +52,8 @@ Keeper 默认运行在新的 Agent thread 中。只接收:
50
52
  | quality_achievement | 仅在存在质量契约时,目标水准是否有证据成立? |
51
53
 
52
54
  每个维度都必须记录“对照了什么、观察到什么、如何复现”。“合规”“没问题”不是证据。
55
+ 若 Intent 声明 `semantic_guard`,Keeper 必须执行其中的反例检查;实现看起来拥有相近
56
+ 控件或数据,不能代替叙事要求的真实现象。
53
57
 
54
58
  若 `continuity_required` 为 true,缺少明确的旧状态、操作和新状态证据时,`preservation_achievement` 不得通过;“页面目前看起来正常”不构成守恒证据。
55
59
  实现方式与 Architect 设想不同不构成偏差,只要公共契约和意图仍成立。
@@ -19,8 +19,9 @@
19
19
 
20
20
  ## 能力获取计划
21
21
 
22
- - 需要的 Skill、工具、官方资料、项目事实或人类输入:
23
- - 为什么这些入口适用于当前节点:
22
+ - 需要回答的专业决策问题:
23
+ - 可用的检索通道、工具、项目事实或人类输入(不在 Brief 写死网站和关键词):
24
+ - Forge 应依据哪些项目信号派生本轮查询:
24
25
  - 不可用时的降级或回流:
25
26
 
26
27
  ## 产出与验证入口
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_meta": {
3
- "_description": "Capability Graph 起点:从项目初衷展开问题面、能力缺口、风险与证据,再编译为 Intent。不是待办列表。",
3
+ "_description": "Capability Graph 起点:从项目初衷展开问题面、能力缺口、风险与证据,再编译为 Intent。capability 可选 acquisition_mode=adaptive|external_required|project_only;Graph 不保存网站、Skill 或搜索词。",
4
4
  "_version": "1.0",
5
5
  "_loom_version": "v1",
6
6
  "_generated_by": "architect",
@@ -0,0 +1,22 @@
1
+ {
2
+ "_meta": {
3
+ "_description": "当前 Intent 的外部能力获取记录。只保存检索计划、来源定位与项目化核心信息,不复制第三方 Skill 或网站内容。",
4
+ "_version": "1.0",
5
+ "_loom_version": "v1",
6
+ "_generated_by": "forge"
7
+ },
8
+ "intent_id": "INT-001",
9
+ "intent_revision": 1,
10
+ "required_capability_refs": [],
11
+ "status": "draft",
12
+ "search_plan": {
13
+ "decision_question": "",
14
+ "project_signals": [],
15
+ "derived_queries": [],
16
+ "constraints": [],
17
+ "stop_condition": ""
18
+ },
19
+ "sources": [],
20
+ "capsules": [],
21
+ "blocker": null
22
+ }
@@ -18,7 +18,7 @@
18
18
  "depends_on": [],
19
19
  "acceptance": "[必须] 完成契约:什么算可观察地完成,包含功能承诺、关键失败边界和防御承诺。可内联或引用 05_VERIFICATION.md。",
20
20
  "continuity_required": "[可选] true:本 Intent 改动既有用户/系统状态,必须在 acceptance 写明保留项与时序验证;验证时额外要求 preservation_achievement。一次性、无既有状态任务省略。",
21
- "quality_contract": "see 05_VERIFICATION.md#int-001-quality",
21
+ "quality_contract": "[可选] 只有声明高于功能正确性的质量目标时才填写;若引用 05_VERIFICATION.md,必须先创建对应章节。",
22
22
  "quality_strategy": "adaptive",
23
23
  "capability_needs": ["visual hierarchy", "responsive interaction"],
24
24
  "creative_scope": "可以改变布局与动效;不得改变业务流程、数据结构和公开接口。",
@@ -58,6 +58,7 @@
58
58
  "quality_strategy": "[可选] adaptive | atelier,缺失等价于 adaptive。atelier 只用于明确需要作者命题、媒介原型和独立候选比较的 Intent,并要求 quality_contract 与 creative_scope。",
59
59
  "capability_needs": "[可选] Expertise Compiler 需要补齐的专业领域字符串数组。",
60
60
  "creative_scope": "[可选] Forge 可以大胆改变什么、必须保持什么。",
61
+ "semantic_guard": "[可选] 当叙事核心容易被相似实现偷换时,写明不算完成的替代物与 Keeper 的反例验证方式。",
61
62
  "philosophy_anchors": "[必须] 哲学文档引用列表。Forge 加载哲学的指引。",
62
63
  "status": "[必须] pending | in_progress | completed | blocked | needs_review",
63
64
  "lifecycle.deprecation": "[可选] { deprecated_at, reason, replacement }。与 status 分离;弃用后 status 保持 completed。",