abelien-harness 0.9.0 → 0.10.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abelien-harness",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "npx-installable multi-agent skill harness: generic kernel + pluggable domain packs",
5
5
  "type": "module",
6
6
  "engines": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: abelien-algorithm
3
- description: 基于已验证的 Abelien 硬件型号,为产品 reaction 联网检索并选择有来源的端侧算法、模型、库或成熟云服务。优先读取硬件厂商官方资料,再检索模型官方资料、Hugging Face 和云服务官方文档;不用于硬件选型、代码实现或服务部署。
3
+ description: 为产品 reaction 联网检索并选择有来源的端侧算法、模型、库或成熟云服务。需求明确后即可检索实现资料(与硬件选型并行),硬件登记后补查厂商资料并逐 reaction 绑定到已选型号;不用于硬件选型、代码实现或服务部署。
4
4
  license: MIT
5
5
  compatibility:
6
6
  - claude-code
@@ -12,25 +12,33 @@ metadata:
12
12
 
13
13
  # Abelien Algorithm
14
14
 
15
- 本包只处理硬件型号已经验证后的算法与实现选型。输入必须引用 `status=verified` 的 `hardware-selection` 资源及其版本;如果资源不存在、版本不一致、`selected_models[]` 为空,或缺少识别硬件所需的厂商/型号信息,停止并返回具体缺口,不能根据类别名猜设备。
15
+ 本包分两步完成算法与实现选型(P2-03 算法并行车道,2026-10-14):
16
+
17
+ 1. **研究(不依赖硬件)**:需求明确后就为每个 reaction 检索实现资料,与硬件选型同时进行;候选写明资源需求(算力、内存、接口、传感器、联网),不猜硬件型号。
18
+ 2. **绑定(硬件登记后)**:读取已登记的 `hardware-selection`(id 与 revision),补查已选型号的厂商资料,每个 reaction 绑定到具体 `component_id` 并复核兼容。硬件尚未 verified 也可以绑定,结果保持待确认。`selected_models[]` 为空或缺少厂商/型号时停止并返回具体缺口,不能根据类别名猜设备。
19
+
20
+ 车道在哪个阶段做哪一步由 workspace 的 `workspace.lanes-next` 决定(见[意图路由 §4.1](../../docs/architecture/intent-routing.md))。
16
21
 
17
22
  与同级 [structure](../abelien-structure/SKILL.md) 可在各自依赖满足后分别推进:将摄像头视野、拾音/发声开口、散热、动作范围等有依据的结构要求交回;结构反馈遮挡、空间或运动冲突时重判受影响绑定。换硬件须回 hardware 并重新核对版本。算法选型成功不代表装配或设备行为已经实测通过。
18
23
 
19
24
  ## 渐进加载
20
25
 
21
26
  1. 每次研究先读[联网检索与排序规则](references/research-policy.md)。
22
- 2. 准备提交候选时再读[算法选型服务契约](references/selection-service-contract.md)。
23
- 3. 运行 `user-journey-algorithm` workflow;Agent 暂停步骤中读取硬件资源、联网检索并形成每个 reaction 的 `bindings[]`,随后由本地 `algorithm.finalize` 归一化保存。
27
+ 2. 准备提交候选或绑定时再读[算法选型服务契约](references/selection-service-contract.md)。
28
+ 3. 研究:`algorithm.research`(`purpose=implementation`,查询带 `reaction_id`)→ 读正文 → `algorithm.candidates` 提交每个 reaction 的候选(格式见 [algorithm-candidates.v1](schemas/algorithm-candidates.v1.json)),保存为 `status=proposed`。
29
+ 4. 绑定:`algorithm.research`(`purpose=hardware`,查询带 `component_id`)→ `algorithm.finalize`(`operation=bind`,`research` 格式见 [algorithm-bindings.v1](schemas/algorithm-bindings.v1.json))。来源只写 `research_id` 与 `page_id`,回执由 Harness 从自己存下的正文填写。
30
+ 5. 宿主在每个阶段开跑前用只读的 `algorithm.lane-state` 查当前需求有没有已提议的候选、候选有没有绑定到当前硬件,映射成 `workspace.lanes-next` 的 artifacts。
31
+ 6. 已有的 `user-journey-algorithm` workflow(先有 verified 硬件再研究)保持可用,供不走车道的宿主使用。
24
32
 
25
33
  ## 核心边界
26
34
 
27
- - 检索顺序是硬件厂商官方资料 → 算法/模型官方资料 → Hugging Face → 云服务厂商官方资料。搜索结果页、博客和聚合文章只能用于发现线索,不能单独支持最终选择。
35
+ - 研究步骤先看宿主给出的库内已适配算法(2026-09-16 决定:库内优先、库外再联网),再按算法/模型官方资料 → Hugging Face → 云服务厂商官方资料检索;绑定步骤先查已选型号的硬件厂商官方资料。搜索结果页、博客和聚合文章只能用于发现线索,不能单独支持最终选择。
28
36
  - 必须明确 `edge`、`cloud` 或 `hybrid`。离线、隐私、网络、延迟、费用或数据地域限制属于硬约束,不得为了找到候选而静默改成云端。
29
37
  - 端侧候选要核对处理器架构、OS/固件、runtime、算子、RAM、Flash/存储、加速器、输入输出格式及外设接口;没有精确设备实测时,不能承诺真实性能。
30
38
  - 交互类需求可以比较本地模型和云端 API,但“模型仓库存在”不等于“已有可调用云服务”,“当前 Agent 能调用模型”也不等于用户设备具备该能力。
31
39
  - 发现、兼容复核、集成、部署和实测是五种不同状态。本包只完成前两项并保存版本化选型结果。
32
40
 
33
- `algorithm.finalize` 不访问网络;它回读真实硬件基线,并要求可信宿主的来源读取凭据,检查完整 reaction、型号/版本绑定和硬约束覆盖。只有元数据或 Agent 自述“已回读”不会获得 `verified`;裸 CLI 没有宿主证据解析器时保持待确认。具体字段及回执边界见选型服务契约。旧 `algorithm.select` HTTP 能力为兼容已有部署保留。来源不可回读、候选版本不确定或存在阻塞未知项时,结果保持待确认,不伪造验证。
41
+ `algorithm.finalize` 不访问网络;它回读真实硬件基线,并核对来源回执,检查完整 reaction、型号/版本绑定和硬约束覆盖。只有元数据或 Agent 自述“已回读”不会获得 `verified`。回执来自可信宿主注入的证据解析器,或(`operation=bind`)来自 `algorithm.research` 自己读取并按 sha256 存下的正文;检索摘要(`text_source=search_snippet`)只用于发现,永远不算证据。具体字段及回执边界见选型服务契约。旧 `algorithm.select` HTTP 能力为兼容已有部署保留。来源不可回读、候选版本不确定或存在阻塞未知项时,结果保持待确认,不伪造验证。
34
42
 
35
43
  ## Prismer source documents
36
44
 
@@ -1,9 +1,58 @@
1
1
  {
2
2
  "name": "abelien-algorithm",
3
- "version": "0.2.0",
4
- "description": "基于已验证硬件进行官方资料优先的联网算法选型与兼容复核",
5
- "resources": ["algorithm-selection"],
3
+ "version": "0.3.0",
4
+ "description": "算法域包:需求明确后即可检索实现资料(与硬件选型并行),硬件登记后补厂商资料并逐 reaction 绑定、复核兼容",
5
+ "requires": ["abelien-harness"],
6
+ "resources": ["algorithm-selection", "algorithm-research"],
6
7
  "capabilities": {
8
+ "algorithm.research": {
9
+ "description": "执行 Agent 的检索计划并保存证据:purpose=implementation 只凭需求检索实现资料(可与硬件选型并行),purpose=hardware 检索已选型号的厂商资料;Volc 检索(每次最多 5 条)与公开 HTTPS 页面安全直读,正文按 sha256 存证;每条付费检索先存 sent 再发送,重跑复用已完成检索、结果未知时要求对账而不重发;同一请求完成后重复运行直接返回已有结果",
10
+ "adapter": {
11
+ "type": "module",
12
+ "path": "scripts/research.mjs",
13
+ "export": "researchAlgorithms"
14
+ },
15
+ "input": { "from": "input" },
16
+ "resultContract": {
17
+ "nonEmptyStrings": ["id", "status", "schema", "request_digest", "purpose"],
18
+ "arrays": ["reactions", "searches", "pages", "unknowns"],
19
+ "statusValues": ["collected"]
20
+ },
21
+ "produces": "algorithm-research",
22
+ "checkpoint": true,
23
+ "checkpointContract": {
24
+ "nonEmptyStrings": ["id", "status", "schema", "request_digest", "purpose"],
25
+ "arrays": ["reactions", "searches", "pages", "unknowns"],
26
+ "statusValues": ["in_progress", "collected"]
27
+ }
28
+ },
29
+ "algorithm.candidates": {
30
+ "description": "核验 Agent 基于 implementation 研究为每个 reaction 提出的候选实现:引用须逐字出现在本次研究存下的正文,候选只能引用为自己 reaction 检索的页面,库内算法须来自研究输入的库清单;每个 reaction 要么有候选、要么写明未解决原因;保存为 status=proposed,不依赖硬件",
31
+ "adapter": {
32
+ "type": "module",
33
+ "path": "scripts/candidates.mjs",
34
+ "export": "proposeAlgorithmCandidates"
35
+ },
36
+ "input": { "from": "input" },
37
+ "resultContract": {
38
+ "nonEmptyStrings": ["id", "status", "schema", "collected_id"],
39
+ "arrays": ["candidates", "unresolved", "unknowns"],
40
+ "statusValues": ["proposed"]
41
+ },
42
+ "produces": "algorithm-research"
43
+ },
44
+ "algorithm.lane-state": {
45
+ "description": "只读:按本草稿已存的资源回答当前需求有没有已提议的候选(落点、reaction、limits 与研究时一致),以及这些候选有没有绑定到给定的硬件选型 id 与 revision;宿主把结果映射成 workspace.lanes-next 的 artifacts",
46
+ "adapter": {
47
+ "type": "module",
48
+ "path": "scripts/lane-state.mjs",
49
+ "export": "algorithmLaneState"
50
+ },
51
+ "input": { "from": "input" },
52
+ "resultContract": {
53
+ "nonEmptyStrings": ["requirements_digest"]
54
+ }
55
+ },
7
56
  "algorithm.select": {
8
57
  "description": "复核 Agent 联网研究证据,选择端侧、云端或混合实现并形成版本化算法选型",
9
58
  "adapter": {
@@ -29,7 +78,7 @@
29
78
  "produces": "algorithm-selection"
30
79
  },
31
80
  "algorithm.finalize": {
32
- "description": "把 Agent 基于硬件型号和官方联网证据做出的算法绑定归一化为版本化选型资源",
81
+ "description": "把 Agent 基于硬件型号和官方联网证据做出的算法绑定归一化为版本化选型资源;operation=bind 时候选取自 algorithm.candidates,来源回执从 Harness 自己存下的研究正文解析,硬件基线尚未 verified 时结果固定为 needs_confirmation",
33
82
  "adapter": {
34
83
  "type": "module",
35
84
  "path": "scripts/finalize-selection.mjs",
@@ -56,7 +105,12 @@
56
105
  "initial": "researched",
57
106
  "states": ["researched", "selected"],
58
107
  "transitions": [
59
- { "from": "researched", "to": "selected", "on": "confirmSelection", "guard": { "status": "verified" } }
108
+ {
109
+ "from": "researched",
110
+ "to": "selected",
111
+ "on": "confirmSelection",
112
+ "guard": { "status": "verified" }
113
+ }
60
114
  ]
61
115
  }
62
116
  },
@@ -1,12 +1,18 @@
1
1
  # 联网检索与排序规则
2
2
 
3
- 只在算法研究步骤中读取。研究对象是用户 reaction 在已验证硬件上的实现,不是泛泛推荐热门模型。
3
+ 只在算法研究与绑定步骤中读取。研究对象是用户 reaction 在本产品上的实现,不是泛泛推荐热门模型。
4
4
 
5
- ## 输入门槛
5
+ ## 两个步骤的输入
6
+
7
+ **研究(`algorithm.research` purpose=implementation,与硬件选型并行)**只需要需求:每个 reaction 的触发与反应、落点和 limits。不读取、不猜测硬件型号;候选的资源需求(算力、内存、存储、runtime、联网、接口、传感器)按来源原文记录,原文没写的填 null。离线、隐私、延迟、费用等硬约束从这一步就用来筛选。宿主给出的库内已适配算法优先,库外再联网。
8
+
9
+ **绑定(`algorithm.research` purpose=hardware → `algorithm.finalize` operation=bind)**在硬件登记后进行,按下面的门槛读取硬件资源。硬件尚未 verified 时照常核对,结果保持待确认。
10
+
11
+ ## 绑定的输入门槛
6
12
 
7
13
  先通过 `ab resource get <hardwareSelectionId>` 读取完整资源,并逐项确认:
8
14
 
9
- - kind 为 `hardware-selection`,body.status 为 `verified`;
15
+ - kind 为 `hardware-selection`;body.status 为 `verified`,否则(bind)结果只能是待确认;
10
16
  - 资源 revision 与 workflow 输入版本一致;
11
17
  - `selected_models[]` 给出稳定 `component_id`,并有足以查找官方资料的厂商和准确型号;
12
18
  - reaction 包含输入、期望输出、场景及离线、隐私、延迟、精度、功耗、成本等硬约束。
@@ -15,6 +21,8 @@
15
21
 
16
22
  ## 来源顺序
17
23
 
24
+ 研究步骤从第 2 项开始(尚无硬件);绑定步骤先补第 1 项,再引用研究步骤已读的第 2–4 项。
25
+
18
26
  1. **硬件厂商官方资料**:产品页、datasheet、SDK/runtime 文档、官方 model zoo、官方示例和兼容矩阵。先确认硬件能够运行什么。
19
27
  2. **实现官方资料**:模型或算法维护方的版本化文档、发布记录、模型卡和许可。确认实现本身的 I/O、依赖与限制。
20
28
  3. **Hugging Face**:按任务标签、准确硬件/runtime 关键词和 reaction 关键词搜索。记录 repo ID、revision/commit、pipeline tag、framework、license、文件规模和模型卡声明;下载量或点赞只能作为次级排序信息。
@@ -2,6 +2,56 @@
2
2
 
3
3
  本文件只在向 `algorithm.finalize` 提交联网研究结果时读取。Harness 不实现搜索引擎、Hugging Face 或云厂商客户端;联网由宿主 Agent 使用获准工具完成,本地能力负责检查结果形状并保存稳定引用。旧 `algorithm.select` HTTP 能力只为兼容已有部署保留。
4
4
 
5
+ ## 并行车道:research → candidates → bind(P2-03,2026-10-14)
6
+
7
+ 宿主按 `workspace.lanes-next` 的步骤调用以下三项;全部是 `ab capability run`,不需要宿主注入证据解析器。Agent 提交的两份内容各有 schema,宿主可原样用作工具参数定义:[`schemas/algorithm-candidates.v1.json`](../schemas/algorithm-candidates.v1.json)(`algorithm.candidates` 去掉 `research_id`)与 [`schemas/algorithm-bindings.v1.json`](../schemas/algorithm-bindings.v1.json)(bind 的 `research`)。字段与脚本里的常量由测试保证一致。
8
+
9
+ ### `algorithm.research`
10
+
11
+ ```json
12
+ { "purpose": "implementation",
13
+ "requirements": { "context": {}, "reaction": [{ "id": "r1", "text": "…" }], "limits": [] },
14
+ "library": [{ "entry_id": "lib-1", "name": "microWakeWord", "category": "语音 · 唤醒词" }],
15
+ "plan": { "queries": [{ "reaction_id": "r1", "query": "offline wake word model microcontroller", "count": 5 }], "max_pages": 8 } }
16
+ ```
17
+
18
+ - `purpose=implementation`:只凭 clarify 的需求;每条查询带一个需求里的 `reaction_id`,不带 `component_id`。`library` 是宿主给的库内已适配算法(可省略)。
19
+ - `purpose=hardware`:另给 `hardware_selection_id` 与 `hardware_selection_revision`;每条查询带选型资源里的一个 `component_id`。硬件可以尚未 verified。
20
+ - 产出 `algorithm-research`(schema `abelien.algorithm-research.v1`,`status=collected`):`searches[]`、`pages[]`(`id`、`url`、`final_url`、`reaction_id`/`component_id`、`fetched_at`、`text_blob_ref`、`text_sha256`、`text_source`)和 `unknowns[]`。正文读不到的页面保留检索摘要,`text_source=search_snippet`,只用于发现。
21
+ - 付费检索先存 sent 再发送;同一请求完成后重跑直接返回已有结果;停在 sent 而结果未知的检索以 `ALGORITHM_WEB_RECONCILIATION_REQUIRED` 要求对账,不重发。缺 `WEB_SEARCH_API_KEY` 时以 `ALGORITHM_WEB_CONFIG` 在任何发送前失败。
22
+
23
+ ### `algorithm.candidates`
24
+
25
+ ```json
26
+ { "research_id": "algorithm-research:alg-res-…",
27
+ "candidates": [{ "reaction_id": "r1", "implementation_ref": "microWakeWord", "implementation_version": "v2.1.0",
28
+ "implementation_type": "model", "execution_target": "edge", "library_entry_id": "lib-1", "summary": "本地唤醒词检测",
29
+ "needs": { "compute": "TensorFlow Lite Micro", "memory": "about 30 KB of RAM", "storage": null, "runtime": null, "network": null, "interfaces": ["I2S microphone"], "sensors": [] },
30
+ "quotes": [{ "page_id": "p1", "text": "needs about 30 KB of RAM on ESP32-S3 class chips" }] }],
31
+ "unresolved": [{ "reaction_id": "r2", "reason": "…" }], "unknowns": [] }
32
+ ```
33
+
34
+ - 只接受 `status=collected`、`purpose=implementation` 的研究。引用规范化空白与全半角后须逐字出现在该页存下的正文(至少 8 字);可以引用本次研究读到的任一页,同一份实现资料常常同时支撑几个 reaction。`library_entry_id` 须来自研究输入的库清单。不是库内算法时至少一条引用。
35
+ - `implementation_ref` 是简短名称(≤80 字,不带网址和说明,说明写 `summary`),绑定与 PRD 原样引用;`implementation_version` 只写来源写明的确定版本,没写填 `null`,latest/main 等浮动值拒绝。
36
+ - 每个 reaction 要么至少一个候选,要么写进 `unresolved` 并说明原因。
37
+ - 一次提交里每个候选、每条 unresolved 的问题合并在同一个 `VALIDATION` 里返回(最多 8 条),Agent 一轮改完。
38
+ - 产出 `status=proposed` 的 `algorithm-research`,带 `collected_id`、`candidates[]`(每项标 `evidence`:`page`/`library`/`search_snippet`)与 `unresolved[]`。
39
+
40
+ ### `algorithm.finalize` 的 `operation=bind`
41
+
42
+ 在下文 select 请求的字段之外给 `operation: "bind"` 与 `proposed_id`(上一步的 proposed 研究)。差别只有四处:
43
+
44
+ 1. `research.candidates` 可省略,默认取 proposed 研究里的候选。
45
+ 2. 来源只写 `research_id` 与 `page_id`:Harness 从自己存下的正文填写 `url`、`accessed_at`(该页 `fetched_at`)、`content_sha256` 与 `evidence_ref`(`algorithm-research:<研究 id>#<page_id>`),提交里的这四个字段一律丢弃,再按下文的确定性质量门比对。只认 proposed 研究的原研究,以及同一硬件选型 id 与 revision 的 `purpose=hardware` 研究;检索摘要页不算回执,指不到正文页的来源不带回执、保持未验证。宿主若另行注入 `readEvidence`,核对时以宿主为准。
46
+ 3. 每条 binding 的 `implementation_ref` 须是该 reaction 已提议的候选之一,否则记一条阻塞未知。
47
+ 4. 硬件基线可以不是 verified:照常核对,并追加一条阻塞未知,结果固定为 `needs_confirmation`。
48
+
49
+ 结果另带 `operation: "bind"` 与 `proposed_id`。select 请求的行为不变。
50
+
51
+ ### `algorithm.lane-state`(只读)
52
+
53
+ 输入 `{ requirements, hardware_selection_id?, hardware_selection_revision? }`,输出 `{ requirements_digest, proposed_id, selection_id, selection_status }`。`proposed_id` 是本工作目录里落点、reaction、limits 与当前需求相同(与 research 同一规范化规则)的最新 proposed 研究;`selection_id` 是绑定到这份候选、且硬件选型 id 与 revision 相同的最新 bind 结果。换硬件后候选仍可用、绑定作废;改了 reaction 或 limits 两者都作废。
54
+
5
55
  ## 请求
6
56
 
7
57
  本地 module adapter 接收:
@@ -0,0 +1,414 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://git.abelien.cn/abelien/abelienharness/skills/abelien-algorithm/schemas/algorithm-bindings.v1.json",
4
+ "title": "abelien.algorithm-bindings.v1",
5
+ "description": "algorithm.finalize(operation=bind)的 research 部分。宿主可以把本文件原样用作工具参数定义,proposed_id 与硬件选型 id/revision 由宿主填入;字段与 scripts/finalize-selection.mjs 的 BIND_FIELDS 一致,由测试保证。来源只写 research_id 与 page_id,url、访问时间、哈希与 evidence_ref 由 Harness 从存下的正文填写。任何一项不是 pass、证据不足或来源不是一手资料,结果都保持 needs_confirmation。",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "bindings",
10
+ "sources"
11
+ ],
12
+ "properties": {
13
+ "bindings": {
14
+ "type": "array",
15
+ "description": "每个 reaction 恰好一条。",
16
+ "items": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": [
20
+ "reaction_id",
21
+ "implementation_ref",
22
+ "implementation_version",
23
+ "implementation_type",
24
+ "execution_target",
25
+ "hardware_component_ids",
26
+ "source_ids",
27
+ "compatibility",
28
+ "constraint_checks"
29
+ ],
30
+ "properties": {
31
+ "reaction_id": {
32
+ "type": "string"
33
+ },
34
+ "implementation_ref": {
35
+ "type": "string",
36
+ "maxLength": 80,
37
+ "description": "该 reaction 已提议候选之一的 implementation_ref,原样照抄。"
38
+ },
39
+ "implementation_version": {
40
+ "type": "string",
41
+ "maxLength": 60,
42
+ "description": "确定版本;候选没写版本时取厂商或实现资料写明的版本,查不到就照实填 unknown(结果会保持待确认)。"
43
+ },
44
+ "implementation_type": {
45
+ "enum": [
46
+ "firmware",
47
+ "library",
48
+ "model",
49
+ "cloud_service"
50
+ ]
51
+ },
52
+ "execution_target": {
53
+ "enum": [
54
+ "edge",
55
+ "cloud",
56
+ "hybrid"
57
+ ]
58
+ },
59
+ "hardware_component_ids": {
60
+ "type": "array",
61
+ "minItems": 1,
62
+ "items": {
63
+ "type": "string"
64
+ },
65
+ "description": "已登记硬件选型里的 component_id。"
66
+ },
67
+ "source_ids": {
68
+ "type": "array",
69
+ "minItems": 1,
70
+ "items": {
71
+ "type": "string"
72
+ },
73
+ "description": "sources[].id:至少一条覆盖所列型号的 hardware_vendor 来源,和一条 implementation_ref 与版本都相同的实现来源。"
74
+ },
75
+ "compatibility": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": [
79
+ "io",
80
+ "runtime",
81
+ "dependencies",
82
+ "network",
83
+ "license",
84
+ "resources"
85
+ ],
86
+ "properties": {
87
+ "io": {
88
+ "type": "object",
89
+ "additionalProperties": false,
90
+ "required": [
91
+ "status",
92
+ "summary",
93
+ "source_ids"
94
+ ],
95
+ "properties": {
96
+ "status": {
97
+ "enum": [
98
+ "pass",
99
+ "conflict",
100
+ "unknown"
101
+ ],
102
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
103
+ },
104
+ "summary": {
105
+ "type": "string",
106
+ "minLength": 1,
107
+ "maxLength": 500
108
+ },
109
+ "source_ids": {
110
+ "type": "array",
111
+ "items": {
112
+ "type": "string"
113
+ },
114
+ "description": "支撑这条判断的 sources[].id。"
115
+ }
116
+ }
117
+ },
118
+ "runtime": {
119
+ "type": "object",
120
+ "additionalProperties": false,
121
+ "required": [
122
+ "status",
123
+ "summary",
124
+ "source_ids"
125
+ ],
126
+ "properties": {
127
+ "status": {
128
+ "enum": [
129
+ "pass",
130
+ "conflict",
131
+ "unknown"
132
+ ],
133
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
134
+ },
135
+ "summary": {
136
+ "type": "string",
137
+ "minLength": 1,
138
+ "maxLength": 500
139
+ },
140
+ "source_ids": {
141
+ "type": "array",
142
+ "items": {
143
+ "type": "string"
144
+ },
145
+ "description": "支撑这条判断的 sources[].id。"
146
+ }
147
+ }
148
+ },
149
+ "dependencies": {
150
+ "type": "object",
151
+ "additionalProperties": false,
152
+ "required": [
153
+ "status",
154
+ "summary",
155
+ "source_ids"
156
+ ],
157
+ "properties": {
158
+ "status": {
159
+ "enum": [
160
+ "pass",
161
+ "conflict",
162
+ "unknown"
163
+ ],
164
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
165
+ },
166
+ "summary": {
167
+ "type": "string",
168
+ "minLength": 1,
169
+ "maxLength": 500
170
+ },
171
+ "source_ids": {
172
+ "type": "array",
173
+ "items": {
174
+ "type": "string"
175
+ },
176
+ "description": "支撑这条判断的 sources[].id。"
177
+ }
178
+ }
179
+ },
180
+ "network": {
181
+ "type": "object",
182
+ "additionalProperties": false,
183
+ "required": [
184
+ "status",
185
+ "summary",
186
+ "source_ids"
187
+ ],
188
+ "properties": {
189
+ "status": {
190
+ "enum": [
191
+ "pass",
192
+ "conflict",
193
+ "unknown"
194
+ ],
195
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
196
+ },
197
+ "summary": {
198
+ "type": "string",
199
+ "minLength": 1,
200
+ "maxLength": 500
201
+ },
202
+ "source_ids": {
203
+ "type": "array",
204
+ "items": {
205
+ "type": "string"
206
+ },
207
+ "description": "支撑这条判断的 sources[].id。"
208
+ }
209
+ }
210
+ },
211
+ "license": {
212
+ "type": "object",
213
+ "additionalProperties": false,
214
+ "required": [
215
+ "status",
216
+ "summary",
217
+ "source_ids"
218
+ ],
219
+ "properties": {
220
+ "status": {
221
+ "enum": [
222
+ "pass",
223
+ "conflict",
224
+ "unknown"
225
+ ],
226
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
227
+ },
228
+ "summary": {
229
+ "type": "string",
230
+ "minLength": 1,
231
+ "maxLength": 500
232
+ },
233
+ "source_ids": {
234
+ "type": "array",
235
+ "items": {
236
+ "type": "string"
237
+ },
238
+ "description": "支撑这条判断的 sources[].id。"
239
+ }
240
+ }
241
+ },
242
+ "resources": {
243
+ "type": "object",
244
+ "additionalProperties": false,
245
+ "required": [
246
+ "status",
247
+ "summary",
248
+ "source_ids"
249
+ ],
250
+ "properties": {
251
+ "status": {
252
+ "enum": [
253
+ "pass",
254
+ "conflict",
255
+ "unknown"
256
+ ],
257
+ "description": "来源能证明成立才写 pass;证据不够写 unknown,冲突写 conflict。"
258
+ },
259
+ "summary": {
260
+ "type": "string",
261
+ "minLength": 1,
262
+ "maxLength": 500
263
+ },
264
+ "source_ids": {
265
+ "type": "array",
266
+ "items": {
267
+ "type": "string"
268
+ },
269
+ "description": "支撑这条判断的 sources[].id。"
270
+ }
271
+ }
272
+ }
273
+ }
274
+ },
275
+ "constraint_checks": {
276
+ "type": "array",
277
+ "description": "需求里每条非 preference 的 limits 各一条。",
278
+ "items": {
279
+ "type": "object",
280
+ "additionalProperties": false,
281
+ "required": [
282
+ "constraint_id",
283
+ "status",
284
+ "summary",
285
+ "source_ids"
286
+ ],
287
+ "properties": {
288
+ "constraint_id": {
289
+ "type": "string",
290
+ "description": "limits[].id。"
291
+ },
292
+ "status": {
293
+ "enum": [
294
+ "pass",
295
+ "conflict",
296
+ "unknown"
297
+ ]
298
+ },
299
+ "summary": {
300
+ "type": "string",
301
+ "minLength": 1,
302
+ "maxLength": 500
303
+ },
304
+ "source_ids": {
305
+ "type": "array",
306
+ "items": {
307
+ "type": "string"
308
+ }
309
+ }
310
+ }
311
+ }
312
+ }
313
+ }
314
+ }
315
+ },
316
+ "sources": {
317
+ "type": "array",
318
+ "maxItems": 64,
319
+ "items": {
320
+ "type": "object",
321
+ "additionalProperties": false,
322
+ "required": [
323
+ "id",
324
+ "research_id",
325
+ "page_id",
326
+ "source_type",
327
+ "title",
328
+ "publisher",
329
+ "version",
330
+ "excerpt"
331
+ ],
332
+ "properties": {
333
+ "id": {
334
+ "type": "string",
335
+ "description": "本次提交内唯一。"
336
+ },
337
+ "research_id": {
338
+ "type": "string",
339
+ "description": "页面所在的 algorithm-research 资源 id(实现研究或本步厂商检索)。"
340
+ },
341
+ "page_id": {
342
+ "type": "string",
343
+ "description": "该研究里 text_source=page 的页面 id;检索摘要页不算证据。"
344
+ },
345
+ "source_type": {
346
+ "enum": [
347
+ "hardware_vendor",
348
+ "implementation_official",
349
+ "huggingface",
350
+ "cloud_vendor"
351
+ ],
352
+ "description": "按发布方选:所选型号的厂商资料 hardware_vendor;库、固件或模型的官方资料 implementation_official;Hugging Face 模型卡 huggingface;云服务官方文档 cloud_vendor。分销商、博客、论坛不是一手来源,不要列为来源。"
353
+ },
354
+ "title": {
355
+ "type": "string",
356
+ "minLength": 1,
357
+ "maxLength": 300
358
+ },
359
+ "publisher": {
360
+ "type": "string",
361
+ "minLength": 1,
362
+ "maxLength": 200
363
+ },
364
+ "version": {
365
+ "type": "string",
366
+ "maxLength": 60,
367
+ "description": "页面写明的文档版本、修订号或对应的实现版本;没写就填 unknown(结果会保持待确认)。"
368
+ },
369
+ "excerpt": {
370
+ "type": "string",
371
+ "minLength": 1,
372
+ "maxLength": 1200,
373
+ "description": "逐字取自该页正文的一段,支撑本来源被引用的结论。"
374
+ },
375
+ "hardware_component_ids": {
376
+ "type": "array",
377
+ "items": {
378
+ "type": "string"
379
+ },
380
+ "description": "hardware_vendor 来源覆盖的 component_id。"
381
+ },
382
+ "implementation_ref": {
383
+ "type": "string",
384
+ "maxLength": 80,
385
+ "description": "实现来源对应的 implementation_ref,与绑定一致。"
386
+ }
387
+ }
388
+ }
389
+ },
390
+ "unknowns": {
391
+ "type": "array",
392
+ "items": {
393
+ "type": "string",
394
+ "maxLength": 1000
395
+ }
396
+ },
397
+ "blocking_unknowns": {
398
+ "type": "array",
399
+ "items": {
400
+ "type": "string",
401
+ "maxLength": 1000
402
+ },
403
+ "description": "影响能否按此绑定实现的未知,写明怎么核实。"
404
+ },
405
+ "unavailable_sources": {
406
+ "type": "array",
407
+ "items": {
408
+ "type": "string",
409
+ "maxLength": 500
410
+ },
411
+ "description": "想读但读不到的资料及原因。"
412
+ }
413
+ }
414
+ }