abelien-harness 0.6.2 → 0.7.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.
Files changed (53) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/skills/abelien-appearance/SKILL.md +1 -0
  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 +1 -1
  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 +41 -10
  22. package/skills/abelien-reference/SKILL.md +9 -6
  23. package/skills/abelien-reference/domain.json +4 -3
  24. package/skills/abelien-reference/fixtures/create.final.json +22 -2
  25. package/skills/abelien-reference/fixtures/restore.collected.json +26 -3
  26. package/skills/abelien-reference/fixtures/restore.final.json +32 -7
  27. package/skills/abelien-reference/references/research-contract.md +32 -15
  28. package/skills/abelien-reference/schemas/reference-evidence.v1.json +26 -7
  29. package/skills/abelien-reference/schemas/reference-judgement.v1.json +6 -6
  30. package/skills/abelien-reference/scripts/evidence.mjs +28 -7
  31. package/skills/abelien-reference/scripts/finalize.mjs +60 -14
  32. package/skills/abelien-reference/scripts/image-format.mjs +87 -0
  33. package/skills/abelien-reference/scripts/measure.mjs +4 -2
  34. package/skills/abelien-reference/scripts/png.mjs +20 -4
  35. package/skills/abelien-reference/scripts/research.mjs +169 -50
  36. package/skills/abelien-structure/SKILL.md +2 -2
  37. package/skills/abelien-structure/domain.json +1 -1
  38. package/skills/abelien-structure/references/build123d-execution.md +2 -2
  39. package/skills/abelien-structure/references/handoff.md +1 -1
  40. package/skills/abelien-structure/worker/cli-adapter.mjs +56 -13
  41. package/skills/abelien-structure/worker/main.mjs +15 -4
  42. package/skills/abelien-structure/worker/supervisor.mjs +6 -2
  43. package/skills/abelien-workspace/SKILL.md +1 -1
  44. package/skills/abelien-workspace/assets/journey-stage-plan.json +21 -15
  45. package/skills/abelien-workspace/domain.json +1 -1
  46. package/skills/abelien-workspace/references/harness-binding.md +4 -1
  47. package/skills/abelien-workspace/references/user-journey.md +13 -10
  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 +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "abelien.journey-stage-plan.v1",
3
- "plan_version": "2026-10-12.2",
4
- "description": "按意图的作品旅程阶段计划。orders 是自动推进的主线;side 阶段由宿主守卫按真实结果触发。每个阶段的 directives 是领域规则(宿主中立),宿主把它们附在自己的执行说明(工具名、字段)之后,不改写、不删减。",
3
+ "plan_version": "2026-10-12.5",
4
+ "description": "按意图的作品旅程阶段计划。orders 是自动推进的主线;side 阶段由宿主守卫按真实结果触发。每个阶段的 directives 是领域规则(宿主中立),宿主把它们附在自己的执行说明(工具名、字段)之后,不改写、不删减。旅程规则的唯一正文是 references/user-journey.md,本计划是其机读派生:orders 对应 A1 通过之后到交付首版(§2.4、§5),side 对应首版前后由真实结果触发的旁路(§5.3、§6、§7);两处不一致时以正文为准,改正文后同步本计划并升 plan_version。",
5
5
  "artifacts": ["reference_final", "concept_image", "hardware", "appearance_baseline", "cad_candidate", "review"],
6
6
  "orders": {
7
7
  "create": ["reference", "concept", "hardware", "real_image", "cad", "review"],
@@ -24,23 +24,26 @@
24
24
  "goal": "识别用户要的现成产品,并取得规格与逆向资料",
25
25
  "directives": [
26
26
  "调用 reference.research 执行识别与逆向资料检索(用途 identify / teardown;用户给了链接时先读链接),再读取证据,用 reference.finalize 提交识别判断。",
27
- "识别不确定时按最可能的候选继续,保留其他候选供用户切换;不向用户提问。",
28
- "完成后用一两句话说明识别为哪款产品、依据是什么,以及比例核对结果。"
27
+ "识别不确定时按最可能的候选继续,保留其他候选供用户切换;首版之前默认不向用户提问。",
28
+ "例外:用户的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如要求放进某个卡槽却没给尺寸)时,可以在首版之前发一张问题卡;整个首版之前至多一张,最多三题、每题最多三个选项;其余未定项一律按默认处理。",
29
+ "完成后展示识别出的原产品图并注明来源(页面与站点),再用一两句话说明识别为哪款产品、依据是什么,以及比例核对结果。"
29
30
  ]
30
31
  },
31
32
  "reference": {
32
33
  "goal": "检索相似产品,作为尺寸、结构、器件与实现方式的参考",
33
34
  "directives": [
34
35
  "调用 reference.research 检索相似产品(用途 similar),再读取证据,用 reference.finalize 提交借用什么、为什么合适、哪些不照搬。",
35
- "找不到完整的相似产品时,按声学、供电、交互等子系统分别参考,不硬凑数量;不向用户提问。",
36
- "相似产品只作参考,不成为可编辑模板,也不自动采用其 BOM。"
36
+ "找不到完整的相似产品时,按声学、供电、交互等子系统分别参考,不硬凑数量;首版之前默认不向用户提问。",
37
+ "相似产品只作参考,不成为可编辑模板,也不自动采用其 BOM。",
38
+ "例外:用户的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如要求放进某个卡槽却没给尺寸)时,可以在首版之前发一张问题卡;整个首版之前至多一张,最多三题、每题最多三个选项;其余未定项一律按默认处理。"
37
39
  ]
38
40
  },
39
41
  "concept": {
40
42
  "goal": "生成第一张概念图",
41
43
  "directives": [
42
- "按外观目标生成第一张概念图;需求没说到的外观细节按常见做法补全,不向用户提问。",
43
- "出图后用一两句话告诉用户并结束本轮,硬件选型在下一阶段进行。"
44
+ "按外观目标生成第一张概念图;需求没说到的外观细节按常见做法补全,首版之前默认不向用户提问。",
45
+ "出图后用一两句话告诉用户并结束本轮,硬件选型在下一阶段进行。",
46
+ "例外:用户的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如要求放进某个卡槽却没给尺寸)时,可以在首版之前发一张问题卡;整个首版之前至多一张,最多三题、每题最多三个选项;其余未定项一律按默认处理。"
44
47
  ],
45
48
  "variants": {
46
49
  "modify": [
@@ -52,15 +55,17 @@
52
55
  "hardware": {
53
56
  "goal": "为当前需求选型并登记",
54
57
  "directives": [
55
- "主要元器件选定即可;供电、电池、联网方式等用户没说的未定项按推荐默认值选型,并作为待确认项登记,不向用户提问。",
58
+ "主要元器件选定即可;供电、电池、联网方式等用户没说的未定项按推荐默认值选型,并作为待确认项登记,首版之前默认不向用户提问。",
56
59
  "不要修改需求,也不要出图。",
57
- "登记后用一两句话说明选了什么、哪些按默认值处理,然后结束本轮;待确认项在首版之后合并成一张问题卡统一询问。"
60
+ "登记后用一两句话说明选了什么、哪些按默认值处理,然后结束本轮;待确认项在首版之后合并成一张问题卡统一询问。",
61
+ "例外:用户的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如要求放进某个卡槽却没给尺寸)时,可以在首版之前发一张问题卡;整个首版之前至多一张,最多三题、每题最多三个选项;其余未定项一律按默认处理。"
58
62
  ],
59
63
  "variants": {
60
64
  "restore": [
61
- "以参考证据中的来源产品规格与拆解资料为对照逐项选择替代件,区分原件、替代件与未知;主要元器件选定即可,未定项按推荐默认值登记为待确认项,不向用户提问。",
65
+ "以参考证据中的来源产品规格与拆解资料为对照逐项选择替代件,区分原件、替代件与未知;主要元器件选定即可,未定项按推荐默认值登记为待确认项,首版之前默认不向用户提问。",
62
66
  "不要修改需求,也不要出图。",
63
- "登记后用一两句话说明替代关系与默认值,然后结束本轮;待确认项在首版之后合并成一张问题卡统一询问。"
67
+ "登记后用一两句话说明替代关系与默认值,然后结束本轮;待确认项在首版之后合并成一张问题卡统一询问。",
68
+ "例外:用户的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如要求放进某个卡槽却没给尺寸)时,可以在首版之前发一张问题卡;整个首版之前至多一张,最多三题、每题最多三个选项;其余未定项一律按默认处理。"
64
69
  ]
65
70
  }
66
71
  },
@@ -110,7 +115,7 @@
110
115
  ],
111
116
  "locks": {
112
117
  "shape": {
113
- "false": "硬件放得下优先;冲突时可以等比例放大外壳,并记录倍率及依据。",
118
+ "false": "外形未锁定:硬件放得下优先,但外壳只能在 appearance 认可的外观容差内调整尺寸与比例,并记录调整量及依据;超出容差时换件(交回硬件)或把取舍交给用户,不得自行放大外壳。",
114
119
  "true": "外形尺寸与比例已锁定:不得放大或缩小外壳;装不下时停止建模,先交回硬件换件,仍不行再调整结构骨架,改外形必须由用户决定。"
115
120
  }
116
121
  }
@@ -143,9 +148,10 @@
143
148
  ]
144
149
  },
145
150
  "questions": {
146
- "goal": "首版之后合并询问待确认项",
151
+ "goal": "首版之后合并询问按默认处理的事项",
147
152
  "directives": [
148
- "读取已登记的硬件选型,把待确认的未定项合并成一张问题卡:最多三题,每题最多三个可直接选的方案,第一个选项写首版当前采用的默认值并注明“(首版已按此)”。",
153
+ "首版之后,读取已登记的硬件选型与系统假设,把首版之前按默认处理、至今仍按默认处理的事项合并成一张问题卡:最多三题,每题最多三个可直接选的方案,第一个选项写首版当前采用的默认值并注明“(首版已按此)”。",
154
+ "这张卡每次按当前状态重新生成,不是保存的问题队列:用户已改掉或已不再适用的默认不再出现,首版之前按例外问过并已答复的事项不重复询问。",
149
155
  "意图、目标深度或型号识别仍有疑问时,可以作为其中一题,第一个选项写首版采用的判断。",
150
156
  "没有待确认项就不发卡,一两句话说明后结束本轮。",
151
157
  "不要修改需求、重新选型、建模或出图;用户的答复作为对首版的修订处理。"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abelien-workspace",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "作品旅程、PRD 与业务契约;user-journey 由 Agent 驱动,draft 供真实硬件阶段使用;不声明假 PRD、确认、报价或支付能力",
5
5
  "resources": [
6
6
  "draft"
@@ -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;证据不足不可用候选提案代替 |
@@ -6,7 +6,7 @@
6
6
 
7
7
  无现成 CAD 的目标文字链为:保存需求 → concept 首图 → hardware 自动选型登记 → real_image 原图绑定 → CAD preview → review → 必要 repair/复检。real_image 是历史 key,不是再次生图;无可用图转入有生图工具的 concept,用户明确重画则建立新执行版本并保留旧产物。未知/在途调用只恢复原身份。硬件待确认项按草稿合同披露,不把整体 verified 作为首图前置。
8
8
 
9
- 前期必要问题用持久问题卡;答复承接原任务、阶段和待执行动作。系统依据落盘结果继续,不在每段末尾询问是否开始下一段。模型不能在绑定阶段调用未注册的生图工具。普通咨询不触发执行。
9
+ 提问时机(2026-10-12 裁定)。首版 CAD 之前默认不向用户提问:按原话和合理默认继续,按默认处理的事项登记为系统假设或待确认项,由宿主展示、用户可随时修改;首版之后,把仍按默认处理的事项合并成一张问题卡。唯一例外:用户提出的硬要求缺少取值、无法合理默认,且按默认继续会做出错误结果(例如“必须放进这个卡槽”却没给尺寸)时,可以在首版之前提问,至多一张卡,沿用问题卡上限(最多三题、每题最多三个选项)。问题卡持久保存;答复承接原任务、阶段和待执行动作。系统依据落盘结果继续,不在每段末尾询问是否开始下一段。模型不能在绑定阶段调用未注册的生图工具。普通咨询不触发执行。
10
10
 
11
11
  Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原图像素输入及 review 后自动首显属于本地未交付修复。组件资产导入与“审查前自动首显”仍有接线缺口。以上目标不代表宿主已实现,实际准入始终按安装版本读取。具体实现与验证边界由 abelienwebapplication 的 docs/studio-user-journey.md 及实际宿主契约维护;已安装 release 不因源文档更新自动升级。下文 A1–C、通用领域反馈和体验目标按其范围适用,不能覆盖宿主当前受控工具。
12
12
 
@@ -45,7 +45,7 @@ Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原
45
45
  - 浏览可见不等于可以二创。模板、资产及当前使用范围有效,才能载入获授权的作品副本。
46
46
  - 沿用内容标明来源,不冒充用户亲口提出的要求;新作品不继承原作品的确认状态。
47
47
  - 用户已经明确局部改动时,核对上下文后直接处理受影响部分,不重新问一遍全部需求。
48
- - 只选了参考、没有说明意图时,在 A1 明确“做同款”还是“改哪里”。
48
+ - 只选了参考、没有说明意图时,按“做同款”继续并作为系统假设展示,用户可随时改为局部修改;首版之前不为此单独提问(见文首“提问时机”)。
49
49
  - 来源加载失败时保留用户输入和引用,说明缺口;不偷偷换成另一台机器。
50
50
 
51
51
  两种入口共用 A1–C。二创增加的是已有方案上下文,不另建一套旅程。
@@ -65,7 +65,7 @@ Web 已提交基线 91fac59a 仍在 real_image 生图;原图绑定、CAD 原
65
65
  - 还原与改现成先识别产品:联网核对型号与规格,并与参考图实测比例交叉核对;向用户展示原产品图与来源后继续。识别有冲突时保留候选,用户切换即为需求修订。还原以真实产品图为外观目标,默认锁定外形尺寸与比例;改现成先展示原产品,再展示修改后的设计。
66
66
  - 新创可参考相似产品的尺寸、结构、器件和实现方式,写明借用了什么、为什么合适、哪些不照搬;找不到完整相似产品时按子系统参考。
67
67
  - §2.1 的图片规则对所有意图有效:来源产品的功能来自可靠规格,只作为候选需求登记,并区分“原产品有这个功能”和“本次要实现这个功能”;目标深度(外观模型、可装配结构、功能样机)按原话推断。
68
- - 意图、目标深度与识别结果在首版之前不单独发问,作为系统假设展示,用户可随时修改。
68
+ - 意图、目标深度与识别结果在首版之前不单独发问,作为系统假设展示,用户可随时修改;它们不属于首版前提问的例外(见文首“提问时机”),首版之后仍有疑问时并入合并问题卡。
69
69
  - 第三方产品图只作参考展示并注明来源,不进入图鉴或公开分享。
70
70
 
71
71
  ## 3. 完整流程与分支
@@ -88,7 +88,7 @@ flowchart TD
88
88
  EDIT -->|具体需求修改| B1
89
89
 
90
90
  ENTRY --> A1{A1:首版需求侧必填字段可推断;落点与完整行为足够;无阻塞歧义或硬要求缺口?}
91
- A1 -->|否| ASK1[只问阻塞首版的用户决定]
91
+ A1 -->|否| ASK1[按合理默认补齐并登记系统假设;仅硬要求缺值、无法默认且会做错时首版前至多一张卡]
92
92
  ASK1 -->|有效答复| A1
93
93
  A1 -->|是| A2[ A2:尽早展示可信 CAD 或概念图,自动选型并更新 PRD 与 BOM ]
94
94
  A2 -.宿主展示条件满足后.-> INVITE[可选细化邀请;不阻塞独立工作]
@@ -145,9 +145,9 @@ PRD 从第一次需求交互开始维护。按 [PRD 定义与逐轮维护契约]
145
145
 
146
146
  | 判断 | 通过标准 | 不通过时做什么 |
147
147
  | --- | --- | --- |
148
- | 需求侧字段可推断 | 首版 PRD/BOM 的全部需求侧必填字段,都能来自用户事实,或有依据、可撤销的系统假设 | 只补会阻塞首版、必须由用户决定的内容 |
149
- | 落点与行为足够 | 能说明设备在哪里使用,在什么事件或状态下,做出什么可感知输出;完整行为没有被一句摘要删减 | 澄清会导向不同方案的用途、行为或落点 |
150
- | 无阻塞歧义和硬要求缺口 | 当前选择无需擅自决定关键意图;用户提出的硬要求没有缺值或矛盾挡住首版 | 明确必要值或要求之间的取舍 |
148
+ | 需求侧字段可推断 | 首版 PRD/BOM 的全部需求侧必填字段,都能来自用户事实,或有依据、可撤销的系统假设 | 按合理默认补齐并登记为系统假设;只有符合首版前提问例外的硬要求缺值才问 |
149
+ | 落点与行为足够 | 能说明设备在哪里使用,在什么事件或状态下,做出什么可感知输出;完整行为没有被一句摘要删减 | 按原话最可能的用途、行为或落点继续,登记为系统假设,首版之后并入合并问题卡 |
150
+ | 无阻塞歧义和硬要求缺口 | 当前选择无需擅自决定关键意图;用户提出的硬要求没有缺值或矛盾挡住首版 | 硬要求缺值且无法合理默认、按默认会做错时,按例外在首版之前至多发一张卡;其余歧义按默认继续,首版之后合并询问 |
151
151
 
152
152
  三项满足就进入 A2,不再问“是否开始生成”;可选交互邀请按 §4.1 核对宿主实际展示门,满足后再发卡,不因需求足够就提前邀请体验。PRD 从已保存需求起可读,不插入必须打开或确认文档的关卡。没有提出问题,不自动等于三项满足。
153
153
 
@@ -157,7 +157,7 @@ PRD 从第一次需求交互开始维护。按 [PRD 定义与逐轮维护契约]
157
157
 
158
158
  型号、价格、库存、接口兼容、算法性能属于工程事实,必须由后续真实资料和检查取得。缺工程事实不应变成要求用户填写料号或保证技术可行的问题。
159
159
 
160
- 例如,“做一个放在桌上、有人靠近就亮灯的东西”已经给出落点与基本闭环;若其余需求侧必填内容可合理推断,即可进入首版,不机械追问预算。仅说“想做一个机器人”则还没有足够方向。
160
+ 例如,“做一个放在桌上、有人靠近就亮灯的东西”已经给出落点与基本闭环;若其余需求侧必填内容可合理推断,即可进入首版,不机械追问预算。仅说“想做一个机器人”时方向不足,按原话最常见的用途给出可撤销的系统假设继续首版,首版之后在合并问题卡中请用户确认或改向,不在首版之前追问。
161
161
 
162
162
  <a id="interaction-refinement"></a>
163
163
 
@@ -193,9 +193,11 @@ AI 补充的是展示编排,须与用户已定义的行为一致并保留系
193
193
 
194
194
  ## 5. A2:尽早交给用户一个可以改的起点
195
195
 
196
+ **机读阶段计划**: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`。
197
+
196
198
  ### 5.1 得到有来源的硬件初选
197
199
 
198
- 首张概念图不等待硬件初选;硬件阶段接收 clarify 的完整 Requirements(context / reaction / limits,保留 source 与 strength),优先寻找可复用整机,再补足未覆盖功能所需的组件;无合适整机时,按功能分类组合组件。数量、硬约束与完整行为一起参与选择,不能只拿摘要或品类标签选型,分类槽位也不等于选定型号。TOS `hardware.search` 可作为候选召回,`hardware.finalize` 只保存 `hardware-proposal`;正式初选唯一走 `abelien-hardware-selection` 的 `hardware.select`,返回正式 `hardware-selection` 后才进入硬件门和算法阶段。
200
+ 首张概念图不等待硬件初选;硬件阶段接收 clarify 的完整 Requirements(context / reaction / limits,保留 source 与 strength),按功能分类为各槽位组合组件;同类整机的配置只作参考,不先套整机(还原现成产品或基于现成产品修改时,才评估整机改造)。数量、硬约束与完整行为一起参与选择,不能只拿摘要或品类标签选型,分类槽位也不等于选定型号。TOS `hardware.search` 可作为候选召回,`hardware.finalize` 只保存 `hardware-proposal`;正式初选唯一走 `abelien-hardware-selection` 的 `hardware.select`,返回正式 `hardware-selection` 后才进入硬件门和算法阶段。
199
201
 
200
202
  返回结果要能说明:选了什么、来自哪里、覆盖哪些行为、还缺什么、哪些只是候选。整机已覆盖的能力不重复采购;只采用某个外壳或结构资产,也不自动采用来源整机的整份 BOM。
201
203
 
@@ -465,8 +467,9 @@ BOM 记录实际采用的组合,已有整机覆盖的功能不重复计件。
465
467
  | 场景 | 应观察到的结果 |
466
468
  | --- | --- |
467
469
  | 未登录带文字、图片或二创意图进入 | 登录后保留同一次输入和来源,不重复建档;失败可恢复 |
468
- | 只说“想做机器人” | 留 A1,问会改变首版方向的必要问题 |
470
+ | 只说“想做机器人” | 按最常见用途登记系统假设并继续首版,首版前不追问;首版之后在合并问题卡中确认方向 |
469
471
  | 落点与行为明确,其余需求字段可推断 | 直接形成首版,不强问未提出的预算或尺寸 |
472
+ | 用户要求“必须放进这个卡槽”却没给尺寸 | 属于首版前提问的例外:首版之前发一张卡问尺寸(至多一张,最多三题、每题最多三个选项),不按默认尺寸继续 |
470
473
  | 核心需求足够,交互细节尚可完善 | 以选择题卡片提供“继续细化交互/先收尾,体验成果”;不单独展示需求版 PRD,不等待答复才推进 |
471
474
  | 用户未选择交互邀请卡片 | 不新增待答阻塞、不推定偏好、不重复催问;继续已授权的独立工作 |
472
475
  | 用户说“先到这里”,随后首版返回 | 停止交互追问,进入成果体验并保留未定项;真实结果返回不展开面板,不再次邀请,不自动确认或取消 |
@@ -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
  "标明来源、已选项、系统假设和待细化项;第一次邀请改外观、组件或互动。"