abelien-harness 0.4.0 → 0.5.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 (32) hide show
  1. package/.env.example +3 -0
  2. package/package.json +1 -1
  3. package/skills/abelien-hardware/SKILL.md +7 -2
  4. package/skills/abelien-hardware/domain.json +3 -3
  5. package/skills/abelien-hardware/references/search-index-format.md +10 -0
  6. package/skills/abelien-hardware/references/search-index-release.md +4 -2
  7. package/skills/abelien-hardware/references/web-evidence-contract.md +2 -2
  8. package/skills/abelien-hardware/scripts/electrical.mjs +125 -0
  9. package/skills/abelien-hardware/scripts/finalize-selection.mjs +5 -1
  10. package/skills/abelien-hardware/scripts/provider-chain-contract.mjs +10 -6
  11. package/skills/abelien-hardware/scripts/search-index-release.mjs +30 -17
  12. package/skills/abelien-hardware/scripts/tos-wiki-search.mjs +4 -2
  13. package/skills/abelien-hardware/scripts/volc-web-search.mjs +6 -1
  14. package/skills/abelien-hardware/scripts/web-common.mjs +4 -1
  15. package/skills/abelien-hardware/scripts/web-provider-chain.mjs +8 -2
  16. package/skills/abelien-hardware/scripts/web-search-plan.mjs +16 -1
  17. package/skills/abelien-hardware/scripts/web-search.mjs +4 -2
  18. package/skills/abelien-hardware-selection/SKILL.md +1 -1
  19. package/skills/abelien-hardware-selection/domain.json +2 -2
  20. package/skills/abelien-hardware-selection/references/selection-service-contract.md +20 -1
  21. package/skills/abelien-hardware-selection/scripts/select.mjs +26 -7
  22. package/skills/abelien-workspace/domain.json +1 -1
  23. package/skills/abelien-workspace/references/hardware-journey-orchestration.md +1 -1
  24. package/skills/abelien-workspace/workflows/definitions/0852e4949f5a6246880c1a26bf5ccaa42f8cda06b960e7c7ce234a0a176878f9.json +229 -0
  25. package/skills/abelien-workspace/workflows/definitions/7c69ea0d51099b1ae947f08b056ea67f5cad6b40ae8bcb00efb496fa5b9d5ed3.json +149 -0
  26. package/skills/abelien-workspace/workflows/definitions/9b5c65ad03fdecc0148931a7677cfa684a3fb04ab2738d6f7a1086a2c79ac86c.json +149 -0
  27. package/skills/abelien-workspace/workflows/definitions/c1b5c6c653f0c4761d51efee923aafbbeea05512e7f35c60f7f7d36ec49fc1d1.json +229 -0
  28. package/skills/abelien-workspace/workflows/definitions/e391e14c14cb39408a0a9e226ed54ffab7a36badea305ae4a3eafbac8124fc02.json +175 -0
  29. package/skills/abelien-workspace/workflows/definitions/fd8ce7074e2044985778446e93153864940bb9465471c1c71c41328cefff70bf.json +175 -0
  30. package/skills/abelien-workspace/workflows/user-journey-hardware-algorithm.json +3 -3
  31. package/skills/abelien-workspace/workflows/user-journey-hardware-candidates.json +3 -3
  32. package/skills/abelien-workspace/workflows/user-journey-hardware.json +3 -3
@@ -0,0 +1,175 @@
1
+ {
2
+ "name": "user-journey-hardware",
3
+ "domain": "abelien-workspace",
4
+ "executionProtocol": "pinned-result-v1",
5
+ "description": "Library recall, suitability review, English Volc query and direct source reads (Prismer switchable, off by default) for unresolved slots, source-bound merge, then the same formal hardware.select and gate",
6
+ "input": {
7
+ "required": [
8
+ "requirements"
9
+ ]
10
+ },
11
+ "steps": [
12
+ {
13
+ "id": "record-requirements",
14
+ "executor": "cli",
15
+ "action": "resource.put",
16
+ "args": {
17
+ "kind": "draft",
18
+ "id": "hardware-d-{{hash}}",
19
+ "body": {
20
+ "requirements": "{{input.requirements}}"
21
+ }
22
+ }
23
+ },
24
+ {
25
+ "id": "classify-hardware",
26
+ "executor": "agent",
27
+ "instruction": "需求已澄清;requirements 是 clarify 的 Requirements:context 为落点与场景,reaction[] 为全部触发→反应,limits[] 每项带 strength。按全部 reaction 推导功能槽位与数量,strength=hard 的 limits 进 hard_constraints,preference 只作排序提示;缺 reaction 或只有品类标签时停止并说明。读取同级 abelien-hardware-selection/SKILL.md,并用其 scripts/load-guide.mjs 依次按需加载 entry、命中的 level1、命中的 level2、contract;仅提交功能槽位、数量、受控三级路径和需求硬约束,不提交型号或猜测数据库事实。回复 {\"slots\":[...]};若需求不足或路径不确定,停止并说明,不能伪造槽位。",
28
+ "replySchema": {
29
+ "slots": "array"
30
+ }
31
+ },
32
+ {
33
+ "id": "search-hardware-wikis",
34
+ "executor": "cli",
35
+ "action": "capability.run",
36
+ "args": {
37
+ "capability": "hardware.search",
38
+ "input": {
39
+ "operation": "search",
40
+ "query": "{{input.requirements}}",
41
+ "requirements": "{{input.requirements}}",
42
+ "slots": "{{steps.classify-hardware.result.slots}}",
43
+ "policy": {
44
+ "prefer_system_candidates": true,
45
+ "top_k_per_slot": 8,
46
+ "include_content": true
47
+ }
48
+ }
49
+ }
50
+ },
51
+ {
52
+ "id": "hardware-knowledge-recalled",
53
+ "executor": "cli",
54
+ "action": "machine.send",
55
+ "args": {
56
+ "machine": "hardware-recall",
57
+ "event": "confirmRecall",
58
+ "instance": "{{steps.search-hardware-wikis.resource.id}}"
59
+ }
60
+ },
61
+ {
62
+ "id": "review-hardware-candidates",
63
+ "executor": "agent",
64
+ "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.",
65
+ "replySchema": {
66
+ "unresolved_slots": "array"
67
+ }
68
+ },
69
+ {
70
+ "id": "search-hardware-web",
71
+ "executor": "cli",
72
+ "action": "capability.run",
73
+ "args": {
74
+ "capability": "hardware.web-search",
75
+ "input": {
76
+ "requirements": "{{input.requirements}}",
77
+ "slots": "{{steps.classify-hardware.result.slots}}",
78
+ "recall_id": "{{steps.search-hardware-wikis.resource.id}}",
79
+ "unresolved_slots": "{{steps.review-hardware-candidates.result.unresolved_slots}}"
80
+ }
81
+ }
82
+ },
83
+ {
84
+ "id": "extract-web-hardware",
85
+ "executor": "agent",
86
+ "instruction": "When pages contain blob_ref, use resource get <evidenceResourceId> --page <pageId> to read each required full original page; never copy page bodies into replies. 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.",
87
+ "replySchema": {
88
+ "candidates": "array"
89
+ }
90
+ },
91
+ {
92
+ "id": "merge-hardware-web",
93
+ "executor": "cli",
94
+ "action": "capability.run",
95
+ "args": {
96
+ "capability": "hardware.web-merge",
97
+ "input": {
98
+ "requirements": "{{input.requirements}}",
99
+ "slots": "{{steps.classify-hardware.result.slots}}",
100
+ "recall_id": "{{steps.search-hardware-wikis.resource.id}}",
101
+ "evidence_id": "{{steps.search-hardware-web.resource.id}}",
102
+ "candidates": "{{steps.extract-web-hardware.result.candidates}}"
103
+ }
104
+ }
105
+ },
106
+ {
107
+ "id": "select-hardware-from-wikis",
108
+ "executor": "agent",
109
+ "instruction": "先读 abelien-hardware-selection/references/selection-service-contract.md 与真实候选的完整 Wiki。每槽位选择一个真实 component_id,显式 quantity 等于槽位 quantity;manufacturer/model 取候选,selection_reason 非空,wiki_evidence 为至少 8 字符的 Wiki 原文引用数组。selected_models 每项需 constraint_checks,覆盖 function、slot:<hard_constraints 的键>、limit:<每项 hard limit.id>;每项包含 constraint_id、status=verified|unknown|incompatible、reason、evidence:[{component_id,quote}]。多型号另给 compatibility_checks:power、interfaces 两维须包含 status、reason、每个型号的原文 evidence,可信电气数据确定性通过时以 compatibility_report 为准;mechanical、thermal、software 只作提示,可选填写,但填 incompatible 仍阻塞。证据不足填 unknown,不可编造。status=verified|needs_confirmation,plan_mode=assemble_new|adapt_system,其余数组 selected_models/coverage_ledger/remaining_slots/unknowns/replacement_plan 必填。先比较整机,但整机继承缺 manifest 必须待确认,不凭文案抵扣数量。verified 只表示 Wiki 证据判断通过,不是独立工程兼容求解或实测,不代表采用。 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. Electrically incompatible candidates (trusted data: missing bus type or count) require replacing one side; 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
+ "replySchema": {
111
+ "status": "verified|needs_confirmation",
112
+ "plan_mode": "adapt_system|assemble_new",
113
+ "selected_models": "array",
114
+ "coverage_ledger": "array",
115
+ "remaining_slots": "array",
116
+ "unknowns": "array",
117
+ "replacement_plan": "array",
118
+ "compatibility_checks": "array"
119
+ }
120
+ },
121
+ {
122
+ "id": "select-hardware",
123
+ "executor": "cli",
124
+ "action": "capability.run",
125
+ "args": {
126
+ "capability": "hardware.select",
127
+ "input": {
128
+ "requirements": "{{input.requirements}}",
129
+ "slots": "{{steps.classify-hardware.result.slots}}",
130
+ "recall_id": "{{steps.merge-hardware-web.resource.id}}",
131
+ "selection_proposal": "{{steps.select-hardware-from-wikis.result}}"
132
+ }
133
+ }
134
+ },
135
+ {
136
+ "id": "record-hardware-selection",
137
+ "executor": "cli",
138
+ "action": "resource.update",
139
+ "args": {
140
+ "id": "{{steps.record-requirements.resource.id}}",
141
+ "bodyPatch": {
142
+ "hardwareSelectionId": "{{steps.select-hardware.resource.id}}",
143
+ "hardwareSelectionStatus": "{{steps.select-hardware.result.status}}",
144
+ "hardwareSelectionRevision": "{{steps.select-hardware.result.revision}}",
145
+ "hardwarePlanMode": "{{steps.select-hardware.result.plan_mode}}"
146
+ }
147
+ }
148
+ },
149
+ {
150
+ "id": "hardware-selected",
151
+ "executor": "cli",
152
+ "action": "machine.send",
153
+ "args": {
154
+ "machine": "hardware-selection",
155
+ "event": "confirmSelection",
156
+ "instance": "{{steps.record-requirements.resource.id}}"
157
+ },
158
+ "completeWhen": {
159
+ "path": "steps.hardware-selected.result.to",
160
+ "equals": "selected_pending_confirmation"
161
+ },
162
+ "completionResult": {
163
+ "selectionId": "{{steps.select-hardware.resource.id}}",
164
+ "selectionStatus": "{{steps.select-hardware.result.status}}",
165
+ "selectionRevision": "{{steps.select-hardware.result.revision}}"
166
+ }
167
+ }
168
+ ],
169
+ "result": {
170
+ "selectionId": "{{steps.select-hardware.resource.id}}",
171
+ "selectionStatus": "{{steps.select-hardware.result.status}}",
172
+ "selectionRevision": "{{steps.select-hardware.result.revision}}"
173
+ },
174
+ "legacyResume": "read_only"
175
+ }
@@ -2,7 +2,7 @@
2
2
  "name": "user-journey-hardware-algorithm",
3
3
  "domain": "abelien-workspace",
4
4
  "executionProtocol": "pinned-result-v1",
5
- "description": "Library recall, suitability review, fixed Prismer-first/Volc evidence for unresolved slots, source-bound merge, then the same formal hardware.select and gate",
5
+ "description": "Library recall, suitability review, English Volc query and direct source reads (Prismer switchable, off by default) for unresolved slots, source-bound merge, then the same formal hardware.select and gate",
6
6
  "input": {
7
7
  "required": [
8
8
  "requirements",
@@ -63,7 +63,7 @@
63
63
  {
64
64
  "id": "review-hardware-candidates",
65
65
  "executor": "agent",
66
- "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\":10}]}. 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. Count is optional and a positive integer; Prismer search.topK and return.topK are explicit. Do not apply undocumented Prismer query/result limits or truncate requirements. The trusted fixed Prismer-first policy permits Volc only after a saved definitive denial, successful empty query or unsent missing Key; Volc alone checks its official 1-100 character Query and Count 1-50 at dispatch. 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.",
66
+ "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.",
67
67
  "replySchema": {
68
68
  "unresolved_slots": "array"
69
69
  }
@@ -108,7 +108,7 @@
108
108
  {
109
109
  "id": "select-hardware-from-wikis",
110
110
  "executor": "agent",
111
- "instruction": "先读 abelien-hardware-selection/references/selection-service-contract.md 与真实候选的完整 Wiki。每槽位选择一个真实 component_id,显式 quantity 等于槽位 quantity;manufacturer/model 取候选,selection_reason 非空,wiki_evidence 为至少 8 字符的 Wiki 原文引用数组。selected_models 每项需 constraint_checks,覆盖 function、slot:<hard_constraints 的键>、limit:<每项 hard limit.id>;每项包含 constraint_id、status=verified|unknown|incompatible、reason、evidence:[{component_id,quote}]。多型号另给 compatibility_checks,逐 power/interfaces/mechanical/thermal/software 维度包含 status、reason、每个型号的原文 evidence。证据不足填 unknown,不可编造。status=verified|needs_confirmation,plan_mode=assemble_new|adapt_system,其余数组 selected_models/coverage_ledger/remaining_slots/unknowns/replacement_plan 必填。先比较整机,但整机继承缺 manifest 必须待确认,不凭文案抵扣数量。verified 只表示 Wiki 证据判断通过,不是独立工程兼容求解或实测,不代表采用。 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; unknown/risk stays needs_confirmation when an envelope is active. 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.",
111
+ "instruction": "先读 abelien-hardware-selection/references/selection-service-contract.md 与真实候选的完整 Wiki。每槽位选择一个真实 component_id,显式 quantity 等于槽位 quantity;manufacturer/model 取候选,selection_reason 非空,wiki_evidence 为至少 8 字符的 Wiki 原文引用数组。selected_models 每项需 constraint_checks,覆盖 function、slot:<hard_constraints 的键>、limit:<每项 hard limit.id>;每项包含 constraint_id、status=verified|unknown|incompatible、reason、evidence:[{component_id,quote}]。多型号另给 compatibility_checks:power、interfaces 两维须包含 status、reason、每个型号的原文 evidence,可信电气数据确定性通过时以 compatibility_report 为准;mechanical、thermal、software 只作提示,可选填写,但填 incompatible 仍阻塞。证据不足填 unknown,不可编造。status=verified|needs_confirmation,plan_mode=assemble_new|adapt_system,其余数组 selected_models/coverage_ledger/remaining_slots/unknowns/replacement_plan 必填。先比较整机,但整机继承缺 manifest 必须待确认,不凭文案抵扣数量。verified 只表示 Wiki 证据判断通过,不是独立工程兼容求解或实测,不代表采用。 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. Electrically incompatible candidates (trusted data: missing bus type or count) require replacing one side; 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.",
112
112
  "replySchema": {
113
113
  "status": "verified|needs_confirmation",
114
114
  "plan_mode": "adapt_system|assemble_new",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "user-journey-hardware-candidates",
3
3
  "domain": "abelien-workspace",
4
- "description": "Library recall, suitability review, fixed Prismer-first/Volc evidence for unresolved slots, source-bound merge, then candidate proposal",
4
+ "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",
5
5
  "input": {
6
6
  "required": [
7
7
  "requirements"
@@ -60,7 +60,7 @@
60
60
  {
61
61
  "id": "review-hardware-candidates",
62
62
  "executor": "agent",
63
- "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\":10}]}. 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. Count is optional and a positive integer; Prismer search.topK and return.topK are explicit. Do not apply undocumented Prismer query/result limits or truncate requirements. The trusted fixed Prismer-first policy permits Volc only after a saved definitive denial, successful empty query or unsent missing Key; Volc alone checks its official 1-100 character Query and Count 1-50 at dispatch. 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.",
63
+ "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.",
64
64
  "replySchema": {
65
65
  "unresolved_slots": "array"
66
66
  }
@@ -105,7 +105,7 @@
105
105
  {
106
106
  "id": "select-hardware-from-wikis",
107
107
  "executor": "agent",
108
- "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; unknown/risk stays needs_confirmation when an envelope is active. 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.",
108
+ "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. Electrically incompatible candidates (trusted data: missing bus type or count) require replacing one side; 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
109
  "replySchema": {
110
110
  "status": "proposed|needs_confirmation",
111
111
  "plan_mode": "adapt_system|assemble_new",
@@ -2,7 +2,7 @@
2
2
  "name": "user-journey-hardware",
3
3
  "domain": "abelien-workspace",
4
4
  "executionProtocol": "pinned-result-v1",
5
- "description": "Library recall, suitability review, fixed Prismer-first/Volc evidence for unresolved slots, source-bound merge, then the same formal hardware.select and gate",
5
+ "description": "Library recall, suitability review, English Volc query and direct source reads (Prismer switchable, off by default) for unresolved slots, source-bound merge, then the same formal hardware.select and gate",
6
6
  "input": {
7
7
  "required": [
8
8
  "requirements"
@@ -61,7 +61,7 @@
61
61
  {
62
62
  "id": "review-hardware-candidates",
63
63
  "executor": "agent",
64
- "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\":10}]}. 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. Count is optional and a positive integer; Prismer search.topK and return.topK are explicit. Do not apply undocumented Prismer query/result limits or truncate requirements. The trusted fixed Prismer-first policy permits Volc only after a saved definitive denial, successful empty query or unsent missing Key; Volc alone checks its official 1-100 character Query and Count 1-50 at dispatch. 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.",
64
+ "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.",
65
65
  "replySchema": {
66
66
  "unresolved_slots": "array"
67
67
  }
@@ -106,7 +106,7 @@
106
106
  {
107
107
  "id": "select-hardware-from-wikis",
108
108
  "executor": "agent",
109
- "instruction": "先读 abelien-hardware-selection/references/selection-service-contract.md 与真实候选的完整 Wiki。每槽位选择一个真实 component_id,显式 quantity 等于槽位 quantity;manufacturer/model 取候选,selection_reason 非空,wiki_evidence 为至少 8 字符的 Wiki 原文引用数组。selected_models 每项需 constraint_checks,覆盖 function、slot:<hard_constraints 的键>、limit:<每项 hard limit.id>;每项包含 constraint_id、status=verified|unknown|incompatible、reason、evidence:[{component_id,quote}]。多型号另给 compatibility_checks,逐 power/interfaces/mechanical/thermal/software 维度包含 status、reason、每个型号的原文 evidence。证据不足填 unknown,不可编造。status=verified|needs_confirmation,plan_mode=assemble_new|adapt_system,其余数组 selected_models/coverage_ledger/remaining_slots/unknowns/replacement_plan 必填。先比较整机,但整机继承缺 manifest 必须待确认,不凭文案抵扣数量。verified 只表示 Wiki 证据判断通过,不是独立工程兼容求解或实测,不代表采用。 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; unknown/risk stays needs_confirmation when an envelope is active. 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": "先读 abelien-hardware-selection/references/selection-service-contract.md 与真实候选的完整 Wiki。每槽位选择一个真实 component_id,显式 quantity 等于槽位 quantity;manufacturer/model 取候选,selection_reason 非空,wiki_evidence 为至少 8 字符的 Wiki 原文引用数组。selected_models 每项需 constraint_checks,覆盖 function、slot:<hard_constraints 的键>、limit:<每项 hard limit.id>;每项包含 constraint_id、status=verified|unknown|incompatible、reason、evidence:[{component_id,quote}]。多型号另给 compatibility_checks:power、interfaces 两维须包含 status、reason、每个型号的原文 evidence,可信电气数据确定性通过时以 compatibility_report 为准;mechanical、thermal、software 只作提示,可选填写,但填 incompatible 仍阻塞。证据不足填 unknown,不可编造。status=verified|needs_confirmation,plan_mode=assemble_new|adapt_system,其余数组 selected_models/coverage_ledger/remaining_slots/unknowns/replacement_plan 必填。先比较整机,但整机继承缺 manifest 必须待确认,不凭文案抵扣数量。verified 只表示 Wiki 证据判断通过,不是独立工程兼容求解或实测,不代表采用。 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. Electrically incompatible candidates (trusted data: missing bus type or count) require replacing one side; 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": "verified|needs_confirmation",
112
112
  "plan_mode": "adapt_system|assemble_new",