abelien-harness 0.6.3 → 0.7.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 (53) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/skills/abelien-appearance/SKILL.md +2 -1
  4. package/skills/abelien-clarify/SKILL.md +11 -9
  5. package/skills/abelien-clarify/references/examples.md +3 -3
  6. package/skills/abelien-clarify/scripts/check_result.py +3 -2
  7. package/skills/abelien-clarify/scripts/test_check_result.py +13 -0
  8. package/skills/abelien-guide/SKILL.md +5 -3
  9. package/skills/abelien-hardware/SKILL.md +2 -2
  10. package/skills/abelien-hardware/domain.json +1 -1
  11. package/skills/abelien-hardware/references/hardware-selection/SKILL.md +1 -1
  12. package/skills/abelien-hardware/references/hardware-selection/references/query-contract.md +6 -4
  13. package/skills/abelien-hardware/references/planning-modes.md +1 -1
  14. package/skills/abelien-hardware/references/search-index-format.md +2 -2
  15. package/skills/abelien-hardware/scripts/dimensions.mjs +13 -8
  16. package/skills/abelien-hardware-selection/references/hardware-selection-v2/SKILL.md +1 -1
  17. package/skills/abelien-hardware-selection/references/hardware-selection-v2/references/query-contract.md +6 -4
  18. package/skills/abelien-hardware-selection/references/selection-service-contract.md +2 -2
  19. package/skills/abelien-harness/references/adapter-contract.md +1 -0
  20. package/skills/abelien-harness/scripts/ab.mjs +6 -0
  21. package/skills/abelien-harness/scripts/web/public-read.mjs +32 -11
  22. package/skills/abelien-reference/SKILL.md +7 -4
  23. package/skills/abelien-reference/domain.json +4 -3
  24. package/skills/abelien-reference/fixtures/create.final.json +20 -0
  25. package/skills/abelien-reference/fixtures/restore.collected.json +20 -0
  26. package/skills/abelien-reference/fixtures/restore.final.json +24 -2
  27. package/skills/abelien-reference/references/research-contract.md +20 -11
  28. package/skills/abelien-reference/schemas/reference-evidence.v1.json +18 -4
  29. package/skills/abelien-reference/schemas/reference-judgement.v1.json +6 -6
  30. package/skills/abelien-reference/scripts/evidence.mjs +6 -3
  31. package/skills/abelien-reference/scripts/finalize.mjs +60 -14
  32. package/skills/abelien-reference/scripts/measure.mjs +4 -2
  33. package/skills/abelien-reference/scripts/png.mjs +20 -4
  34. package/skills/abelien-reference/scripts/research.mjs +93 -22
  35. package/skills/abelien-structure/SKILL.md +2 -2
  36. package/skills/abelien-structure/domain.json +1 -1
  37. package/skills/abelien-structure/references/build123d-execution.md +2 -2
  38. package/skills/abelien-structure/references/handoff.md +1 -1
  39. package/skills/abelien-structure/worker/cli-adapter.mjs +56 -13
  40. package/skills/abelien-structure/worker/main.mjs +15 -4
  41. package/skills/abelien-structure/worker/supervisor.mjs +6 -2
  42. package/skills/abelien-workspace/SKILL.md +2 -1
  43. package/skills/abelien-workspace/assets/journey-stage-plan.json +21 -15
  44. package/skills/abelien-workspace/domain.json +1 -1
  45. package/skills/abelien-workspace/references/harness-binding.md +7 -2
  46. package/skills/abelien-workspace/references/prd-contract.md +1 -1
  47. package/skills/abelien-workspace/references/user-journey.md +40 -12
  48. package/skills/abelien-workspace/scripts/journey-next.mjs +17 -5
  49. package/skills/abelien-workspace/workflows/definitions/748a70482fb2f775f6e5fd942c7873534cf3e59614c77381f812a9710d479743.json +1 -0
  50. package/skills/abelien-workspace/workflows/definitions/a1021c217f2894da423f8591842ea9f349bc526ac3119352b4bea02e8dbd42f9.json +1 -0
  51. package/skills/abelien-workspace/workflows/definitions/df147960a3f7c4d631f66a6b91a7891f8a37d25a50322cf09bdc9304195963b0.json +1 -0
  52. package/skills/abelien-workspace/workflows/user-journey-hardware-candidates.json +1 -1
  53. package/skills/abelien-workspace/workflows/user-journey.json +4 -4
@@ -29,7 +29,9 @@ skills/
29
29
  abelien-harness/scripts/ab.mjs 通用 CLI
30
30
  abelien-workspace/SKILL.md 作品业务契约入口
31
31
  abelien-workspace/references/ 完整旅程、PRD 契约、领域模型与本调用说明
32
- abelien-workspace/domain.json 作品域与真实硬件阶段 draft 资源声明
32
+ abelien-workspace/domain.json 作品域、真实硬件阶段 draft 资源与 workspace.journey-next 声明
33
+ abelien-workspace/assets/ 按意图的阶段计划 journey-stage-plan.json(机读,派生自 user-journey.md)
34
+ abelien-workspace/scripts/ journey-next.mjs(阶段计划解释器,纯计算)
33
35
  abelien-workspace/workflows/ 已可执行的线性工作流
34
36
  abelien-hardware-selection/SKILL.md 真实硬件阶段的分类与服务指引
35
37
  ```
@@ -53,6 +55,7 @@ stdout 的 `ok:true` 表示命令取得了回执。workflow 调用还必须检
53
55
 
54
56
  | 用户旅程所需能力 | 当前 Harness 对应与限制 |
55
57
  | --- | --- |
58
+ | 按意图的下一阶段与阶段规则 | `workspace.journey-next`(本包 `domain.json` 唯一的 capability,`ab capability run workspace.journey-next --input '{"intent":"restore","artifacts":{"reference_final":true}}'`):读取[阶段计划](../assets/journey-stage-plan.json),返回下一阶段、`goal`、`directives`、`order`、`completed`、`locks` 与 `plan_version`。纯计算,不联网、不写资源、不读宿主状态;不判断 A1–C,也不代替宿主的结算、计费、预算、保底与幂等守卫。`stage` 只接受本意图的主线阶段与 `side` 旁路阶段,`artifacts`/`locks` 不用时省略、不传 null。阶段计划派生自[完整旅程](user-journey.md),规则以旅程正文为准 |
56
59
  | clarify 需求整理 | 同级 `abelien-clarify`:以当前操作和同版上下文换取 `result / questions / note`,不是 CLI capability,不写资源;结构可用其 `scripts/check_result.py` 校验。共用表达规则在同级 guide 的 references,由 guide 读一次注入。已移除旧 workspace.brief,不提供假澄清 |
57
60
  | 硬件候选检索与提案 | `user-journey-hardware-candidates` → `abelien-hardware`:`hardware.search`(TOS 检索)→ agent 比较整机与零部件候选 → `hardware.finalize`(保存 `hardware-proposal`)。提案不创建正式 `hardware-selection` 门,也不能直接开始算法阶段 |
58
61
  | 正式硬件选型 | `user-journey-hardware` / `user-journey-hardware-algorithm` → `abelien-hardware-selection` → `hardware.select`;本地模块回读真实召回并校验 Agent 判断,返回 hardware-selection;证据不足不可用候选提案代替 |
@@ -64,7 +67,7 @@ stdout 的 `ok:true` 表示命令取得了回执。workflow 调用还必须检
64
67
  | 仿真/Three.js 状态动作 | 宿主须回报同版可用仿真环境或动作播放器;AI 可根据需求和模型能力提出状态/动作编排,由实际播放器校验并执行。当前未注册播放器或仿真 capability;状态定义文本、3D 文件和视频都不能代替可玩的实际响应,也不使用内核 machine 状态冒充演示 |
65
68
  | 当前组合检查 | 通用CLI未注册match_solution;Web product_check覆盖七族并保留明确未知/阻塞。硬件/算法verified不能代替完整组合的实物验证 |
66
69
  | 可选交互邀请卡片 | 按旅程 §4.1 呈现继续细化/先收尾两个选项;宿主须支持非阻塞操作选择,不能直接套用必要 question 的 pending 门禁或完成 handoff 前提。尚未绑定时不声称已弹卡,不虚构 kind/action key |
67
- | 产品卡片发布与跳转 | 目标分层与前端 wire 见 [Agent Card 协议](../../../docs/architecture/question-card.md):clarify/ACL 都不是工具,唯一的 `publish_agent_card` 发布 question 或 handoff;模型只给 action key,Runtime 解析站内 route/白名单 HTTPS 目标,前端须等用户点击。当前该工具尚未注册,可先在宿主询问或给普通链接,但不声称卡片持久化、版本绑定或受控跳转已实现 |
70
+ | 产品问题工具接续与引导 | 见 [Agent Card 协议](../../../docs/architecture/question-card.md):clarify/ACL 不是工具。宿主原生 `publish_agent_card(kind=question)` 持久等待,用户独立 HTTP 提交后以原调用的 tool 结果接续,不包装成 User 答案。2026-10-12 本地 Web v3 接线与 Harness/外部宿主分别核验;当前 Harness broker 尚未注册,handoff 不在本地注册表,不能据文档调用 `ab capability` 或声称受控导航已实现。只在真实完成且宿主已接导航时选择注册 action key,由用户点击 |
68
71
  | 逐轮 PRD 条目维护 | 通用CLI不内置产品写库;Web从已持久facts派生现行七块模板PRD/BOM、来源/假设/未知,不能可靠映射的实现保留同版附录。缺宿主时只交接待登记差异 |
69
72
  | 版本采用、确认及 PRD 导出 | Web product_adopt只接真实同版候选,确认仅用户版本绑定concept命令;租约事务保存私有不可变快照、授权JSON/Markdown导出,主旅程通过可信verifyCompletion核对回执。原生CLI缺宿主仍失败关闭;旧workspace.getPrd/confirmPlan不可替代 |
70
73
 
@@ -87,6 +90,8 @@ Studio 修改与首次创建均不设固定修复次数。沿用同一个 operat
87
90
 
88
91
  点击“随时收尾”由宿主切换成果体验并收起编辑面板,不提交 workflow 完成,也不取消作品。真实任务与确认条件独立保留;后续结果不自动恢复面板或追问。返回编辑、播放/重置演示、查看或导出草稿都不重启主入口、不升产品版本。
89
92
 
93
+ 必要答卡等待只属于宿主工具生命周期:保存原 assistant 调用及私有检查点后结束 HTTP/Worker,收到用户决定后以匹配的 tool 结果发起下一次模型请求。原任务/toolCallId 不随后继物理 run 改变;答卡与发卡都保持 Harness awaiting_agent,不提交 advance。完整 wire、幂等、部分回答、旧卡与安装边界见 Agent Card 协议 §5–§8。
94
+
90
95
  同版确认事件经 B3 复核、快照真实保存且真实交付状态已交代后,按 replySchema 提交一次交接。PRD/BOM/分享/视频分别注明已就绪、进行中、失败或未接入及依据;预订不是必经步骤。若产品已接 `publish_agent_card(handoff)`,可在完成回执后引导用户主动点击“去保存与预约”;未接时只给普通入口,不伪造卡片。页面打开不等于预约、订单或支付成功。内核不解析业务语义或完整 replySchema,但 `completionGuard:workspace.confirmed-snapshot` 必须由可信宿主 `verifyCompletion` 回读确认、当前版本、组合检查、快照与交付状态。未接或未通过时返回 `WORKFLOW_COMPLETION_REQUIRED`,保持 awaiting_agent;普通 resource.put 和模型自填引用不能代替回执。done 仍不代表制造或实物交付通过。C 后修改按真实产品新工作版继续,已 done 的 run 不再 advance。
91
96
 
92
97
  **迁移防误用:** 旧名 `user-journey` 的实例若仍含 25 步、review-views 或 review-plan,保留只读原始 status,不取新版 HTTL 或 advance。v1 重载同名最新定义,不冻结旧定义;不得手改 run 名或 cursor。此禁令**内核已强制**:advance 与 `status --httl` 比对实例记录的步序列与当前同名定义,不同构即报 `WORKFLOW_DRIFTED` 并拒绝(不落盘、不静默跳过未执行步骤);只读 `status`/`list` 不比对,原始状态仍取得到。`user-journey-mock` 定义已删除,其实例也只读原始 status;不重放旧 mock,不改历史文件。真实作品从产品服务回读后按新入口接续。
@@ -40,7 +40,7 @@ GATE 是独立第七块,不硬塞进三个编辑入口,也不新增“量产
40
40
  | 信息 | 维护规则 |
41
41
  | --- | --- |
42
42
  | 稳定身份 | 保留 clarify 的 reaction/limits ID;场景等无独立 ID 的字段按已有契约的稳定路径定位。PRD 行号不是需求身份,REQ 示例号不能替代真实需求 ID |
43
- | 原话与来源 | 保留真实事件引用、需求全文、user/system 来源及 hard/preference;系统假设不能升级成用户原话 |
43
+ | 原话与来源 | 保留真实事件引用、需求全文、user/system 来源及 hard/preference;原生答卡通过工具结果传入时,从受信用户回答事件取原题/明确答案/原文,仍为 user 来源,不靠新 User message 证明归属;系统假设不能升级成用户原话 |
44
44
  | 条目内容 | 明确谁在什么场景、前提、触发、响应、结束/重触发及相关异常;当前未知部分显式留空或待定,不补造 |
45
45
  | 验收/决策口径 | 已知指标、条件及依据随条目登记;未知数值不猜。需用户取舍的问题与仅需工程查证的缺口分开 |
46
46
  | 实现映射 | 关联一个或多个 HW/SPEC/FW/M/3D/GATE 行 ID、实际采用资产与实现依据;多对多,不强制一需求一器件 |
@@ -4,9 +4,9 @@
4
4
 
5
5
  产品首要目标是最快展示可信真实 CAD:优先从 OSS 复用整机、子装配和已选组件,只补建缺失部分;确认没有可用资产才考虑自行建模。无权限、网络失败、摘要失败和宿主不支持导入都不是“没有资产”。原生组件保持真实尺寸;包络、自建模型和真实源件分开标注。已有符合需求的真实 CAD 应尽早只读预览,审查、用户采用和交付独立把关。
6
6
 
7
- 无现成 CAD 的目标文字链为:保存需求 → concept 首图 → hardware 自动选型登记 → real_image 原图绑定 → CAD preview → review → 必要 repair/复检。real_image 是历史 key,不是再次生图;无可用图转入有生图工具的 concept,用户明确重画则建立新执行版本并保留旧产物。未知/在途调用只恢复原身份。硬件待确认项按草稿合同披露,不把整体 verified 作为首图前置。
7
+ 无现成 CAD 的目标文字链为:保存需求 → concept 首图 → hardware 自动选型登记 → real_image 原图绑定 → CAD preview → review → 必要 repair/复检。real_image 是历史 key,不是再次生图;无可用图转入有生图工具的 concept,重试与重画按[图片请求规则](#image-retry-intent)结合上下文处理。未知/在途调用只恢复原身份。硬件待确认项按草稿合同披露,不把整体 verified 作为首图前置。
8
8
 
9
- 前期必要问题用持久问题卡;答复承接原任务、阶段和待执行动作。系统依据落盘结果继续,不在每段末尾询问是否开始下一段。模型不能在绑定阶段调用未注册的生图工具。普通咨询不触发执行。
9
+ 提问时机(2026-10-12 裁定)。首版 CAD 之前默认不向用户提问:按原话和合理默认继续,按默认处理的事项登记为系统假设或待确认项,由宿主展示、用户可随时修改;首版之后,把仍按默认处理的事项合并成一张问题卡。唯一例外:用户提出的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如“必须放进这个卡槽”却没给尺寸)时,可以在首版之前提问,至多一张卡,沿用问题卡上限(最多三题、每题最多三个选项)。问题卡按持久问题工具调用保存;用户独立提交后以原工具调用的结果承接原任务、阶段和待执行动作,等待期间不保持 HTTP/Worker。系统依据落盘结果继续,不在每段末尾询问是否开始下一段。模型不能在绑定阶段调用未注册的生图工具。普通咨询不触发执行。
10
10
 
11
11
  Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原图像素输入及 review 后自动首显属于本地未交付修复。组件资产导入与“审查前自动首显”仍有接线缺口。以上目标不代表宿主已实现,实际准入始终按安装版本读取。具体实现与验证边界由 abelienwebapplication 的 docs/studio-user-journey.md 及实际宿主契约维护;已安装 release 不因源文档更新自动升级。下文 A1–C、通用领域反馈和体验目标按其范围适用,不能覆盖宿主当前受控工具。
12
12
 
@@ -15,6 +15,29 @@ Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原
15
15
 
16
16
  本文由 abelien-workspace 维护,是产品与宿主 Agent 共用的完整用户旅程及判定规则,作为唯一正文维护入口。guide 依据本文组织调用与对话;clarify 负责需求语义。职责与作品上下文见[领域模型](domain-model.md)。A1–C 用于解释用户所处的位置,不要求增加持久化阶段字段,也不代表对应功能已经上线。实际接入情况与旧 MVP 演示的边界集中在附录。
17
17
 
18
+ <a id="image-retry-intent"></a>
19
+
20
+ ### 图片重试、重画与重复调用(2026-10-12)
21
+
22
+ 由当前 Agent 结合用户原话、此前问答、待完成的图片任务和真实回执识别意图,不要求固定关键词或固定句式。问号不等于咨询:“可以再试一次吗?”在图片失败的上下文中可以是执行请求;“为什么失败?”通常是在询问原因。答复“确认”只在能承接此前具体图片请求时沿用该请求,不能因为一个肯定词就扩大授权。只有确实存在多个目标或相互冲突的意图时才澄清,不要求用户换成标准提示词。
23
+
24
+ “如果失败就再试”是条件性执行请求:实际条件成立且宿主状态允许时承接,区别于只讨论假设。需求未变化的重试复用已保存需求与目标,不为重试伪造需求版本;用户确实修改需求时才按 PRD 契约登记变化。
25
+
26
+ | 当前上下文与用户意图 | 承接动作 |
27
+ | --- | --- |
28
+ | 图片未成功,用户要求“再试一下”“继续弄” | 承接原图片任务,先读真实状态;宿主允许新的尝试时才执行重试 |
29
+ | 已有图片,用户要求改变外观或再画一张 | 按修改范围准备新图操作,保留旧产物与未修改内容 |
30
+ | 已有适用图片,用户要求继续选型、建模或后续流程 | 复用原图推进,不自行重画 |
31
+ | 咨询原因、费用、可行性,假设讨论或明确否定生成 | 回答或遵守否定,不提交新的图片操作 |
32
+
33
+ 默认复用已结算且适用的图片。没有新的用户请求或授权范围内确需图片修改的需求变化,不自行重画;不能仅因模型觉得效果不够好、未看到回显、等待太久或后续阶段需要图而另开生成。首图仍遵守现有旅程准入;这些规则不增加生图工具、变体数或宿主权限。
34
+
35
+ 一次用户提交及其触发的处理构成一个请求边界,不是整个会话。工具回执、自动接续、刷新和断线恢复仍承接原请求。请求可以包含用户要求的多步修改;不设每回合或整段会话的次数配额。后续用户再次要求修改或重画是新的请求,可以形成新操作,即使文字相同也不能仅凭文本去重。宿主分配并保存实际请求/操作身份;重复提交同一操作只恢复原结果,不能让模型改 ID 绕过幂等、阶段或预算限制。
36
+
37
+ 意图识别不替代执行准入。unknown、在途或未结算调用只用原 invocation/wait/operation 身份读取和恢复,禁止换身份重发;“再试一次”也不能解除此约束。确定失败时仍先核对计量是否已结算及宿主是否允许新尝试;已成功图片的新修改按宿主当前版本准备新执行。缺少恢复接口时说明缺口,不能把新调用冒充恢复。
38
+
39
+ 费用以真实供应商执行与可信计量为准,失败不代表免费。重复工具调用不应新增同一操作的供应商请求、预算预留或重复结算;合法的新生成仍可能产生费用。意图误判而创建了合法新操作也可能增加费用,预算限制只限制支出、不证明意图正确。宿主保留身份、幂等、来源/版本、状态、预算与结算保护;规则更新不修改计费,也不宣称已安装包自动升级。模型行为、实际供应商提交次数和账务去重由宿主分别验收,本文不是新的计费或状态机实现。
40
+
18
41
  ## 1. 用户最终得到什么
19
42
 
20
43
  用户带着一句硬件创意,或选中一个可二创的参考作品,进入同一套创作流程:明确必要需求,获得可修改的首版起点,通过外观、组件和互动的反复调整,随时收尾进入成果体验;需要继续时回到编辑,满足条件后可确认一份有来源、有版本、保留真实未知项的方案。
@@ -45,7 +68,7 @@ Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原
45
68
  - 浏览可见不等于可以二创。模板、资产及当前使用范围有效,才能载入获授权的作品副本。
46
69
  - 沿用内容标明来源,不冒充用户亲口提出的要求;新作品不继承原作品的确认状态。
47
70
  - 用户已经明确局部改动时,核对上下文后直接处理受影响部分,不重新问一遍全部需求。
48
- - 只选了参考、没有说明意图时,在 A1 明确“做同款”还是“改哪里”。
71
+ - 只选了参考、没有说明意图时,按“做同款”继续并作为系统假设展示,用户可随时改为局部修改;首版之前不为此单独提问(见文首“提问时机”)。
49
72
  - 来源加载失败时保留用户输入和引用,说明缺口;不偷偷换成另一台机器。
50
73
 
51
74
  两种入口共用 A1–C。二创增加的是已有方案上下文,不另建一套旅程。
@@ -65,7 +88,7 @@ Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原
65
88
  - 还原与改现成先识别产品:联网核对型号与规格,并与参考图实测比例交叉核对;向用户展示原产品图与来源后继续。识别有冲突时保留候选,用户切换即为需求修订。还原以真实产品图为外观目标,默认锁定外形尺寸与比例;改现成先展示原产品,再展示修改后的设计。
66
89
  - 新创可参考相似产品的尺寸、结构、器件和实现方式,写明借用了什么、为什么合适、哪些不照搬;找不到完整相似产品时按子系统参考。
67
90
  - §2.1 的图片规则对所有意图有效:来源产品的功能来自可靠规格,只作为候选需求登记,并区分“原产品有这个功能”和“本次要实现这个功能”;目标深度(外观模型、可装配结构、功能样机)按原话推断。
68
- - 意图、目标深度与识别结果在首版之前不单独发问,作为系统假设展示,用户可随时修改。
91
+ - 意图、目标深度与识别结果在首版之前不单独发问,作为系统假设展示,用户可随时修改;它们不属于首版前提问的例外(见文首“提问时机”),首版之后仍有疑问时并入合并问题卡。
69
92
  - 第三方产品图只作参考展示并注明来源,不进入图鉴或公开分享。
70
93
 
71
94
  ## 3. 完整流程与分支
@@ -88,7 +111,7 @@ flowchart TD
88
111
  EDIT -->|具体需求修改| B1
89
112
 
90
113
  ENTRY --> A1{A1:首版需求侧必填字段可推断;落点与完整行为足够;无阻塞歧义或硬要求缺口?}
91
- A1 -->|否| ASK1[只问阻塞首版的用户决定]
114
+ A1 -->|否| ASK1[按合理默认补齐并登记系统假设;仅硬要求缺值、无法默认且会做错时首版前至多一张卡]
92
115
  ASK1 -->|有效答复| A1
93
116
  A1 -->|是| A2[ A2:尽早展示可信 CAD 或概念图,自动选型并更新 PRD 与 BOM ]
94
117
  A2 -.宿主展示条件满足后.-> INVITE[可选细化邀请;不阻塞独立工作]
@@ -145,9 +168,9 @@ PRD 从第一次需求交互开始维护。按 [PRD 定义与逐轮维护契约]
145
168
 
146
169
  | 判断 | 通过标准 | 不通过时做什么 |
147
170
  | --- | --- | --- |
148
- | 需求侧字段可推断 | 首版 PRD/BOM 的全部需求侧必填字段,都能来自用户事实,或有依据、可撤销的系统假设 | 只补会阻塞首版、必须由用户决定的内容 |
149
- | 落点与行为足够 | 能说明设备在哪里使用,在什么事件或状态下,做出什么可感知输出;完整行为没有被一句摘要删减 | 澄清会导向不同方案的用途、行为或落点 |
150
- | 无阻塞歧义和硬要求缺口 | 当前选择无需擅自决定关键意图;用户提出的硬要求没有缺值或矛盾挡住首版 | 明确必要值或要求之间的取舍 |
171
+ | 需求侧字段可推断 | 首版 PRD/BOM 的全部需求侧必填字段,都能来自用户事实,或有依据、可撤销的系统假设 | 按合理默认补齐并登记为系统假设;只有符合首版前提问例外的硬要求缺值才问 |
172
+ | 落点与行为足够 | 能说明设备在哪里使用,在什么事件或状态下,做出什么可感知输出;完整行为没有被一句摘要删减 | 按原话最可能的用途、行为或落点继续,登记为系统假设,首版之后并入合并问题卡 |
173
+ | 无阻塞歧义和硬要求缺口 | 当前选择无需擅自决定关键意图;用户提出的硬要求没有缺值或矛盾挡住首版 | 硬要求缺值且无法合理默认、按默认会做错时,按例外在首版之前至多发一张卡;其余歧义按默认继续,首版之后合并询问 |
151
174
 
152
175
  三项满足就进入 A2,不再问“是否开始生成”;可选交互邀请按 §4.1 核对宿主实际展示门,满足后再发卡,不因需求足够就提前邀请体验。PRD 从已保存需求起可读,不插入必须打开或确认文档的关卡。没有提出问题,不自动等于三项满足。
153
176
 
@@ -157,7 +180,7 @@ PRD 从第一次需求交互开始维护。按 [PRD 定义与逐轮维护契约]
157
180
 
158
181
  型号、价格、库存、接口兼容、算法性能属于工程事实,必须由后续真实资料和检查取得。缺工程事实不应变成要求用户填写料号或保证技术可行的问题。
159
182
 
160
- 例如,“做一个放在桌上、有人靠近就亮灯的东西”已经给出落点与基本闭环;若其余需求侧必填内容可合理推断,即可进入首版,不机械追问预算。仅说“想做一个机器人”则还没有足够方向。
183
+ 例如,“做一个放在桌上、有人靠近就亮灯的东西”已经给出落点与基本闭环;若其余需求侧必填内容可合理推断,即可进入首版,不机械追问预算。仅说“想做一个机器人”时方向不足,按原话最常见的用途给出可撤销的系统假设继续首版,首版之后在合并问题卡中请用户确认或改向,不在首版之前追问。
161
184
 
162
185
  <a id="interaction-refinement"></a>
163
186
 
@@ -193,9 +216,11 @@ AI 补充的是展示编排,须与用户已定义的行为一致并保留系
193
216
 
194
217
  ## 5. A2:尽早交给用户一个可以改的起点
195
218
 
219
+ **机读阶段计划**:A1 通过之后到交付首版这一段,按意图(create/restore/modify/remix)的阶段顺序与各阶段的领域规则,另有机读形式[阶段计划](../assets/journey-stage-plan.json),由 `workspace.journey-next` 解释(调用见 [能力映射](harness-binding.md#当前能力映射))。§2.4 的识别与参考、本节的硬件初选和首版,对应计划的主线 `orders`;由真实结果触发的硬件重选与取舍、保底草模、修复和首版后合并提问,对应计划的旁路 `side`(§5.3、§6、§7)。本文是旅程规则的唯一正文,阶段计划是它的派生:两者不一致时以本文为准,先改本文,再同步阶段计划并升 `plan_version`。
220
+
196
221
  ### 5.1 得到有来源的硬件初选
197
222
 
198
- 首张概念图不等待硬件初选;硬件阶段接收 clarify 的完整 Requirements(context / reaction / limits,保留 source 与 strength),优先寻找可复用整机,再补足未覆盖功能所需的组件;无合适整机时,按功能分类组合组件。数量、硬约束与完整行为一起参与选择,不能只拿摘要或品类标签选型,分类槽位也不等于选定型号。TOS `hardware.search` 可作为候选召回,`hardware.finalize` 只保存 `hardware-proposal`;正式初选唯一走 `abelien-hardware-selection` 的 `hardware.select`,返回正式 `hardware-selection` 后才进入硬件门和算法阶段。
223
+ 首张概念图不等待硬件初选;硬件阶段接收 clarify 的完整 Requirements(context / reaction / limits,保留 source 与 strength),按功能分类为各槽位组合组件;同类整机的配置只作参考,不先套整机(还原现成产品或基于现成产品修改时,才评估整机改造)。数量、硬约束与完整行为一起参与选择,不能只拿摘要或品类标签选型,分类槽位也不等于选定型号。TOS `hardware.search` 可作为候选召回,`hardware.finalize` 只保存 `hardware-proposal`;正式初选唯一走 `abelien-hardware-selection` 的 `hardware.select`,返回正式 `hardware-selection` 后才进入硬件门和算法阶段。
199
224
 
200
225
  返回结果要能说明:选了什么、来自哪里、覆盖哪些行为、还缺什么、哪些只是候选。整机已覆盖的能力不重复采购;只采用某个外壳或结构资产,也不自动采用来源整机的整份 BOM。
201
226
 
@@ -306,10 +331,12 @@ B2 解决的是用户取舍:意图有歧义、硬要求缺值或冲突、是
306
331
  - 必要澄清沿用 clarify 的输出契约:每题最多三个有区别、用户能感知后果的实质选项,始终允许自由输入;可以少于三个,或省略 options 只用自由输入,不为凑选项编造不存在的方案。“暂不决定”只在确实可以保留原状时提供。
307
332
  - 有适用图片配图,无图用文字。换机、换件、加功能的选择不主动夹带价格。
308
333
  - 当前已有待答卡时不叠发另一张;答复必须结合原题、上下文与适用版本消费。
309
- - 部分回答只解决对应事项;自由输入可能是新需求,不能强塞进旧选项。
334
+ - 部分回答只解决明确子集并消费整卡,其余问题由 guide/clarify 按新事实重判;自由输入可能是新需求,不能强塞进旧选项。原生 v3 选项与“其他”原文均作为原调用的 tool 结果,不另发包含答案的 User message;普通聊天仍是 User 消息。
310
335
  - 未答、超时、跳过、“怎么还没好”都不构成授权。“你定/直接做”只覆盖上下文中的具体决定。
311
336
  - 用户说“先别问了”后暂停追问,也不代替他作尚未授权的选择。
312
337
 
338
+ 问题工具接续、原调用证据、版本/归属校验、换版 superseded、暂停追问与旧卡兼容见[Agent Card 协议](../../../docs/architecture/question-card.md)。原文证据来自受信回答事件;工具通道不改变 user 来源。发布/答卡不 advance,不当 approval、生成授权或产品确认;可选邀请不使用必要问题等待机制。
339
+
313
340
  相关决定解决后回 B1 执行、采用、检查。回答本身不代表方案已经修改成功。当前未接卡片发布能力时,可在对话中询问,但不声称已经创建产品卡片或取得版本绑定回执。
314
341
 
315
342
  ## 8. B3:全部必要细化完成,第二次邀请确认
@@ -465,8 +492,9 @@ BOM 记录实际采用的组合,已有整机覆盖的功能不重复计件。
465
492
  | 场景 | 应观察到的结果 |
466
493
  | --- | --- |
467
494
  | 未登录带文字、图片或二创意图进入 | 登录后保留同一次输入和来源,不重复建档;失败可恢复 |
468
- | 只说“想做机器人” | 留 A1,问会改变首版方向的必要问题 |
495
+ | 只说“想做机器人” | 按最常见用途登记系统假设并继续首版,首版前不追问;首版之后在合并问题卡中确认方向 |
469
496
  | 落点与行为明确,其余需求字段可推断 | 直接形成首版,不强问未提出的预算或尺寸 |
497
+ | 用户要求“必须放进这个卡槽”却没给尺寸 | 属于首版前提问的例外:首版之前发一张卡问尺寸(至多一张,最多三题、每题最多三个选项),不按默认尺寸继续 |
470
498
  | 核心需求足够,交互细节尚可完善 | 以选择题卡片提供“继续细化交互/先收尾,体验成果”;不单独展示需求版 PRD,不等待答复才推进 |
471
499
  | 用户未选择交互邀请卡片 | 不新增待答阻塞、不推定偏好、不重复催问;继续已授权的独立工作 |
472
500
  | 用户说“先到这里”,随后首版返回 | 停止交互追问,进入成果体验并保留未定项;真实结果返回不展开面板,不再次邀请,不自动确认或取消 |
@@ -3,9 +3,13 @@
3
3
  // (结算、计费、保底、预算、工具集、幂等),再调用本能力;拿到的 directives 原样附在宿主自己的执行说明之后。
4
4
  import { readFileSync } from "node:fs";
5
5
 
6
- export const PLAN = JSON.parse(readFileSync(new URL("../assets/journey-stage-plan.json", import.meta.url), "utf8"));
6
+ const deepFreeze = value => {
7
+ if (value !== null && typeof value === "object") { for (const child of Object.values(value)) deepFreeze(child); Object.freeze(value); }
8
+ return value;
9
+ };
10
+ // 深冻结:调用方拿到的是共享计划,不能篡改。
11
+ export const PLAN = deepFreeze(JSON.parse(readFileSync(new URL("../assets/journey-stage-plan.json", import.meta.url), "utf8")));
7
12
  const INTENTS = Object.keys(PLAN.orders);
8
- const STAGES = Object.keys(PLAN.stages);
9
13
  const invalid = message => { throw Object.assign(new Error(message), { code: "VALIDATION" }); };
10
14
  const record = value => value !== null && typeof value === "object" && !Array.isArray(value);
11
15
 
@@ -21,18 +25,26 @@ export function stageDirectives(stage, intent, locks) {
21
25
  export function journeyNext({ input }) {
22
26
  if (!record(input) || Object.keys(input).some(key => !["intent", "artifacts", "locks", "stage"].includes(key))) invalid("input accepts intent, artifacts, locks and stage only");
23
27
  if (!INTENTS.includes(input.intent)) invalid(`intent must be one of ${INTENTS.join(", ")}`);
28
+ // 缺省=省略字段;显式给 null 不当缺省。
29
+ if (input.artifacts === null || input.locks === null) invalid("artifacts and locks must be objects; omit them to use the defaults");
24
30
  const artifacts = input.artifacts ?? {};
25
31
  if (!record(artifacts) || Object.entries(artifacts).some(([key, value]) => !PLAN.artifacts.includes(key) || typeof value !== "boolean")) invalid(`artifacts must map ${PLAN.artifacts.join(", ")} to booleans`);
26
32
  const locksIn = input.locks ?? {};
27
33
  if (!record(locksIn) || Object.keys(locksIn).some(key => key !== "shape") || (locksIn.shape !== undefined && typeof locksIn.shape !== "boolean")) invalid("locks accepts shape: boolean only");
28
34
  // Restoring an existing product keeps its outer size and proportions unless the host says otherwise.
29
35
  const locks = { shape: locksIn.shape ?? input.intent === "restore" };
30
- if (input.stage !== undefined && !STAGES.includes(input.stage)) invalid(`stage must be one of ${STAGES.join(", ")}`);
31
36
  const order = PLAN.orders[input.intent];
37
+ // 只接受本意图的主线阶段与计划声明的旁路阶段(side 不分意图);例如 restore 不能取 concept。
38
+ const allowed = [...order, ...PLAN.side];
39
+ if (input.stage !== undefined && !allowed.includes(input.stage)) invalid(`stage for ${input.intent} must be one of ${allowed.join(", ")}`);
32
40
  const done = stage => artifacts[PLAN.completion[stage]] === true;
33
- const stage = input.stage ?? order.find(s => !done(s)) ?? null;
41
+ // 主线按顺序推进:completed 只承认从头连续完成的前缀,下一阶段就是前缀之后的第一段;
42
+ // 前缀之外已有的产物不计入 completed(例如 create 只有概念图时仍从 reference 开始)。
43
+ const firstOpen = order.findIndex(s => !done(s));
44
+ const completed = firstOpen === -1 ? [...order] : order.slice(0, firstOpen);
45
+ const stage = input.stage ?? (firstOpen === -1 ? null : order[firstOpen]);
34
46
  return {
35
47
  plan_version: PLAN.plan_version, intent: input.intent, stage, goal: stage ? PLAN.stages[stage].goal : null,
36
- directives: stage ? stageDirectives(stage, input.intent, locks) : [], order, completed: order.filter(done), locks,
48
+ directives: stage ? stageDirectives(stage, input.intent, locks) : [], order: [...order], completed, locks,
37
49
  };
38
50
  }
@@ -0,0 +1 @@
1
+ {"description":"完整产品旅程入口:从零/有效参考二创 → A1 需求可推断 → A2 首版 PRD/BOM → B1/B2 修改与必要决定 → B3 完整可确认 → C 同版快照与交付。用户可随时收尾进入仿真/Three.js 成果体验,收起编辑面板并保留 PRD 查看/导出入口;展示模式与确认阶段独立。workspace 维护业务条件,由 guide 跨轮调度,按模板逐轮维护 PRD,服务未接入时不假写入。","domain":"abelien-workspace","input":{"optional":{"entry":"scratch | remix;省略时由真实上下文判断,不由内核校验","imageRefs":"用户提供的参考图引用;仅图像不足时补充必要意图","productContextRef":"已有作品的真实上下文引用;恢复时回读最新版本,不把 run.input 当作当前事实","reference":"二创来源:sourceId、sourceRevision、授权范围及真实资产引用;不得伪造或继承原作品确认"},"required":["prompt"]},"journey":{"authority":"../references/user-journey.md","binding":"../references/harness-binding.md","capabilityRoutes":{"algorithm":"user-journey-algorithm;输入已验证硬件与完整 reactions","appearance":"读取 ../../abelien-appearance/SKILL.md:外观/ID editing、轮廓比例、CMF、部位造型、参考匹配及实际看图的视觉审查;图生网格按需调用 3dgen。独立生成成功不等于视觉通过或作品采用","clarify":"读取 ../../abelien-clarify/SKILL.md,整理需求;不是 CLI capability。","hardwareAndAlgorithm":"user-journey-hardware-algorithm;只在完整 reactions 及必要输入具备时使用","hardwareInitial":"user-journey-hardware → abelien-hardware-selection → hardware.search TOS → Agent 证据判断 → 本地 hardware.select;唯一正式初选入口;TOS hardware.search 只提供候选,不能静默替代正式服务","hardwareRevision":"user-journey-hardware-revise;服务需真实可用","productServices":"成果体验模式及面板切换、仿真/动作播放器、PRD 条目写入/回读、视图刷新、草稿/确认版导出、组合检查、版本采用、卡片、确认快照、分享与支付按宿主实际契约;缺失就报告,不用普通 resource.put 冒充业务写入或界面成功","structure":"读取 ../../abelien-structure/SKILL.md:早期空间约束、CAD 复用、必要的 Build123d 建模、装配与几何检查,并向 appearance 提供实际模型渲染。仅使用宿主实际能力,不把本地辅助脚本当成已部署 Web Worker;结构成功不等于外观通过或作品采用 优先从 OSS 按固定 ID/版本复用整机、子装配和组件,确认无可用资产才自建缺失部分;无权限、网络或摘要失败及不支持导入不等于无资产。"},"checkPolicy":{"blockingUnknown":"记录不知道什么、缺什么证据、影响什么;暂停依赖工作,不可确认,独立工作继续。","conflict":"原要求及授权内可解决则 B1 调整复查,否则 B2 取得取舍。","invalid":"无检查、过期/空/不完整检查、运行中或工具失败不能当成 pass 或非阻塞 unknown。","nonBlockingUnknown":"可随概念快照保留,但不得写成通过或实测。","pass":"只认可有证据的覆盖范围,仍核对 B3;设计范围不代表能力已接通。","scope":["行为覆盖","输入输出","运行环境","整体资源","供电联网","结构适配","用户要求"]},"clarify":"../../abelien-clarify/SKILL.md","contractVersion":"2026-10-05","domainModel":"../references/domain-model.md","entries":[{"id":"scratch","rules":["保留原话、图片和限制;文字优先于图片,不从图片擅自增加功能。","登录和失败恢复保留同一次意图与来源,避免重复建档;首次背景问卷不替代需求澄清。"]},{"id":"remix","rules":["核对来源版本、二创授权、3D/BOM/行为和可改范围;浏览可见不等于可编辑。","创建独立作品上下文,不继承来源确认;明确局部修改只处理受影响部分。","来源加载失败保留输入与引用,不暗换起点;无修改意图时按做同款继续并作为系统假设展示,首版之前不为此提问。"]}],"execution":{"cancellation":"仅明确放弃本次运行才 cancel;不喜欢、拒绝候选、继续修改或暂不决定不等于取消。","completion":"同版确认快照实际保存且交代真实交付状态后才 advance;由 completionGuard 调用可信宿主 verifyCompletion 回读证据,缺接口或未通过时保持暂停。文件或分享未就绪可按真实任务状态交接。可发布 handoff 引导用户查看交付或主动进入保存与预约,预订不是必经步骤,跳转不是业务回执。","continuation":"同一 Agent 步骤可以跨多轮对话;用户答复、任务结果和当前版本从宿主/产品回读,run.input 仅为启动快照。","engine":"workflow-v1-linear","interpretation":"journey 为供 Agent 阅读的产品判定契约;内核只执行 steps,不解析这里的阶段、规则、转移或 input.optional,也不校验 replySchema。","legacy":"旧 25 步定义、workspace mock 能力及 draft/quote 样例 FSM 已删除;旧 user-journey 或 user-journey-mock 实例只读原始 status,不取新版 HTTL 或 advance,不改历史文件。","mode":"agent_driven_loop","state":"A1–C 由真实事实推导,不持久化第二套产品 FSM;awaiting_agent 不等于 B2,done 不等于 C。","wait":"缺答案、缺能力、任务运行中或证据未变时保持 awaiting_agent;停止本轮并说明下一步,不空转、不提交假完成。"},"guide":"../../abelien-guide/SKILL.md","interactionInvitation":{"authority":"../references/user-journey.md#interaction-refinement","binding":"使用宿主实际支持的非阻塞选择能力,不虚构已注册卡片 kind 或 action key","eligibility":"按宿主实际版本核对展示条件;不能仅因需求足够就邀请体验尚未加载的主体;不等待最终 PRD 导出,未答不阻塞独立授权工作。","options":["继续细化交互","先收尾,体验成果"],"presentation":"可选选择题卡片,不是 B2 必答问题,不只口头邀请","selection":"继续才询问具体交互;收尾即进入 resultExperience;选择本身不修改需求或确认方案","title":"核心需求已经清楚了,接下来你想?","unanswered":"不代选、不催问、不覆盖必要问题卡;继续已有授权的独立工作"},"prdContract":"../references/prd-contract.md","prdMaintenance":{"boundary":"需求登记不等于实现通过,不为逐轮维护单独展示需求版 PRD 或要求确认文档;契约只供 Agent 阅读,不是内核执行器或已接通的写入 API","operations":["register","amend","withdraw"],"persistence":"按 prdContract 校验基线与事件,保留 ID、来源、未受影响内容及历史,经产品服务写入、回读后刷新同版视图;缺接口只保留待登记差异","startsAt":"A1","template":"读取 prdTemplate 的 source 与 sections:七块总览加需求清单/图片引用,不用三个编辑入口替代文档结构","trigger":"每轮有效需求新增、修改、撤回或澄清答复;领域采用/有效检查返回时刷新关联行"},"prdTemplate":"../assets/prd-template.json","resultExperience":{"authority":"../references/user-journey.md#result-experience","mode":"同一作品的展示模式,不增加 A1–C 阶段,不要求先满足 B3/C,不自动确认、取消或升版","panels":"收起对话、问题卡、配置、组件库及其他全部编辑面板,隐藏面板不占布局或接收焦点;保留作品、体验控制、继续修改及固定 PRD 入口,结果返回不自动展开面板","prd":"编辑与成果体验右上角常驻「PRD/导出」按钮,不随面板收起;主动打开查看/导出草稿或所选确认版,核对版本与文件状态,不要求先确认,关闭回体验","prdHint":"首次收尾在按钮旁轻提示,当前版 PRD 可读且能发起导出才提示“PRD 已整理,可查看或导出”;否则显示整理中、失败或未接入;文件真实可读才提示可下载。提示可消失,按钮常驻,完成后不自动展开文档","returnToEdit":"继续修改恢复原面板布局和作品上下文;单纯模式切换不升版,不重问已明确需求,具体修改才走正常更新回路","simulation":"当前版本有可运行仿真时展示仿真环境,提供真实输入/响应与停止/重置;说明仿真范围,不当实物验证","stateBoundary":"状态定义是播放器编排,保留用户/系统来源,不新增需求或写工程 pass,不复用 workflow 或实体 machine 状态;触发演示不等于修改作品","threeJs":"无可用仿真时,以已有需求或 AI 编排的少量 machine states 驱动 Three.js 可触发的抽象动作;状态、事件、动作、转换与复位绑定同版需求和模型,只用实际播放器支持的能力,不只展示静态模型或转动镜头","trigger":"用户点击随时收尾或明确表达收尾意图;只暂停提问时结合上下文,不自动离开编辑","unavailable":"模型或播放器未就绪时保留可用成果与真实加载/失败状态,不冒充可玩、不强制重新追问;仿真失败仅在行为演示可用时明确切换"},"stages":{"A1":{"allOf":["首版 PRD/BOM 全部需求侧必填字段可由用户事实或有依据、可撤销的系统假设推断","使用落点与完整行为足够明确,摘要不丢失行为","无阻塞歧义或用户硬要求缺口"],"purpose":"基础需求足以推断首版,不让用户填写工程表格","rules":["本轮明确需求按 prdContract 登记/修改/撤回 PRD 条目,保留原话、ID 和来源,不等待选型或确认。","首版 CAD 之前默认不提问:按合理默认继续并登记系统假设,首版之后把仍按默认处理的事项合并成一张问题卡(每次按当前状态重新生成);唯一例外是用户硬要求缺值、无法合理默认且按默认继续会做错(如必须放进某个卡槽却没给尺寸),可在首版之前问,至多一张卡、最多三题、每题最多三个选项;别帮我猜时停用相关默认。","基础需求足够后推进首版;按旅程 §4.1 核对宿主实际展示条件后,用可选选择题卡片邀请继续细化交互或先收尾。PRD 从已保存需求起可读,不强制展开、不增加文档确认关卡。交互已明确或用户已要求停止提问时不重复邀请。","交互细化邀请不生成 B2 待答阻塞;用户未答不推定偏好、不催问,独立且已授权工作可继续。操作选择不修改需求,具体交互答复才交 clarify 整理并更新同一需求。","满足即进入 A2,不再问是否生成;型号、价格、兼容与性能由工程证据取得,不让用户保证。"]},"A2":{"actions":["优先复用符合需求的 OSS 整机、子装配与组件 CAD,核对来源后尽早展示,审查与采用独立;没有可用 CAD 的文字创作先生成概念图,再自动选型并绑定原图构建 CAD。实际宿主缺能力时报告缺口,不能强行调用未注册工具。","完整需求驱动整机优先、剩余功能补组件;无合适整机时有依据地组合组件。","区分候选与实际采用,按真实采用契约形成当前方案。","硬件初版足够即展示可改起点,提供模板七块总览的草稿 PRD 与 BOM 资料入口,不自动展开完整文档,不等待全部 3D;填写提示不作事实。","标明来源、已选项、系统假设和待细化项;第一次邀请改外观、组件或互动。"],"failure":"无候选、来源不足、服务失败按真实缺口处理,不生成假型号或切换 mock。","firstInvitation":{"blocking":false,"rule":"用户不答仍继续输入与授权已具备的独立 3D、算法和结构工作;不是 B2 必答卡。同轮已展示交互邀请选择题卡片时合并,不重复弹卡,用户已要求停止追问时只展示真实结果,不再次邀请;成果体验中保持面板收起。"},"purpose":"尽早展示有来源的阶段产物并补充硬件事实"},"B1":{"cycle":["消费真实事件,必要时更新完整需求并按 prdContract 同轮维护 PRD 条目","领域执行/提案","校验并实际采用","采用变化后更新产品版本,使旧检查失效","对当前完整组合进行有效检查,刷新同版 PRD 的实现与检查列","重判 B1/B2/B3 或等待"],"purpose":"围绕同一方案执行受影响的细化和修改","rules":["颜色、话术等局部变化不机械重选整机;纯咨询、浏览、旋转、发卡、进度和只说继续修改不升版。","冻结区不可改;非冻结区仍需实际资产支持,不把渲染节点选择等同功能器件替换。","换底依据落点、运动方式、包络档根本变化;保留需求,改变硬要求或超出授权先问。","过期结果不得覆盖新版;候选、同意提案、工具成功与实际采用分开。","已采用 A 上的 CAD 修改使用现有受信 Studio broker:同一修改单依次 modification create → tool register → invocation submit/get → receipt get;未知写入只读原身份,不换 operation 或重复付费调用。","B 检查 conflict 后仅在原授权内以 parentCandidateId=B 和原报告 repairBasis 生成 C;整条候选链的 baseline/current 仍是 A,C 通过检查后也须显式采用才成为下一版。","暂停、刷新和接续复用原修改单、invocation、wait、执行定义与根预算;取消只保存回执,重复通知只接续一次,unknown 不自动返工。"]},"B2":{"purpose":"仅为影响当前工作的必要用户决定等待","questionPolicy":{"defaultQuestions":1,"freeText":true,"maxCardsPerTurn":1,"maxIndependentQuestions":3,"optionsPerClarification":3},"rules":["选项须真实、有区别;不能凑造方案,可用暂不决定保留原状。","未答卡不叠发;按原问题、适用版本、答复事件消费。","部分答复只解决对应事项;自由输入可构成新需求。","沉默、超时、跳过、催进度不是授权;你定只覆盖具体上下文。","先别问了就暂停追问;独立且已授权工作可继续。","无卡片接口时仅对话询问,不声称创建了版本绑定卡。"]},"B3":{"allOf":["本次确认范围必要工作完成,无待办/运行中/失败,必要用户决定已解决","每条行为有实现依据,并可写出适用前提、触发、回应、结束/重触发和异常验收例子","当前版草稿 PRD、BOM 可读且必要产物就绪,确认版导出文件另计","当前完整组合检查有效,无未解决冲突和阻塞必要操作或能力承诺的未知"],"invitation":{"freeText":true,"options":["确认这个方案","继续修改"],"rule":"同版无变化不重复邀请;已明确同版确认直接复核;只说继续修改先了解改什么。"},"prohibition":"硬件 verified、没有待答卡、没有冲突或 workflow done 均不能替代四项全真。","purpose":"全部必要细化完成后第二次邀请确认"},"C":{"allOf":["有真实用户确认事件与明确当前版本,卡片答复另须匹配原卡","复核 B3 四项和未决事项;确认附带修改先改,旧确认不复用","真实产品服务已保存同版确认快照并返回可回读回执"],"deliverables":["PRD 按 prdContract 固化同版需求清单、七块总览、资产与证据引用及模板版本,不省略 GATE、不把概念确认当量产通过","BOM 对应实际采用组合,不重复计入整机已覆盖功能","快照与导出分开,真实文件可读才提供下载;失败重试同版,不重新确认","分享与视频绑定同一确认版本,视频每版触发一次;未就绪用真实静态内容与状态,不要求付款"],"preorder":["单份同版报价随确认返回,不设档位,不另设 Agent 询价/重算关卡","主动询价或已有预算才据实讨论价格,不虚构费用","用户主动进入订购页付款,预定金读取收款配置,不硬编码","真实支付和登记回执齐备才称预约成功;确认不是付款授权,付款不代表工程通过或实物交付"],"purpose":"保存同版确认快照,按真实状态交付","revision":"未付款冻结的作品可在保留旧快照后回 B1 形成新工作版;已 done 的入口不得再次 advance。"}},"transitions":[{"from":"entry","to":"A1","when":"新创作或有效参考二创"},{"action":"回答,不修改方案","from":"any","to":"same","when":"纯咨询"},{"action":"推进首版并维护可读 PRD;可选交互邀请另按 §4.1 核对宿主展示条件,不等待邀请答复","from":"A1","to":"A2","when":"三项全真"},{"action":"按 B2 问题规则询问并等待","from":"A1","to":"A1","when":"需要必要意图或硬要求值"},{"action":"首次邀请非阻塞,继续独立工作","from":"A2","to":"B1","when":"真实首版已展示"},{"from":"A2","to":"B2","when":"必须用户取舍"},{"from":"B1","to":"A1","when":"修改使首版需求重新不可推断"},{"from":"B1","to":"A2","when":"需求足够但首版尚未形成"},{"from":"B1","to":"B2","when":"需要必要用户决定"},{"action":"执行并检查;首版未形成时返回 A1/A2","from":"B2","to":"B1","when":"有效答复已消费"},{"from":"B1","to":"B1","when":"授权内仍有可执行工作"},{"action":"保留产物,说明缺口;条件变更后重判","from":"A2|B1","to":"same","when":"缺必要能力/证据或需等真实任务"},{"from":"B1","to":"B3","when":"四项全真"},{"action":"了解改什么,不取消、不升版","from":"B3","to":"B3","when":"只选继续修改"},{"from":"B3|C","to":"B1","when":"具体修改且当前作品未付款冻结"},{"action":"恢复执行或必要决定,不保存无效确认","from":"any","to":"B1|B2","when":"明确确认但尚不满足 B3 或当前版本已变"},{"from":"B3","to":"C","when":"明确同版确认且复核通过、快照保存成功"},{"action":"说明未确认成功,恢复后重新核对版本与 B3","from":"B3","to":"B3","when":"快照保存失败"},{"action":"报告独立真实状态,恢复同版任务,不重复确认","from":"C","to":"C","when":"导出/分享失败或仍生成"},{"action":"按 resultExperience 进入成果体验,收起所有编辑面板,保留需求、未定项和 PRD 查看/导出入口;不自动确认、代选、advance 或 cancel。若同时要求停止执行或明确放弃,按真实意图处理。","from":"any","to":"same","when":"用户点击随时收尾或明确结束交互细化"},{"action":"停止提问并保留当前上下文;是否切成果体验按真实意图,不自动确认、代选或取消","from":"any","to":"same","when":"用户只要求停止追问"},{"action":"按 resultExperience 操作展示模式、播放器或文档;保留当前产品版本和确认状态,具体修改另走需求变更回路","from":"any","to":"same","when":"成果体验中只点击继续修改、触发演示、重置或查看/导出 PRD"},{"from":"any","to":"cancelled","when":"用户明确放弃本次运行"}],"visualCadPolicy":{"assetFailure":"读取失败、无权限、摘要失败和不支持导入不是没有可用 CAD,恢复原引用或报告能力缺口。","authority":"../references/user-journey.md","hostBoundary":"产品目标不是能力声明;按实际注册工具、source-contract 和固定 release 执行。文档更新不自动替换宿主安装包。","imageReuse":"默认复用已结算且适用的原图;缺图显式转入注册生图工具的阶段,用户明确要求重画时在旧调用结算后准备新执行版本。不是永久禁止生图。","preview":"身份和完整性通过的真实 CAD 尽早只读预览;未审查明确标记,视觉/工程审查、显式采用与同版交付分别验收。","priority":"最快展示可信真实 CAD;优先 OSS 整机、子装配和组件,仅补建缺失部分。图片、自建包络和来源 CAD 分别标注。","recovery":"未知/在途调用只恢复原 invocation/wait,不因等待或缺回显重发。"},"workspace":"../SKILL.md"},"name":"user-journey","steps":[{"completionGuard":"workspace.confirmed-snapshot","executor":"agent","id":"drive-product-journey","instruction":"读取同级 abelien-guide/SKILL.md 作为调度与沟通指引;读取 abelien-workspace/SKILL.md 及本包 references/user-journey.md、domain-model.md、prd-contract.md、harness-binding.md 作为业务规则与运行约定;读取 guide 的 references/shared-response-rules.md,并读取本 user-journey.json 的 journey 判定契约(HTTL 不自动带出该字段)。需要理解或修改需求时读取 abelien-clarify/SKILL.md,承接其需求建议并按 workspace 采用及 PRD 契约处理,本轮明确需求及时登记/修改/撤回条目并回读,未接产品写入接口只保留待登记差异;从宿主恢复真实作品、来源、采用版本、待答题、任务和事件。按 A1→A2→B1/B2→B3→C 在本步骤内跨轮驱动,不递归启动 user-journey;从 A1 登记需求,基础需求足够后按 visualCadPolicy 推进阶段产物;PRD 从已保存需求起可读,不强制展开;按旅程 §4.1 和 interactionInvitation 核对宿主实际展示条件后再以选择题卡片邀请细化/收尾,不等待邀请答复;交互已明确或用户已要求停止提问时不重复邀请,用户点击随时收尾或明确收尾时按旅程 §4.2 与 resultExperience 进入成果体验,收起全部编辑面板;有可运行仿真就展示仿真环境,只有 Three.js 时用已有需求或 AI 编排的机器状态驱动真实可触发的抽象动作,保留 PRD 查看及草稿/确认版导出入口;缺播放器或 UI 接口如实说明,不假称可玩。保留需求与未定项,不自动确认、取消或升版;继续修改恢复原布局和上下文。真实硬件初版后按 assets/prd-template.json 七块总览补充已有草稿 PRD/BOM 资料入口,不自动展开完整文档,第一次修改邀请不阻塞,并与交互邀请合并或遵守停止追问约束。已采用设计的局部修改按 harness-binding 的受信序列创建一个 modification,逐步 tool register、invocation submit/get、receipt get;A 固定为采用基线,B conflict 只在原授权内以 B 为 parentCandidateId 和原报告为 repairBasis 生成 C,暂停/刷新/接续复用原身份和根预算,unknown 不返工,C 在现有产品事务显式采用前仍只是候选。实际变更采用后检查当前组合,B3 四项全真才第二次邀请确认。必要问题用 publish_agent_card(question);完成节点有真实回执后可发布 publish_agent_card(handoff),只选择注册 action key,所有跳转由用户点击,打开 checkout/payment 不等于预约、订单或支付成功。缺答案、证据、能力或任务未完成时保留 awaiting_agent 并如实说明,不 advance;继续修改不是 cancel。仅真实同版确认事件经复核、快照保存成功且真实交付状态已告知后,以可回读证据按 replySchema 提交一次交接;不得伪造引用或用 workspace mock 代替。replySchema 为指导而非内核校验,done 仅表示交接完成。只有用户明确放弃运行才 cancel。","replySchema":{"checkRef":"覆盖当前完整组合的有效检查引用","confirmationEventRef":"同版真实用户确认事件引用","delivery":{"bom":"状态及同版文件/任务/错误引用;可读文件才称 ready","prd":"状态及同版文件/任务/错误引用;可读文件才称 ready","share":"状态及同版内容/任务/错误引用,或明确未接入","video":"状态及同版任务/产物/错误引用,或明确未接入"},"nextActions":"仍需恢复的导出/分享任务或用户可选出口,不将预约设为必做","nonBlockingUnknowns":"具体未知、缺失证据与影响的数组;无则空数组","outcome":"confirmed_snapshot_handoff","productRef":"真实作品引用,不是临时 mock draft","revision":"确认的产品版本,不是 runId/digest","snapshotRef":"实际保存、可回读的同版确认快照引用"}}]}
@@ -0,0 +1 @@
1
+ {"name":"user-journey-hardware-candidates","domain":"abelien-workspace","description":"Library recall, suitability review, English Volc query and direct source reads (Prismer switchable, off by default) for unresolved slots, source-bound merge, then candidate proposal","input":{"required":["requirements"]},"steps":[{"id":"record-requirements","executor":"cli","action":"resource.put","args":{"kind":"draft","id":"hardware-candidates-d-{{hash}}","body":{"requirements":"{{input.requirements}}"}}},{"id":"classify-hardware","executor":"agent","instruction":"需求已澄清;requirements 是 clarify 交回的 Requirements:context 为落点与场景,reaction[] 为全部触发→反应,limits[] 每项带 strength。按全部 reaction 推导功能槽位与数量,strength=hard 的 limits 进 hard_constraints,preference 只作排序提示;缺 reaction 或只有品类标签时停止并说明。读取同级 abelien-hardware/SKILL.md,并用其 scripts/load-guide.mjs 依次按需加载 entry、命中的 level1、命中的 level2、contract;只提交功能槽位、数量、受控三级路径和本次硬约束。回复 {\"slots\":[...]},不要提交型号。","replySchema":{"slots":"array"}},{"id":"search-hardware-wikis","executor":"cli","action":"capability.run","args":{"capability":"hardware.search","input":{"operation":"search","query":"{{input.requirements}}","requirements":"{{input.requirements}}","slots":"{{steps.classify-hardware.result.slots}}","policy":{"prefer_system_candidates":true,"top_k_per_slot":8,"include_content":true}}}},{"id":"hardware-knowledge-recalled","executor":"cli","action":"machine.send","args":{"machine":"hardware-recall","event":"confirmRecall","instance":"{{steps.search-hardware-wikis.resource.id}}"}},{"id":"review-hardware-candidates","executor":"agent","instruction":"Read the complete library candidates and original requirements/slots. Review suitability against function and every hard constraint. Reply {\"unresolved_slots\":[{\"slot_id\":\"original slot\",\"reason\":\"no candidates or specific reasons all candidates are unsuitable\",\"query\":\"official model search targeting function/category/key hard constraints\",\"count\":5}]}. Every zero-candidate slot requires supplemental search. All unsuitable candidates also require search. Preserve rechargeable built-in battery, wireless charging, and all other original requirements; do not ask the user to drop a requirement because the catalog is empty. unresolved_slots contains only slots that need search. Omit suitable library slots entirely; never add placeholder rows with an empty query or count=0. Return [] when all slots are suitable. Before committing this review, the trusted host validates the full original requirements, slots and recall with validate-web-search-plan.mjs; a VALIDATION reply preserves this pause so the same run can be corrected. Write every query in English and keep model numbers and manufacturer names; a query containing Chinese, Japanese or Korean characters is rejected by that validation at this same pause. Count is optional, an integer from 1 to 5, and defaults to 5. Do not truncate requirements. The trusted host currently records Prismer as disabled for both the query and source reads: it searches Volc directly and reads source pages over public HTTPS, so PDF/image sources stay unavailable. When the host enables Prismer, Volc runs only after a saved definitive denial, successful empty query or unsent missing Key, and sources are read Prismer-first. Unknown dispatched effects never authorize fallback or a new invocation. Do not supply URLs, credentials, commands or providers. System reuse is optional: poor matches must not force complex whole systems. Concept visuals and the original requirements come first.","replySchema":{"unresolved_slots":"array"}},{"id":"search-hardware-web","executor":"cli","action":"capability.run","args":{"capability":"hardware.web-search","input":{"requirements":"{{input.requirements}}","slots":"{{steps.classify-hardware.result.slots}}","recall_id":"{{steps.search-hardware-wikis.resource.id}}","unresolved_slots":"{{steps.review-hardware-candidates.result.unresolved_slots}}","plan_rules":"volc-english-5"}}},{"id":"extract-web-hardware","executor":"agent","instruction":"Read the persisted hardware-web-evidence pages from search-hardware-web in full. Search Content/snippets/provider official labels are not complete official pages or proof of authority. Extract only manufacturer pages; uncertain source authority remains unknown and third-party mirrors are not official merely because their URL contains a manufacturer domain. Reply {\"candidates\":[{\"slot_id\":\"original slot\",\"page_id\":\"persisted page ID\",\"manufacturer\":\"exact manufacturer\",\"manufacturer_quote\":\"at least 8 source characters\",\"model\":\"exact model\",\"model_quote\":\"at least 8 source characters\",\"parts\":[{\"name\":\"physical part name\",\"name_quote\":\"exact source quote\",\"shape\":\"box|cylinder|sphere|unknown\",\"shape_quote\":\"exact source quote\",\"dimensions_mm\":{\"length\":20,\"width\":12,\"height\":3},\"dimension_quotes\":{\"length\":\"exact quote identifying this part, axis, numeric value and unit\",\"width\":\"exact quote\",\"height\":\"exact quote\"}}]}]}. Quotes must include the exact part/name/shape they support. Each physical part has separate dimensions; cylinders use diameter/height, spheres use diameter. Unknown dimensions are omitted, never invented or defaulted. Conflicting versions and unknown multi-part overall dimensions remain unknown; do not combine contradictory versions. Do not submit page bodies, official/verified/CAD_available/source/geometry claims. Missing reliable pages or no network means candidates empty. This is envelope_only, not true component CAD or engineering verification. For an attributed tuple such as Back Panel: 48mm x 32mm x 0.5mm, add dimensions_quote with the entire exact source string and dimension_axes:[\"length\",\"width\",\"height\"] in original order; dimensions_mm must map each original value/unit to that explicitly declared axis. Preserve alternate imperial tuples in the quote; never use their values as mm or borrow another part's measurements. A 2-value tuple leaves height unknown. A box inferred from dimensions is only an envelope expression: actual part shape and orientation remain unknown. dimension_quotes may be empty for this tuple mode. Never invent coil thickness or total assembly dimensions.","replySchema":{"candidates":"array"}},{"id":"merge-hardware-web","executor":"cli","action":"capability.run","args":{"capability":"hardware.web-merge","input":{"requirements":"{{input.requirements}}","slots":"{{steps.classify-hardware.result.slots}}","recall_id":"{{steps.search-hardware-wikis.resource.id}}","evidence_id":"{{steps.search-hardware-web.resource.id}}","candidates":"{{steps.extract-web-hardware.result.candidates}}"}}},{"id":"select-hardware-from-wikis","executor":"agent","instruction":"读取 context-json 中 merge-hardware-web 的候选和完整 Wiki;按用户硬约束与功能覆盖为各槽位选择零部件;同类整机配置只作参考,不先提出或套用整机(还原、基于现成产品修改或用户明确要求沿用整机时才可提出整机方案),并检查接口、供电、机械、热和软件依赖。只选择候选中的 component_id,不按 draft、selection_gate 或 CAD 状态过滤。召回结果里 unmatched_slots 列出的槽位一个候选都没有:这些槽位必须逐条写进 remaining_slots,status 只能是 needs_confirmation——finalize 会拒绝把无候选槽位静默丢掉的「完整」提案。回复 {\"status\":\"proposed|needs_confirmation\",\"plan_mode\":\"adapt_system|assemble_new\",\"selected_models\":[...],\"coverage_ledger\":[...],\"remaining_slots\":[...],\"unknowns\":[...],\"replacement_plan\":[...]},每个型号带 slot_id、component_id(候选中的真实值)、manufacturer、model、quantity(1–128 的整数,本槽位实际要用几个,缺失或非整数会被 finalize 拒绝)、selection_reason(字符串)和 wiki_evidence(非空字符串数组,逐条引用该候选完整 Wiki 中支持此选择的原文要点);coverage_ledger、remaining_slots、unknowns、replacement_plan 均为数组,没有内容时给空数组。 提案不具有正式选型权限;不能提交 hardware-selected 或据此开始算法选型,须另走 hardware.select。 Read only merge-hardware-web candidates for the final choice. Preserve structured limits.envelope and source strength; dimension metadata/name/selection-line identity are supplied by the trusted finalizer, never invented. Incompatible dimension candidates require replacement; only decision_required (user hard limit, measured/datasheet size, no axis-aligned fit) returns needs_confirmation, other risk/unknown stays advisory and risk candidates rank last. A bus type or count shortfall on trusted data (ELECTRICAL_BUS_UNCONFIRMED) needs confirmation: prefer replacing one side, or explain the expansion or driver board that covers it; ELECTRICAL_SUPPLY_GAP means add a power or regulator part. all_indexed_candidates_rejected is scoped to this indexed category; occupancy is advisory and clear is only coarse single-part screening. Whole-system reuse is optional; a poor match never forces a complex baseline. External IDs are external:<hash>, with source authority and engineering unknowns; envelopes are not component CAD and cannot grant adoption or delivery.","replySchema":{"status":"proposed|needs_confirmation","plan_mode":"adapt_system|assemble_new","selected_models":"array","coverage_ledger":"array","remaining_slots":"array","unknowns":"array","replacement_plan":"array"}},{"id":"finalize-hardware-proposal","executor":"cli","action":"capability.run","args":{"capability":"hardware.finalize","input":{"operation":"create","planning_mode":"auto","requirements":"{{input.requirements}}","slots":"{{steps.classify-hardware.result.slots}}","knowledge_recall":"{{steps.merge-hardware-web.resource.body}}","selection_proposal":"{{steps.select-hardware-from-wikis.result}}"}}},{"id":"record-hardware-proposal","executor":"cli","action":"resource.update","args":{"id":"{{steps.record-requirements.resource.id}}","bodyPatch":{"hardwareProposalId":"{{steps.finalize-hardware-proposal.resource.id}}","hardwareProposalStatus":"{{steps.finalize-hardware-proposal.result.status}}","hardwareProposalRevision":"{{steps.finalize-hardware-proposal.result.revision}}"}}}]}
@@ -0,0 +1 @@
1
+ {"name":"user-journey","domain":"abelien-workspace","description":"完整产品旅程入口:从零/有效参考二创 → A1 需求可推断 → A2 首版 PRD/BOM → B1/B2 修改与必要决定 → B3 完整可确认 → C 同版快照与交付。用户可随时收尾进入仿真/Three.js 成果体验,收起编辑面板并保留 PRD 查看/导出入口;展示模式与确认阶段独立。workspace 维护业务条件,由 guide 跨轮调度,按模板逐轮维护 PRD,服务未接入时不假写入。","input":{"required":["prompt"],"optional":{"entry":"scratch | remix;省略时由真实上下文判断,不由内核校验","productContextRef":"已有作品的真实上下文引用;恢复时回读最新版本,不把 run.input 当作当前事实","reference":"二创来源:sourceId、sourceRevision、授权范围及真实资产引用;不得伪造或继承原作品确认","imageRefs":"用户提供的参考图引用;仅图像不足时补充必要意图"}},"journey":{"contractVersion":"2026-10-05","authority":"../references/user-journey.md","guide":"../../abelien-guide/SKILL.md","binding":"../references/harness-binding.md","execution":{"mode":"agent_driven_loop","engine":"workflow-v1-linear","interpretation":"journey 为供 Agent 阅读的产品判定契约;内核只执行 steps,不解析这里的阶段、规则、转移或 input.optional,也不校验 replySchema。","state":"A1–C 由真实事实推导,不持久化第二套产品 FSM;awaiting_agent 不等于 B2,done 不等于 C。","continuation":"同一 Agent 步骤可以跨多轮对话;用户答复、任务结果和当前版本从宿主/产品回读,run.input 仅为启动快照。","wait":"缺答案、缺能力、任务运行中或证据未变时保持 awaiting_agent;停止本轮并说明下一步,不空转、不提交假完成。","completion":"同版确认快照实际保存且交代真实交付状态后才 advance;由 completionGuard 调用可信宿主 verifyCompletion 回读证据,缺接口或未通过时保持暂停。文件或分享未就绪可按真实任务状态交接。可发布 handoff 引导用户查看交付或主动进入保存与预约,预订不是必经步骤,跳转不是业务回执。","cancellation":"仅明确放弃本次运行才 cancel;不喜欢、拒绝候选、继续修改或暂不决定不等于取消。","legacy":"旧 25 步定义、workspace mock 能力及 draft/quote 样例 FSM 已删除;旧 user-journey 或 user-journey-mock 实例只读原始 status,不取新版 HTTL 或 advance,不改历史文件。"},"entries":[{"id":"scratch","rules":["保留原话、图片和限制;文字优先于图片,不从图片擅自增加功能。","登录和失败恢复保留同一次意图与来源,避免重复建档;首次背景问卷不替代需求澄清。"]},{"id":"remix","rules":["核对来源版本、二创授权、3D/BOM/行为和可改范围;浏览可见不等于可编辑。","创建独立作品上下文,不继承来源确认;明确局部修改只处理受影响部分。","来源加载失败保留输入与引用,不暗换起点;无修改意图时按做同款继续并作为系统假设展示,首版之前不为此提问。"]}],"stages":{"A1":{"purpose":"基础需求足以推断首版,不让用户填写工程表格","allOf":["首版 PRD/BOM 全部需求侧必填字段可由用户事实或有依据、可撤销的系统假设推断","使用落点与完整行为足够明确,摘要不丢失行为","无阻塞歧义或用户硬要求缺口"],"rules":["本轮明确需求按 prdContract 登记/修改/撤回 PRD 条目,保留原话、ID 和来源,不等待选型或确认。","首版 CAD 之前默认不提问:按合理默认继续并登记系统假设,首版之后把仍按默认处理的事项合并成一张问题卡(每次按当前状态重新生成);唯一例外是用户硬要求缺值、无法合理默认且按默认继续会做错(如必须放进某个卡槽却没给尺寸),可在首版之前问,至多一张卡、最多三题、每题最多三个选项;别帮我猜时停用相关默认。","基础需求足够后推进首版;按旅程 §4.1 核对宿主实际展示条件后,用可选选择题卡片邀请继续细化交互或先收尾。PRD 从已保存需求起可读,不强制展开、不增加文档确认关卡。交互已明确或用户已要求停止提问时不重复邀请。","交互细化邀请不生成 B2 待答阻塞;用户未答不推定偏好、不催问,独立且已授权工作可继续。操作选择不修改需求,具体交互答复才交 clarify 整理并更新同一需求。","满足即进入 A2,不再问是否生成;型号、价格、兼容与性能由工程证据取得,不让用户保证。"]},"A2":{"purpose":"尽早展示有来源的阶段产物并补充硬件事实","actions":["优先复用符合需求的 OSS 整机、子装配与组件 CAD,核对来源后尽早展示,审查与采用独立;没有可用 CAD 的文字创作先生成概念图,再自动选型并绑定原图构建 CAD。实际宿主缺能力时报告缺口,不能强行调用未注册工具。","完整需求驱动、按功能槽位有依据地组合组件;同类整机配置只作参考,不先套整机,还原或基于现成产品修改时才评估整机改造。","区分候选与实际采用,按真实采用契约形成当前方案。","硬件初版足够即展示可改起点,提供模板七块总览的草稿 PRD 与 BOM 资料入口,不自动展开完整文档,不等待全部 3D;填写提示不作事实。","标明来源、已选项、系统假设和待细化项;第一次邀请改外观、组件或互动。"],"firstInvitation":{"blocking":false,"rule":"用户不答仍继续输入与授权已具备的独立 3D、算法和结构工作;不是 B2 必答卡。同轮已展示交互邀请选择题卡片时合并,不重复弹卡,用户已要求停止追问时只展示真实结果,不再次邀请;成果体验中保持面板收起。"},"failure":"无候选、来源不足、服务失败按真实缺口处理,不生成假型号或切换 mock。"},"B1":{"purpose":"围绕同一方案执行受影响的细化和修改","cycle":["消费真实事件,必要时更新完整需求并按 prdContract 同轮维护 PRD 条目","领域执行/提案","校验并实际采用","采用变化后更新产品版本,使旧检查失效","对当前完整组合进行有效检查,刷新同版 PRD 的实现与检查列","重判 B1/B2/B3 或等待"],"rules":["颜色、话术等局部变化不机械重选整机;纯咨询、浏览、旋转、发卡、进度和只说继续修改不升版。","冻结区不可改;非冻结区仍需实际资产支持,不把渲染节点选择等同功能器件替换。","换底依据落点、运动方式、包络档根本变化;保留需求,改变硬要求或超出授权先问。","过期结果不得覆盖新版;候选、同意提案、工具成功与实际采用分开。","已采用 A 上的 CAD 修改使用现有受信 Studio broker:同一修改单依次 modification create → tool register → invocation submit/get → receipt get;未知写入只读原身份,不换 operation 或重复付费调用。","B 检查 conflict 后仅在原授权内以 parentCandidateId=B 和原报告 repairBasis 生成 C;整条候选链的 baseline/current 仍是 A,C 通过检查后也须显式采用才成为下一版。","暂停、刷新和接续复用原修改单、invocation、wait、执行定义与根预算;取消只保存回执,重复通知只接续一次,unknown 不自动返工。"]},"B2":{"purpose":"仅为影响当前工作的必要用户决定等待","questionPolicy":{"defaultQuestions":1,"maxCardsPerTurn":1,"maxIndependentQuestions":3,"optionsPerClarification":3,"freeText":true},"rules":["选项须真实、有区别;不能凑造方案,可用暂不决定保留原状。","未答卡不叠发;按原问题、适用版本、答复事件消费。","部分答复只解决对应事项;自由输入可构成新需求。","沉默、超时、跳过、催进度不是授权;你定只覆盖具体上下文。","先别问了就暂停追问;独立且已授权工作可继续。","无卡片接口时仅对话询问,不声称创建了版本绑定卡。"]},"B3":{"purpose":"全部必要细化完成后第二次邀请确认","allOf":["本次确认范围必要工作完成,无待办/运行中/失败,必要用户决定已解决","每条行为有实现依据,并可写出适用前提、触发、回应、结束/重触发和异常验收例子","当前版草稿 PRD、BOM 可读且必要产物就绪,确认版导出文件另计","当前完整组合检查有效,无未解决冲突和阻塞必要操作或能力承诺的未知"],"invitation":{"options":["确认这个方案","继续修改"],"freeText":true,"rule":"同版无变化不重复邀请;已明确同版确认直接复核;只说继续修改先了解改什么。"},"prohibition":"硬件 verified、没有待答卡、没有冲突或 workflow done 均不能替代四项全真。"},"C":{"purpose":"保存同版确认快照,按真实状态交付","allOf":["有真实用户确认事件与明确当前版本,卡片答复另须匹配原卡","复核 B3 四项和未决事项;确认附带修改先改,旧确认不复用","真实产品服务已保存同版确认快照并返回可回读回执"],"deliverables":["PRD 按 prdContract 固化同版需求清单、七块总览、资产与证据引用及模板版本,不省略 GATE、不把概念确认当量产通过","BOM 对应实际采用组合,不重复计入整机已覆盖功能","快照与导出分开,真实文件可读才提供下载;失败重试同版,不重新确认","分享与视频绑定同一确认版本,视频每版触发一次;未就绪用真实静态内容与状态,不要求付款"],"preorder":["单份同版报价随确认返回,不设档位,不另设 Agent 询价/重算关卡","主动询价或已有预算才据实讨论价格,不虚构费用","用户主动进入订购页付款,预定金读取收款配置,不硬编码","真实支付和登记回执齐备才称预约成功;确认不是付款授权,付款不代表工程通过或实物交付"],"revision":"未付款冻结的作品可在保留旧快照后回 B1 形成新工作版;已 done 的入口不得再次 advance。"}},"resultExperience":{"authority":"../references/user-journey.md#result-experience","trigger":"用户点击随时收尾或明确表达收尾意图;只暂停提问时结合上下文,不自动离开编辑","mode":"同一作品的展示模式,不增加 A1–C 阶段,不要求先满足 B3/C,不自动确认、取消或升版","panels":"收起对话、问题卡、配置、组件库及其他全部编辑面板,隐藏面板不占布局或接收焦点;保留作品、体验控制、继续修改及固定 PRD 入口,结果返回不自动展开面板","simulation":"当前版本有可运行仿真时展示仿真环境,提供真实输入/响应与停止/重置;说明仿真范围,不当实物验证","threeJs":"无可用仿真时,以已有需求或 AI 编排的少量 machine states 驱动 Three.js 可触发的抽象动作;状态、事件、动作、转换与复位绑定同版需求和模型,只用实际播放器支持的能力,不只展示静态模型或转动镜头","stateBoundary":"状态定义是播放器编排,保留用户/系统来源,不新增需求或写工程 pass,不复用 workflow 或实体 machine 状态;触发演示不等于修改作品","unavailable":"模型或播放器未就绪时保留可用成果与真实加载/失败状态,不冒充可玩、不强制重新追问;仿真失败仅在行为演示可用时明确切换","prd":"编辑与成果体验右上角常驻「PRD/导出」按钮,不随面板收起;主动打开查看/导出草稿或所选确认版,核对版本与文件状态,不要求先确认,关闭回体验","returnToEdit":"继续修改恢复原面板布局和作品上下文;单纯模式切换不升版,不重问已明确需求,具体修改才走正常更新回路","prdHint":"首次收尾在按钮旁轻提示,当前版 PRD 可读且能发起导出才提示“PRD 已整理,可查看或导出”;否则显示整理中、失败或未接入;文件真实可读才提示可下载。提示可消失,按钮常驻,完成后不自动展开文档"},"checkPolicy":{"scope":["行为覆盖","输入输出","运行环境","整体资源","供电联网","结构适配","用户要求"],"pass":"只认可有证据的覆盖范围,仍核对 B3;设计范围不代表能力已接通。","conflict":"原要求及授权内可解决则 B1 调整复查,否则 B2 取得取舍。","blockingUnknown":"记录不知道什么、缺什么证据、影响什么;暂停依赖工作,不可确认,独立工作继续。","nonBlockingUnknown":"可随概念快照保留,但不得写成通过或实测。","invalid":"无检查、过期/空/不完整检查、运行中或工具失败不能当成 pass 或非阻塞 unknown。"},"transitions":[{"from":"entry","when":"新创作或有效参考二创","to":"A1"},{"from":"any","when":"纯咨询","to":"same","action":"回答,不修改方案"},{"from":"A1","when":"三项全真","to":"A2","action":"推进首版并维护可读 PRD;可选交互邀请另按 §4.1 核对宿主展示条件,不等待邀请答复"},{"from":"A1","when":"需要必要意图或硬要求值","to":"A1","action":"按 B2 问题规则询问并等待"},{"from":"A2","when":"真实首版已展示","to":"B1","action":"首次邀请非阻塞,继续独立工作"},{"from":"A2","when":"必须用户取舍","to":"B2"},{"from":"B1","when":"修改使首版需求重新不可推断","to":"A1"},{"from":"B1","when":"需求足够但首版尚未形成","to":"A2"},{"from":"B1","when":"需要必要用户决定","to":"B2"},{"from":"B2","when":"有效答复已消费","to":"B1","action":"执行并检查;首版未形成时返回 A1/A2"},{"from":"B1","when":"授权内仍有可执行工作","to":"B1"},{"from":"A2|B1","when":"缺必要能力/证据或需等真实任务","to":"same","action":"保留产物,说明缺口;条件变更后重判"},{"from":"B1","when":"四项全真","to":"B3"},{"from":"B3","when":"只选继续修改","to":"B3","action":"了解改什么,不取消、不升版"},{"from":"B3|C","when":"具体修改且当前作品未付款冻结","to":"B1"},{"from":"any","when":"明确确认但尚不满足 B3 或当前版本已变","to":"B1|B2","action":"恢复执行或必要决定,不保存无效确认"},{"from":"B3","when":"明确同版确认且复核通过、快照保存成功","to":"C"},{"from":"B3","when":"快照保存失败","to":"B3","action":"说明未确认成功,恢复后重新核对版本与 B3"},{"from":"C","when":"导出/分享失败或仍生成","to":"C","action":"报告独立真实状态,恢复同版任务,不重复确认"},{"from":"any","when":"用户点击随时收尾或明确结束交互细化","to":"same","action":"按 resultExperience 进入成果体验,收起所有编辑面板,保留需求、未定项和 PRD 查看/导出入口;不自动确认、代选、advance 或 cancel。若同时要求停止执行或明确放弃,按真实意图处理。"},{"from":"any","when":"用户只要求停止追问","to":"same","action":"停止提问并保留当前上下文;是否切成果体验按真实意图,不自动确认、代选或取消"},{"from":"any","when":"成果体验中只点击继续修改、触发演示、重置或查看/导出 PRD","to":"same","action":"按 resultExperience 操作展示模式、播放器或文档;保留当前产品版本和确认状态,具体修改另走需求变更回路"},{"from":"any","when":"用户明确放弃本次运行","to":"cancelled"}],"capabilityRoutes":{"clarify":"读取 ../../abelien-clarify/SKILL.md,整理需求;不是 CLI capability。","hardwareInitial":"user-journey-hardware → abelien-hardware-selection → hardware.search TOS → Agent 证据判断 → 本地 hardware.select;唯一正式初选入口;TOS hardware.search 只提供候选,不能静默替代正式服务","hardwareAndAlgorithm":"user-journey-hardware-algorithm;只在完整 reactions 及必要输入具备时使用","hardwareRevision":"user-journey-hardware-revise;服务需真实可用","algorithm":"user-journey-algorithm;输入已验证硬件与完整 reactions","appearance":"读取 ../../abelien-appearance/SKILL.md:外观/ID editing、轮廓比例、CMF、部位造型、参考匹配及实际看图的视觉审查;图生网格按需调用 3dgen。独立生成成功不等于视觉通过或作品采用","structure":"读取 ../../abelien-structure/SKILL.md:早期空间约束、CAD 复用、必要的 Build123d 建模、装配与几何检查,并向 appearance 提供实际模型渲染。仅使用宿主实际能力,不把本地辅助脚本当成已部署 Web Worker;结构成功不等于外观通过或作品采用 优先从 OSS 按固定 ID/版本复用整机、子装配和组件,确认无可用资产才自建缺失部分;无权限、网络或摘要失败及不支持导入不等于无资产。","productServices":"成果体验模式及面板切换、仿真/动作播放器、PRD 条目写入/回读、视图刷新、草稿/确认版导出、组合检查、版本采用、卡片、确认快照、分享与支付按宿主实际契约;缺失就报告,不用普通 resource.put 冒充业务写入或界面成功"},"workspace":"../SKILL.md","clarify":"../../abelien-clarify/SKILL.md","domainModel":"../references/domain-model.md","prdContract":"../references/prd-contract.md","prdTemplate":"../assets/prd-template.json","prdMaintenance":{"startsAt":"A1","trigger":"每轮有效需求新增、修改、撤回或澄清答复;领域采用/有效检查返回时刷新关联行","operations":["register","amend","withdraw"],"persistence":"按 prdContract 校验基线与事件,保留 ID、来源、未受影响内容及历史,经产品服务写入、回读后刷新同版视图;缺接口只保留待登记差异","template":"读取 prdTemplate 的 source 与 sections:七块总览加需求清单/图片引用,不用三个编辑入口替代文档结构","boundary":"需求登记不等于实现通过,不为逐轮维护单独展示需求版 PRD 或要求确认文档;契约只供 Agent 阅读,不是内核执行器或已接通的写入 API"},"interactionInvitation":{"authority":"../references/user-journey.md#interaction-refinement","presentation":"可选选择题卡片,不是 B2 必答问题,不只口头邀请","title":"核心需求已经清楚了,接下来你想?","options":["继续细化交互","先收尾,体验成果"],"selection":"继续才询问具体交互;收尾即进入 resultExperience;选择本身不修改需求或确认方案","unanswered":"不代选、不催问、不覆盖必要问题卡;继续已有授权的独立工作","binding":"使用宿主实际支持的非阻塞选择能力,不虚构已注册卡片 kind 或 action key","eligibility":"按宿主实际版本核对展示条件;不能仅因需求足够就邀请体验尚未加载的主体;不等待最终 PRD 导出,未答不阻塞独立授权工作。"},"visualCadPolicy":{"authority":"../references/user-journey.md","priority":"最快展示可信真实 CAD;优先 OSS 整机、子装配和组件,仅补建缺失部分。图片、自建包络和来源 CAD 分别标注。","assetFailure":"读取失败、无权限、摘要失败和不支持导入不是没有可用 CAD,恢复原引用或报告能力缺口。","imageReuse":"默认复用已结算且适用的原图;缺图显式转入注册生图工具的阶段,用户明确要求重画时在旧调用结算后准备新执行版本。不是永久禁止生图。","recovery":"未知/在途调用只恢复原 invocation/wait,不因等待或缺回显重发。","preview":"身份和完整性通过的真实 CAD 尽早只读预览;未审查明确标记,视觉/工程审查、显式采用与同版交付分别验收。","hostBoundary":"产品目标不是能力声明;按实际注册工具、source-contract 和固定 release 执行。文档更新不自动替换宿主安装包。"}},"steps":[{"id":"drive-product-journey","executor":"agent","completionGuard":"workspace.confirmed-snapshot","instruction":"读取同级 abelien-guide/SKILL.md 作为调度与沟通指引;读取 abelien-workspace/SKILL.md 及本包 references/user-journey.md、domain-model.md、prd-contract.md、harness-binding.md 作为业务规则与运行约定;读取 guide 的 references/shared-response-rules.md,并读取本 user-journey.json 的 journey 判定契约(HTTL 不自动带出该字段)。需要理解或修改需求时读取 abelien-clarify/SKILL.md,承接其需求建议并按 workspace 采用及 PRD 契约处理,本轮明确需求及时登记/修改/撤回条目并回读,未接产品写入接口只保留待登记差异;从宿主恢复真实作品、来源、采用版本、待答题、任务和事件。按 A1→A2→B1/B2→B3→C 在本步骤内跨轮驱动,不递归启动 user-journey;从 A1 登记需求,基础需求足够后按 visualCadPolicy 推进阶段产物;PRD 从已保存需求起可读,不强制展开;按旅程 §4.1 和 interactionInvitation 核对宿主实际展示条件后再以选择题卡片邀请细化/收尾,不等待邀请答复;交互已明确或用户已要求停止提问时不重复邀请,用户点击随时收尾或明确收尾时按旅程 §4.2 与 resultExperience 进入成果体验,收起全部编辑面板;有可运行仿真就展示仿真环境,只有 Three.js 时用已有需求或 AI 编排的机器状态驱动真实可触发的抽象动作,保留 PRD 查看及草稿/确认版导出入口;缺播放器或 UI 接口如实说明,不假称可玩。保留需求与未定项,不自动确认、取消或升版;继续修改恢复原布局和上下文。真实硬件初版后按 assets/prd-template.json 七块总览补充已有草稿 PRD/BOM 资料入口,不自动展开完整文档,第一次修改邀请不阻塞,并与交互邀请合并或遵守停止追问约束。已采用设计的局部修改按 harness-binding 的受信序列创建一个 modification,逐步 tool register、invocation submit/get、receipt get;A 固定为采用基线,B conflict 只在原授权内以 B 为 parentCandidateId 和原报告为 repairBasis 生成 C,暂停/刷新/接续复用原身份和根预算,unknown 不返工,C 在现有产品事务显式采用前仍只是候选。实际变更采用后检查当前组合,B3 四项全真才第二次邀请确认。必要问题用 publish_agent_card(question);完成节点有真实回执后可发布 publish_agent_card(handoff),只选择注册 action key,所有跳转由用户点击,打开 checkout/payment 不等于预约、订单或支付成功。缺答案、证据、能力或任务未完成时保留 awaiting_agent 并如实说明,不 advance;继续修改不是 cancel。仅真实同版确认事件经复核、快照保存成功且真实交付状态已告知后,以可回读证据按 replySchema 提交一次交接;不得伪造引用或用 workspace mock 代替。replySchema 为指导而非内核校验,done 仅表示交接完成。只有用户明确放弃运行才 cancel。","replySchema":{"outcome":"confirmed_snapshot_handoff","productRef":"真实作品引用,不是临时 mock draft","revision":"确认的产品版本,不是 runId/digest","confirmationEventRef":"同版真实用户确认事件引用","snapshotRef":"实际保存、可回读的同版确认快照引用","checkRef":"覆盖当前完整组合的有效检查引用","delivery":{"prd":"状态及同版文件/任务/错误引用;可读文件才称 ready","bom":"状态及同版文件/任务/错误引用;可读文件才称 ready","share":"状态及同版内容/任务/错误引用,或明确未接入","video":"状态及同版任务/产物/错误引用,或明确未接入"},"nonBlockingUnknowns":"具体未知、缺失证据与影响的数组;无则空数组","nextActions":"仍需恢复的导出/分享任务或用户可选出口,不将预约设为必做"}}]}
@@ -106,7 +106,7 @@
106
106
  {
107
107
  "id": "select-hardware-from-wikis",
108
108
  "executor": "agent",
109
- "instruction": "读取 context-json 中 merge-hardware-web 的候选和完整 Wiki;按用户硬约束、功能覆盖与整机覆盖先提出可复用整机候选,再为剩余槽位选择零部件,并检查接口、供电、机械、热和软件依赖。只选择候选中的 component_id,不按 draft、selection_gate 或 CAD 状态过滤。召回结果里 unmatched_slots 列出的槽位一个候选都没有:这些槽位必须逐条写进 remaining_slots,status 只能是 needs_confirmation——finalize 会拒绝把无候选槽位静默丢掉的「完整」提案。回复 {\"status\":\"proposed|needs_confirmation\",\"plan_mode\":\"adapt_system|assemble_new\",\"selected_models\":[...],\"coverage_ledger\":[...],\"remaining_slots\":[...],\"unknowns\":[...],\"replacement_plan\":[...]},每个型号带 slot_id、component_id(候选中的真实值)、manufacturer、model、quantity(1–128 的整数,本槽位实际要用几个,缺失或非整数会被 finalize 拒绝)、selection_reason(字符串)和 wiki_evidence(非空字符串数组,逐条引用该候选完整 Wiki 中支持此选择的原文要点);coverage_ledger、remaining_slots、unknowns、replacement_plan 均为数组,没有内容时给空数组。 提案不具有正式选型权限;不能提交 hardware-selected 或据此开始算法选型,须另走 hardware.select。 Read only merge-hardware-web candidates for the final choice. Preserve structured limits.envelope and source strength; dimension metadata/name/selection-line identity are supplied by the trusted finalizer, never invented. Incompatible dimension candidates require replacement; only decision_required (user hard limit, measured/datasheet size, no axis-aligned fit) returns needs_confirmation, other risk/unknown stays advisory and risk candidates rank last. A bus type or count shortfall on trusted data (ELECTRICAL_BUS_UNCONFIRMED) needs confirmation: prefer replacing one side, or explain the expansion or driver board that covers it; ELECTRICAL_SUPPLY_GAP means add a power or regulator part. all_indexed_candidates_rejected is scoped to this indexed category; occupancy is advisory and clear is only coarse single-part screening. Whole-system reuse is optional; a poor match never forces a complex baseline. External IDs are external:<hash>, with source authority and engineering unknowns; envelopes are not component CAD and cannot grant adoption or delivery.",
109
+ "instruction": "读取 context-json 中 merge-hardware-web 的候选和完整 Wiki;按用户硬约束与功能覆盖为各槽位选择零部件;同类整机配置只作参考,不先提出或套用整机(还原、基于现成产品修改或用户明确要求沿用整机时才可提出整机方案),并检查接口、供电、机械、热和软件依赖。只选择候选中的 component_id,不按 draft、selection_gate 或 CAD 状态过滤。召回结果里 unmatched_slots 列出的槽位一个候选都没有:这些槽位必须逐条写进 remaining_slots,status 只能是 needs_confirmation——finalize 会拒绝把无候选槽位静默丢掉的「完整」提案。回复 {\"status\":\"proposed|needs_confirmation\",\"plan_mode\":\"adapt_system|assemble_new\",\"selected_models\":[...],\"coverage_ledger\":[...],\"remaining_slots\":[...],\"unknowns\":[...],\"replacement_plan\":[...]},每个型号带 slot_id、component_id(候选中的真实值)、manufacturer、model、quantity(1–128 的整数,本槽位实际要用几个,缺失或非整数会被 finalize 拒绝)、selection_reason(字符串)和 wiki_evidence(非空字符串数组,逐条引用该候选完整 Wiki 中支持此选择的原文要点);coverage_ledger、remaining_slots、unknowns、replacement_plan 均为数组,没有内容时给空数组。 提案不具有正式选型权限;不能提交 hardware-selected 或据此开始算法选型,须另走 hardware.select。 Read only merge-hardware-web candidates for the final choice. Preserve structured limits.envelope and source strength; dimension metadata/name/selection-line identity are supplied by the trusted finalizer, never invented. Incompatible dimension candidates require replacement; only decision_required (user hard limit, measured/datasheet size, no axis-aligned fit) returns needs_confirmation, other risk/unknown stays advisory and risk candidates rank last. A bus type or count shortfall on trusted data (ELECTRICAL_BUS_UNCONFIRMED) needs confirmation: prefer replacing one side, or explain the expansion or driver board that covers it; ELECTRICAL_SUPPLY_GAP means add a power or regulator part. all_indexed_candidates_rejected is scoped to this indexed category; occupancy is advisory and clear is only coarse single-part screening. Whole-system reuse is optional; a poor match never forces a complex baseline. External IDs are external:<hash>, with source authority and engineering unknowns; envelopes are not component CAD and cannot grant adoption or delivery.",
110
110
  "replySchema": {
111
111
  "status": "proposed|needs_confirmation",
112
112
  "plan_mode": "adapt_system|assemble_new",
@@ -42,7 +42,7 @@
42
42
  "rules": [
43
43
  "核对来源版本、二创授权、3D/BOM/行为和可改范围;浏览可见不等于可编辑。",
44
44
  "创建独立作品上下文,不继承来源确认;明确局部修改只处理受影响部分。",
45
- "来源加载失败保留输入与引用,不暗换起点;无修改意图时明确做同款还是改哪里。"
45
+ "来源加载失败保留输入与引用,不暗换起点;无修改意图时按做同款继续并作为系统假设展示,首版之前不为此提问。"
46
46
  ]
47
47
  }
48
48
  ],
@@ -56,7 +56,7 @@
56
56
  ],
57
57
  "rules": [
58
58
  "本轮明确需求按 prdContract 登记/修改/撤回 PRD 条目,保留原话、ID 和来源,不等待选型或确认。",
59
- "只问阻塞首版且必须用户决定的内容;别帮我猜时停用相关默认。",
59
+ "首版 CAD 之前默认不提问:按合理默认继续并登记系统假设,首版之后把仍按默认处理的事项合并成一张问题卡(每次按当前状态重新生成);唯一例外是用户硬要求缺值、无法合理默认且按默认继续会做错(如必须放进某个卡槽却没给尺寸),可在首版之前问,至多一张卡、最多三题、每题最多三个选项;别帮我猜时停用相关默认。",
60
60
  "基础需求足够后推进首版;按旅程 §4.1 核对宿主实际展示条件后,用可选选择题卡片邀请继续细化交互或先收尾。PRD 从已保存需求起可读,不强制展开、不增加文档确认关卡。交互已明确或用户已要求停止提问时不重复邀请。",
61
61
  "交互细化邀请不生成 B2 待答阻塞;用户未答不推定偏好、不催问,独立且已授权工作可继续。操作选择不修改需求,具体交互答复才交 clarify 整理并更新同一需求。",
62
62
  "满足即进入 A2,不再问是否生成;型号、价格、兼容与性能由工程证据取得,不让用户保证。"
@@ -66,7 +66,7 @@
66
66
  "purpose": "尽早展示有来源的阶段产物并补充硬件事实",
67
67
  "actions": [
68
68
  "优先复用符合需求的 OSS 整机、子装配与组件 CAD,核对来源后尽早展示,审查与采用独立;没有可用 CAD 的文字创作先生成概念图,再自动选型并绑定原图构建 CAD。实际宿主缺能力时报告缺口,不能强行调用未注册工具。",
69
- "完整需求驱动整机优先、剩余功能补组件;无合适整机时有依据地组合组件。",
69
+ "完整需求驱动、按功能槽位有依据地组合组件;同类整机配置只作参考,不先套整机,还原或基于现成产品修改时才评估整机改造。",
70
70
  "区分候选与实际采用,按真实采用契约形成当前方案。",
71
71
  "硬件初版足够即展示可改起点,提供模板七块总览的草稿 PRD 与 BOM 资料入口,不自动展开完整文档,不等待全部 3D;填写提示不作事实。",
72
72
  "标明来源、已选项、系统假设和待细化项;第一次邀请改外观、组件或互动。"
@@ -358,7 +358,7 @@
358
358
  "authority": "../references/user-journey.md",
359
359
  "priority": "最快展示可信真实 CAD;优先 OSS 整机、子装配和组件,仅补建缺失部分。图片、自建包络和来源 CAD 分别标注。",
360
360
  "assetFailure": "读取失败、无权限、摘要失败和不支持导入不是没有可用 CAD,恢复原引用或报告能力缺口。",
361
- "imageReuse": "默认复用已结算且适用的原图;缺图显式转入注册生图工具的阶段,用户明确要求重画时在旧调用结算后准备新执行版本。不是永久禁止生图。",
361
+ "imageReuse": "按 authority 的 #image-retry-intent 结合上下文识别重试/重画,不要求固定关键词;默认复用已结算且适用的原图,缺图转入注册生图工具的阶段。咨询、否定和后续推进不自行重画;新尝试仍须宿主状态、版本及预算准入,未知/在途/未结算只恢复原身份。后续用户新修改可形成新操作,同一操作重复调用复用结果,不设回合次数配额。",
362
362
  "recovery": "未知/在途调用只恢复原 invocation/wait,不因等待或缺回显重发。",
363
363
  "preview": "身份和完整性通过的真实 CAD 尽早只读预览;未审查明确标记,视觉/工程审查、显式采用与同版交付分别验收。",
364
364
  "hostBoundary": "产品目标不是能力声明;按实际注册工具、source-contract 和固定 release 执行。文档更新不自动替换宿主安装包。"