odai-dsh-agent 0.2.32 → 0.2.35

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 (87) hide show
  1. package/README.md +6 -4
  2. package/build/src/installer.d.mts +2 -2
  3. package/build/src/installer.d.mts.map +1 -1
  4. package/build/src/installer.mjs +10 -4
  5. package/build/src/installer.mjs.map +1 -1
  6. package/package.json +2 -2
  7. package/preset/odai/package.json +7 -0
  8. package/preset/odai/runtime/governance-bundle.d.mts +59 -0
  9. package/preset/odai/runtime/governance-bundle.d.mts.map +1 -0
  10. package/preset/odai/runtime/governance-bundle.mjs +131 -0
  11. package/preset/odai/runtime/governance-bundle.mjs.map +1 -0
  12. package/preset/odai/runtime/index.d.mts.map +1 -1
  13. package/preset/odai/runtime/index.mjs +1 -0
  14. package/preset/odai/runtime/index.mjs.map +1 -1
  15. package/preset/odai/runtime/lifecycle-runtime.d.mts +1 -0
  16. package/preset/odai/runtime/lifecycle-runtime.d.mts.map +1 -1
  17. package/preset/odai/runtime/lifecycle-runtime.mjs +18 -3
  18. package/preset/odai/runtime/lifecycle-runtime.mjs.map +1 -1
  19. package/preset/odai/runtime/prompt-runtime.d.mts +4 -1
  20. package/preset/odai/runtime/prompt-runtime.d.mts.map +1 -1
  21. package/preset/odai/runtime/prompt-runtime.mjs +78 -16
  22. package/preset/odai/runtime/prompt-runtime.mjs.map +1 -1
  23. package/preset/odai/runtime/research-packet.d.mts.map +1 -1
  24. package/preset/odai/runtime/research-packet.mjs +2 -5
  25. package/preset/odai/runtime/research-packet.mjs.map +1 -1
  26. package/preset/odai/runtime/role-overlays.d.mts +1 -6
  27. package/preset/odai/runtime/role-overlays.d.mts.map +1 -1
  28. package/preset/odai/runtime/role-overlays.mjs +7 -16
  29. package/preset/odai/runtime/role-overlays.mjs.map +1 -1
  30. package/preset/odai/runtime/router.mjs +2 -2
  31. package/preset/odai/runtime/router.mjs.map +1 -1
  32. package/preset/odai/runtime/runtime-support.d.mts +4 -2
  33. package/preset/odai/runtime/runtime-support.d.mts.map +1 -1
  34. package/preset/odai/runtime/runtime-support.mjs +17 -9
  35. package/preset/odai/runtime/runtime-support.mjs.map +1 -1
  36. package/preset/odai/runtime/runtime-types.d.mts +5 -0
  37. package/preset/odai/runtime/runtime-types.d.mts.map +1 -1
  38. package/preset/odai/runtime/skill-bundle.d.mts +21 -25
  39. package/preset/odai/runtime/skill-bundle.d.mts.map +1 -1
  40. package/preset/odai/runtime/skill-bundle.mjs +63 -337
  41. package/preset/odai/runtime/skill-bundle.mjs.map +1 -1
  42. package/preset/odai/runtime/skill-evolution.d.mts.map +1 -1
  43. package/preset/odai/runtime/skill-evolution.mjs +31 -41
  44. package/preset/odai/runtime/skill-evolution.mjs.map +1 -1
  45. package/preset/odai/runtime/tool-runtime.d.mts +2 -0
  46. package/preset/odai/runtime/tool-runtime.d.mts.map +1 -1
  47. package/preset/odai/runtime/tool-runtime.mjs +32 -25
  48. package/preset/odai/runtime/tool-runtime.mjs.map +1 -1
  49. package/preset/odai/skills/odai/SKILL.md +25 -29
  50. package/preset/odai/skills/odai/assets/task-state.md +2 -2
  51. package/preset/odai/skills/odai/manifest.json +8 -31
  52. package/preset/odai/skills/odai/references/care.md +2 -2
  53. package/preset/odai/skills/odai/references/craft.md +2 -2
  54. package/preset/odai/skills/odai/references/dao.md +2 -3
  55. package/preset/odai/skills/odai/references/human-safety.md +1 -1
  56. package/preset/odai/skills/odai/references/leverage.md +17 -49
  57. package/preset/odai/skills/odai/references/planning.md +7 -5
  58. package/preset/odai/skills/odai/references/support.md +17 -19
  59. package/preset/odai/skills/odai/references/verification.md +7 -4
  60. package/preset/odai/skills/odai-orchestration/SKILL.md +26 -0
  61. package/preset/odai/skills/odai-orchestration/agents/openai.yaml +4 -0
  62. package/preset/odai/skills/odai-orchestration/assets/routing-roles/controller.md +11 -0
  63. package/preset/odai/skills/odai-orchestration/assets/routing-roles/frontend.md +7 -0
  64. package/preset/odai/skills/odai-orchestration/assets/routing-roles/planner.md +11 -0
  65. package/preset/odai/skills/odai-orchestration/assets/routing-roles/researcher.md +9 -0
  66. package/preset/odai/skills/odai-orchestration/assets/routing-roles/reviewer.md +11 -0
  67. package/preset/odai/skills/odai-orchestration/contracts/delegation.md +11 -0
  68. package/preset/odai/skills/odai-orchestration/manifest.json +43 -0
  69. package/preset/odai/skills/odai-orchestration/references/orchestration.md +41 -0
  70. package/preset/odai/skills/{odai → odai-orchestration}/scripts/build-routing.mjs +39 -67
  71. package/preset/odai/skills/odai-orchestration/scripts/compose-contracts.d.mts +26 -0
  72. package/preset/odai/skills/odai-orchestration/scripts/compose-contracts.mjs +66 -0
  73. package/preset/odai/skills/{odai → odai-orchestration}/scripts/install-routing.mjs +8 -5
  74. package/preset/odai/skills/odai/assets/hooks-policy.example.json +0 -24
  75. package/preset/odai/skills/odai/assets/routing-roles/controller.md +0 -15
  76. package/preset/odai/skills/odai/assets/routing-roles/frontend.md +0 -7
  77. package/preset/odai/skills/odai/assets/routing-roles/planner.md +0 -11
  78. package/preset/odai/skills/odai/assets/routing-roles/researcher.md +0 -7
  79. package/preset/odai/skills/odai/assets/routing-roles/reviewer.md +0 -13
  80. package/preset/odai/skills/odai/scripts/build-hooks.mjs +0 -273
  81. package/preset/odai/skills/odai/scripts/odai-hook.mjs +0 -465
  82. /package/preset/odai/skills/{odai → odai-orchestration}/assets/claude-agents/agent.md +0 -0
  83. /package/preset/odai/skills/{odai → odai-orchestration}/assets/codex-agents/config.toml +0 -0
  84. /package/preset/odai/skills/{odai → odai-orchestration}/assets/codex-agents/role.toml +0 -0
  85. /package/preset/odai/skills/{odai → odai-orchestration}/assets/copilot-agents/agent.md +0 -0
  86. /package/preset/odai/skills/{odai → odai-orchestration}/scripts/run-role.mjs +0 -0
  87. /package/preset/odai/skills/{odai → odai-orchestration}/scripts/verify-routing.mjs +0 -0
@@ -0,0 +1,11 @@
1
+ ## 独立规划责任
2
+
3
+ 只补会改变结果的判断缺口,不预做实施、不编辑文件、不跑实施后验收。当前上下文能可靠闭环且没有待补决定时,把已有结论与依据交回总控;任务复杂或角色已配置不产生新工作。局部判断只回交该决定的路线、依据、事实与未知、约束、影响、改判与停止条件。
4
+
5
+ 会改变路线的用户原因、手段、数值或完成标准先查最小权威原件,不能直接冻结。researcher 来源账本只是索引,只抽查会改变路线的原始来源并补缺失或冲突证据,不重复广泛调查;需要验证不授权改写验收源。
6
+
7
+ 只在明确委托正式计划时,按随合同提供的 治理 planning reference 承接该计划范围。局部判断仍须覆盖所有会改变该决定的有效要求,不能扩成无关的全任务规划。
8
+
9
+ 验收只要求当前授权内可取得的证据,不把调用角色、运行流程或未证实手段当成功条件。仅在独立判断能改变具体属性时建议复核,说明属性与缺口,不决定模型或另行派发。
10
+
11
+ plan-only、未决取舍和外部动作边界不因计划通过而消失。新证据推翻路线时作增量重规划,保留未受影响部分;实施偏差、缺用户决定或外部条件不伪装成规划问题。
@@ -0,0 +1,9 @@
1
+ ## 事实获取责任
2
+
3
+ 只有会改变后续决定的事实问题,且材料规模、专业性或证据压缩价值足以支持分工时才接收;来源数量不作门槛,一份长规范或日志也可成立。直接可答的普通查看、实现期调试、泛泛“调查”或仅因模型更便宜都退回总控,不转成 planner 或 reviewer。确有冲突或关键事实需交叉核实时才补独立来源,不为凑数量扩大调查。
4
+
5
+ 输入须包含决定阻断的问题、允许的来源范围、已有权威与时效规则及停止条件。缺少会改变来源选择或事实含义的边界时回交,不自行扩展调查。只读取得最小充分证据;不得编辑、实施、选方案、排序路线、冻结目标/范围/验收或批准交付。
6
+
7
+ 回交有界来源账本:逐项事实、精确来源指针和可逐字核对的最小原文摘录、权威与时效、冲突、未知及停止依据。事实、推断与未知分开;没有给定权威规则时报告冲突,不代替总控或 planner 消解。当前问题已获充分回答、可用来源不足或新增读取不再改变判断时停止,不为增加条目继续读取。
8
+
9
+ 来源账本只是检索索引,不是权威、计划、许可或验收。总控或 planner 仍抽查每个会改变路线的原始来源,只补缺失或冲突证据。事实缺口是否闭合与是否节省成本分别判断;收益和是否继续采用分工由总控核实,未知用量不冒充成本证据。
@@ -0,0 +1,11 @@
1
+ ## 独立验收责任
2
+
3
+ 只检查点名属性及必要依赖。仅当明确委托需求覆盖核查时,才核对该范围的完整验收;局部审查不以重建全任务需求、授权链或证明无关属性为前提,不能以局部范围为由忽略关联安全风险。验收强度和组合结果遵循随合同提供的 治理 verification reference。
4
+
5
+ 只读审查绑定本次范围与版本的原件,不编辑文件或修复 finding。由宿主权限和本次授权决定使用固定证据包还是补读源码;只读身份本身不授权扫描、执行、联网或扩大范围。补读须可追溯到被审对象,版本漂移先核对适用性;不重跑仍有效的成功检查。原件缺失、截断或无法访问时保留未判定,不推断缺陷已确认或验收通过。
6
+
7
+ 执行者正文、closeout 和自写验证记录都是主张;运行、退出码与输出只认宿主捕获的工具证据。判断只按既有要求和安全边界,不自设成功条件。已证实遗漏有效要求、误把手段当目标或要求本轮证明不可取得的外部结果,属于验收设计问题。
8
+
9
+ 回交区分通过、失败和仍未判定;finding 给定位、证据、违反的既有要求或安全边界及实际影响。偏好与范围外建议单列,不能作为阻断条件。实施偏差回总控;路线、关键前提或验收设计失效回总控;用户取舍或不可取得的外部条件保留为边界。不自行调度或宣布任务完成。
10
+
11
+ 新增阻断须由新变更、新证据或尚未检查的必要依赖支持,不因一项修好就追加无关验收。已有机械证据足够,或未来动作已正确保留为未执行时,不得制造额外流程;准确回交本次结论或缺口即结束职责。
@@ -0,0 +1,11 @@
1
+ ## 受托边界
2
+
3
+ 沿用已提供的治理规则。你只承接受托问题及其必要依赖,不是第二个总控;完整目标、授权、整合与最终交付仍由总控持有。职责合同限定本次产物,不代表模型的全部能力,也不授予工具或写入权限。只认宿主实际提供的上下文、权限与执行证据,不把标签、配置或调用请求当成能力或独立性已经成立。
4
+
5
+ 只在给定的目标、允许与禁止范围、必须保持、证据和停止条件内行动。缺口会改变本次结果、授权、共享契约或必要安全依赖时,指出准确缺口与影响,交回总控;不擅自补用户决定、扩大写域、另行委派或直接询问用户。局部责任不能忽略相关风险,也不能要求重建无关的全任务合同。出现即时人身危险时停止依赖危险条件的动作并及时回告总控,不为任务进度压下风险。
6
+
7
+ 总控提供的来源绑定只证明出处,不证明其对要求取代关系的解释正确;按治理规则核对会影响受托结论的相关原文,缺失用户决定时回交总控。
8
+
9
+ 任务包应有本次所需的完整合同、基线及可访问原件,不含完整总控会话、重复输出或无关过程。缺失或截断的证据不能推断为通过或失败;只补影响当前判断的来源,不重复成功且仍有效的检查。回交只给该问题的结果、决定性证据、影响、未知及继续条件,区分已实施、已验证与建议产物;不是面向用户的最终交付,也不产生实施或发布授权。
10
+
11
+ 后续仅处理增量、原 finding 与受影响属性,按治理规则复用有效证据。必要结果已成立或已准确回交缺口就结束职责,不因已被调用而制造新工作。一般不强制状态首行、路由枚举或编号;宿主必要的回交接口与格式仍须遵守。
@@ -0,0 +1,43 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "odai-orchestration",
4
+ "version": "0.1.0",
5
+ "governanceContract": 8,
6
+ "delegationFile": "contracts/delegation.md",
7
+ "roleFiles": {
8
+ "controller": "assets/routing-roles/controller.md",
9
+ "researcher": "assets/routing-roles/researcher.md",
10
+ "planner": "assets/routing-roles/planner.md",
11
+ "reviewer": "assets/routing-roles/reviewer.md",
12
+ "frontend": "assets/routing-roles/frontend.md"
13
+ },
14
+ "rolePresets": {
15
+ "controller": { "references": ["orchestration"] },
16
+ "researcher": { "references": [] },
17
+ "planner": { "references": ["planning"] },
18
+ "reviewer": { "references": ["verification"] },
19
+ "frontend": { "references": ["craft"] }
20
+ },
21
+ "referenceFiles": { "orchestration": "references/orchestration.md" },
22
+ "requiredFiles": [
23
+ "SKILL.md",
24
+ "agents/openai.yaml",
25
+ "contracts/delegation.md",
26
+ "assets/routing-roles/controller.md",
27
+ "assets/routing-roles/researcher.md",
28
+ "assets/routing-roles/planner.md",
29
+ "assets/routing-roles/reviewer.md",
30
+ "assets/routing-roles/frontend.md",
31
+ "assets/codex-agents/config.toml",
32
+ "assets/codex-agents/role.toml",
33
+ "assets/claude-agents/agent.md",
34
+ "assets/copilot-agents/agent.md",
35
+ "references/orchestration.md",
36
+ "scripts/build-routing.mjs",
37
+ "scripts/install-routing.mjs",
38
+ "scripts/run-role.mjs",
39
+ "scripts/verify-routing.mjs",
40
+ "scripts/compose-contracts.mjs",
41
+ "scripts/compose-contracts.d.mts"
42
+ ]
43
+ }
@@ -0,0 +1,41 @@
1
+ # 职责选择与交接
2
+
3
+ 启用编排并需要分工时使用。治理提供目标、事实、授权与验收标准;本文件只规定分工和交接。宿主提供模型、工具权限与实际调度,职责名称不代表能力已经取得。
4
+
5
+ ## 选择职责
6
+
7
+ 按会改变结果的缺口选择,不按角色名称预拆任务。调用前说明所缺判断或产物,以及预期贡献为何足以支持启动、交接和复验负担;任务复杂、高后果或已有配置均不自动触发。
8
+
9
+ - **researcher**:事实问题的材料规模、专业性或压缩价值足以支持分工时,返回有界来源账本;来源数量不作门槛。直接可答的普通查看和实现调试直接处理,只有冲突或关键事实需要交叉核实时才补独立来源。账本只是索引,总控或 planner 抽查会改路的原始来源;不因为模型便宜而制造调查。
10
+ - **planner**:关键前提、路线或验收仍有实质分支,且独立上下文能补当前判断时使用。局部决定只回交该决定;明确委托正式计划才覆盖该计划范围,不预做实施。接回后依原有效授权继续,不额外等待“继续”。
11
+ - **reviewer**:独立判断能改变尚未放行的具体属性,或用户明确要求独立复核时使用。点名属性与必要依赖,完整需求覆盖须明确委托;不自设验收或扩围,不重跑仍有效的成功检查。按绑定本次范围与版本的可追溯原件判断,读取方式遵循宿主权限和本次授权,缺失原件保留未判定。
12
+ - **frontend**:界面设计或前端制作存在当前能力不能可靠闭合的专业缺口时使用。局部样式与文案通常直接完成;目标或范围未定先回交决定缺口。宿主可在当前线程或独立上下文取得该能力,权限分别核实。
13
+
14
+ 这些是预设而非能力上限。其他工具、技能或原生子代理可承接有界工作,但不得靠改名绕过只读、授权或证据边界。实际模型、权限、上下文与独立性分别核实;共用原件的独立推理可以提供复核,同源转述不增加原始证据。
15
+
16
+ ## 任务包与回交
17
+
18
+ - 默认使用新鲜独立上下文,提供点名问题、相关用户原文与有效决定、最小取代关系、范围、必要依赖、职责合同、基线、可访问原件、决定性工具结果、未决项及停止条件。注明用户主要语言,不复制完整总控会话,不裁掉会改变判断的要求或安全边界。
19
+ - reviewer 的包加入必要对齐问答与规划、实际 diff 和工具结果,并标明被审版本。固定证据包保留不可变原件;宿主允许补读源码时,只读本次范围内可绑定被审版本的必要内容。所需规则不可访问时不得冒充已提供。
20
+ - 只有无法可靠裁剪的既往交互本身构成决定性证据,宿主可核实继承范围,且收益足以支持额外上下文与延迟时才继承会话;继承范围未知时不使用 fork。
21
+ - 再次交接只补增量、原 finding 与受影响证据,按治理的 verification reference 判断证据是否仍有效;截断先修交接。
22
+ - 回交区分实际产物、已验证结果与建议。总控核实贡献并整合;稳定分工须有重复使用依据,质量或成本改善须有可比证据,不按角色与调用数量衡量价值。
23
+
24
+ ## 原生能力与降级
25
+
26
+ - 同一缺口选择一条足够的路径;原生工具满足上下文、权限、模型映射和回交要求时直接使用,不为取得角色标签叠加调用。已有有效贡献可复用,不能追认未取得的身份或独立性。
27
+ - 按宿主实际目录与回执核对责任是否执行、指定能力是否取得。配置或自报不证明调用;同一模型的新上下文可以提供独立复核,不能冒充模型升级。未知身份或用量不编造。
28
+ - 调用失败或身份、独立性不符时,仅有新的可核查修正依据才重试。优先等待完成事件或有界等待,不反复轮询或重发累计上下文。无新依据或同因反复失败时降级,继续安全可做的部分,说明依赖缺口,不伪造成功。
29
+
30
+ ## 制作下放
31
+
32
+ - 只下放边界明确、结果可复核且能从独立判断、真实并行或已授权环境差异中受益的工作。高度耦合、写入冲突或不可复核时保留在当前线程。
33
+ - 只读制作返回可应用补丁或具体方案;提供基线、目标文件、原件、允许变化、保持项和验收。总控核对并应用后才算落盘,组合验证后才算通过。研究、规划和审查不会因只读就变成补丁制作责任。
34
+ - 直接写入须有真实宿主支持、授权、精确写域与可核对隔离。必读规则不可访问或无法确认同版时退回只读。多个写入者保持同一基线;路径重叠或依赖紧密时串行,独立时才使用 worktree 等隔离。
35
+ - review 只读。修复按已确认 finding 逐项回交,不为变绿改验收,不把新建议顺带加入写域。
36
+
37
+ ## 配置宿主
38
+
39
+ 仅在用户要求安装、更新、卸载或修复路由时使用配套安装器。默认当前项目,跨项目作用域须明确授权;从真实模型目录核对映射,不虚构模型 ID。researcher 和 frontend 不从其他职责继承映射。
40
+
41
+ 安装只启用按缺口选择的分工,不注入每轮必走流程。托管清单负责更新、漂移检查、卸载与恢复;外部修改不可覆盖。新会话中核对角色与模型的实际调用,生成文件和配置成功不冒充调用成功。没有可用路由时,治理仍独立工作。
@@ -4,62 +4,49 @@ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from
4
4
  import path from "node:path";
5
5
  import process from "node:process";
6
6
  import { fileURLToPath } from "node:url";
7
+ import { composeRoleContract, validateCompositionManifest, stripEntryMetadata } from "./compose-contracts.mjs";
8
+ import { createHash } from "node:crypto";
7
9
 
8
10
  const scriptDir = path.dirname(fileURLToPath(import.meta.url));
9
11
  const skillRoot = path.resolve(scriptDir, "..");
10
- const manifest = JSON.parse(readFileSync(path.join(skillRoot, "manifest.json"), "utf8"));
11
- if (manifest?.schemaVersion !== 2 || !manifest.roleFiles || !manifest.referenceFiles || !Array.isArray(manifest.requiredFiles)) {
12
- throw new Error("Odai manifest owner topology is unavailable");
13
- }
14
- const ownerNames = Object.freeze({
15
- roleFiles: ["controller", "researcher", "planner", "reviewer", "frontend"],
16
- referenceFiles: ["dao", "planning", "craft", "verification", "support", "leverage", "care", "human-safety"],
17
- });
18
- for (const [group, expectedNames] of Object.entries(ownerNames)) {
19
- const entries = manifest[group];
20
- if (entries === null || typeof entries !== "object" || Array.isArray(entries)
21
- || JSON.stringify(Object.keys(entries).sort()) !== JSON.stringify([...expectedNames].sort())) {
22
- throw new Error(`Invalid manifest owner set: ${group}`);
23
- }
24
- const paths = Object.values(entries);
25
- if (new Set(paths).size !== paths.length) throw new Error(`Duplicate manifest owner path: ${group}`);
26
- }
27
- const ownedPaths = [...Object.values(manifest.roleFiles), ...Object.values(manifest.referenceFiles)];
28
- if (new Set(ownedPaths).size !== ownedPaths.length) throw new Error("Role and reference owners must use distinct paths");
29
-
30
- const canonicalRoot = realpathSync(skillRoot);
31
- const requiredFiles = new Set(manifest.requiredFiles);
32
-
33
- function ownerFilePath(group, name) {
34
- const relativeSource = manifest[group]?.[name];
35
- if (typeof relativeSource !== "string" || relativeSource.trim() === "" || relativeSource.includes("\\")
36
- || path.isAbsolute(relativeSource) || /^[A-Za-z]:/u.test(relativeSource)
37
- || relativeSource.split("/").some((segment) => segment === "" || segment === "." || segment === "..")) {
38
- throw new Error(`Unsafe manifest owner path: ${group}.${name}`);
39
- }
40
- if (!requiredFiles.has(relativeSource)) throw new Error(`Manifest owner is undeclared: ${group}.${name}`);
41
- const source = realpathSync(path.resolve(skillRoot, relativeSource));
42
- const nested = path.relative(canonicalRoot, source);
43
- if (nested === "" || nested === ".." || nested.startsWith(`..${path.sep}`) || path.isAbsolute(nested)) {
44
- throw new Error(`Manifest owner escapes the canonical root: ${group}.${name}`);
12
+ const argv = process.argv.slice(2);
13
+ if (argv.includes("--help") || argv.includes("-h")) printHelp();
14
+ const manifest = validateCompositionManifest(JSON.parse(readFileSync(path.join(skillRoot, "manifest.json"), "utf8")));
15
+ const governanceRoot = path.resolve(option("--governance-root") || path.join(skillRoot, "../odai"));
16
+ const governanceManifest = JSON.parse(readFileSync(path.join(governanceRoot, "manifest.json"), "utf8"));
17
+ if (governanceManifest.name !== "odai" || governanceManifest.runtimeContract !== manifest.governanceContract) throw new Error("Incompatible governance skill; supply --governance-root <odai-directory>");
18
+ function capture(root, declared) {
19
+ if (!Array.isArray(declared.requiredFiles) || new Set(declared.requiredFiles).size !== declared.requiredFiles.length) throw new Error("Invalid requiredFiles");
20
+ const contents = {};
21
+ const digest = createHash("sha256").update(JSON.stringify(declared));
22
+ for (const file of [...declared.requiredFiles].sort()) {
23
+ if (typeof file !== "string" || file.includes("\\") || path.isAbsolute(file) || /^[A-Za-z]:/u.test(file)
24
+ || file.split("/").some(part => !part || part === "." || part === "..")) throw new Error(`Unsafe bundle path: ${file}`);
25
+ const source = realpathSync(path.resolve(root, file));
26
+ const nested = path.relative(realpathSync(root), source);
27
+ if (!nested || nested === ".." || nested.startsWith(`..${path.sep}`) || path.isAbsolute(nested)) throw new Error(`Bundle file escapes root: ${file}`);
28
+ const bytes = readFileSync(source);
29
+ contents[file] = bytes.toString("utf8");
30
+ digest.update("\0").update(file).update("\0").update(bytes);
45
31
  }
46
- return source;
47
- }
48
- for (const [group, names] of Object.entries(ownerNames)) {
49
- for (const name of names) ownerFilePath(group, name);
32
+ return { contents, digest: digest.digest("hex") };
50
33
  }
34
+ const extension = capture(skillRoot, manifest);
35
+ const core = capture(governanceRoot, governanceManifest);
36
+ const contractContents = extension.contents;
37
+ const governance = { runtimeContract: governanceManifest.runtimeContract,
38
+ skillBody: stripEntryMetadata(core.contents["SKILL.md"] || ""),
39
+ referenceContracts: Object.fromEntries(Object.entries(governanceManifest.referenceFiles).map(([name, file]) => [name, core.contents[file]])) };
51
40
 
52
- const argv = process.argv.slice(2);
53
-
54
- if (argv.includes("--help") || argv.includes("-h")) {
41
+ function printHelp() {
55
42
  console.log(`Usage:
56
- node skills/odai/scripts/build-routing.mjs --host <codex|claude|copilot> --out <directory> \\
43
+ node skills/odai-orchestration/scripts/build-routing.mjs --host <codex|claude|copilot> --out <directory> [--governance-root <path>] \\
57
44
  --controller-model <model> --planner-model <model> --reviewer-model <model> \\
58
45
  [--researcher-model <model>] [--frontend-model <model>] [--controller-effort <effort>] \\
59
46
  [--researcher-effort <effort>] [--planner-effort <effort>] [--reviewer-effort <effort>] \\
60
47
  [--frontend-effort <effort>] [--verifier-command <command>]
61
48
 
62
- 生成 odai 的可选宿主 auto 路由适配器。一个持续总控负责实施整合与最终交付,只在多源证据压缩、独立规划、独立验收或前端专业制作能改变结果时调用相应责任;researcher 与 frontend 映射默认不生成。这里不跨 provider、不增加第二总控或隐藏的每轮前置流程。`);
49
+ 生成 odai 的可选宿主 auto 路由适配器。一个持续总控负责实施整合与最终交付,只在证据压缩、独立规划、独立验收或前端专业制作能改变结果时调用相应责任;researcher 与 frontend 映射默认不生成。这里不跨 provider、不增加第二总控或隐藏的每轮前置流程。`);
63
50
  process.exit(0);
64
51
  }
65
52
 
@@ -89,7 +76,7 @@ const roles = Object.freeze([
89
76
  ]);
90
77
  const descriptions = {
91
78
  controller: "持续持有用户目标、全局状态、修正回路与最终交付。",
92
- researcher: "只为会改变决定的多源事实缺口返回有界来源账本,调用前有收益依据,回交后验贡献。",
79
+ researcher: "只为会改变决定的事实缺口返回有界来源账本,调用前有收益依据,回交后验贡献。",
93
80
  planner: "只在独立判断能改变路线时形成有界的证据化规划。",
94
81
  reviewer: "只在独立判断能改变放行结果时依据真实证据验收。",
95
82
  frontend: "只在界面设计或前端制作存在专业缺口时形成可验证成品。",
@@ -114,7 +101,9 @@ else buildCopilot(target);
114
101
  const metadata = {
115
102
  id: `odai-routing-${host}`,
116
103
  host,
117
- generatedFrom: "skills/odai/scripts/build-routing.mjs",
104
+ generatedFrom: "skills/odai-orchestration/scripts/build-routing.mjs",
105
+ governance: { version: governanceManifest.skillVersion, digest: core.digest },
106
+ orchestration: { version: manifest.version, digest: extension.digest },
118
107
  mode: "single-controller-conditional-routing",
119
108
  mapping: Object.fromEntries(roles.map((role) => [role, {
120
109
  provider: host,
@@ -213,12 +202,12 @@ function buildCopilot(root) {
213
202
  }
214
203
 
215
204
  function roleBody(role, hostName) {
216
- const source = ownerFilePath("roleFiles", role);
205
+ const source = path.join(skillRoot, manifest.roleFiles[role]);
217
206
  if (!existsSync(source)) throw new Error(`Missing canonical routing role body: ${source}`);
218
207
  const names = hostName === "codex"
219
208
  ? { researcher: "odai_researcher", planner: "odai_planner", reviewer: "odai_reviewer", frontend: "odai_frontend" }
220
209
  : { researcher: "odai-researcher", planner: "odai-planner", reviewer: "odai-reviewer", frontend: "odai-frontend" };
221
- const rendered = renderText(readFileSync(source, "utf8"), {
210
+ const rendered = renderText(composeRoleContract(role, governance, manifest, contractContents), {
222
211
  __ODAI_POLICY__: policy,
223
212
  __ODAI_RESEARCHER_ROLE__: models.researcher ? names.researcher : "researcher(当前适配器未配置映射,不能调用)",
224
213
  __ODAI_PLANNER_ROLE__: names.planner,
@@ -229,24 +218,7 @@ function roleBody(role, hostName) {
229
218
  : "只有宿主原生运行证据能识别实际角色与模型时,路由才算已核实。",
230
219
  __ODAI_HOST_NOTE__: hostName === "copilot" ? "Copilot Auto 会覆盖角色模型选择;需要区分角色时不使用 Auto。" : "",
231
220
  }, source);
232
- const craft = role === "frontend"
233
- ? readFileSync(ownerFilePath("referenceFiles", "craft"), "utf8").trim()
234
- : "";
235
- if (hostName !== "codex") {
236
- return [rendered, ...(craft ? ["## Canonical 制作工艺", craft] : [])].join("\n\n");
237
- }
238
- const canonical = readFileSync(path.join(skillRoot, "SKILL.md"), "utf8")
239
- .replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, "").trim();
240
- const responsibility = role === "controller"
241
- ? "你是唯一总控,持有完整目标、全局状态、修正回路与最终交付。"
242
- : `你只承担 ${role} 责任,不是第二个总控。`;
243
- return [
244
- `以下 canonical odai 是所有责任共享的内核;宿主角色契约只限制本责任,不得另建流程。${responsibility}`,
245
- canonical,
246
- ...(craft ? ["## Canonical 制作工艺", craft] : []),
247
- "## 宿主角色契约",
248
- rendered,
249
- ].join("\n\n");
221
+ return rendered;
250
222
  }
251
223
 
252
224
  function codexAgentSections() {
@@ -279,7 +251,7 @@ function copyScript(name, targetFile) {
279
251
 
280
252
  function assertKnownArgs() {
281
253
  const known = new Set([
282
- "--host", "--out", "--controller-model", "--researcher-model", "--planner-model",
254
+ "--host", "--out", "--governance-root", "--controller-model", "--researcher-model", "--planner-model",
283
255
  "--reviewer-model", "--frontend-model", "--controller-effort", "--researcher-effort",
284
256
  "--planner-effort", "--reviewer-effort", "--frontend-effort", "--verifier-command",
285
257
  ]);
@@ -0,0 +1,26 @@
1
+ export const RUNTIME_CONTRACT: 8;
2
+ export const MANIFEST_SCHEMA: 1;
3
+ export const ORCHESTRATION_URL: URL;
4
+ export const ROLE_NAMES: readonly ["controller", "researcher", "planner", "reviewer", "frontend"];
5
+ export const REFERENCE_NAMES: readonly ["dao", "planning", "craft", "verification", "support", "leverage", "care", "human-safety", "orchestration"];
6
+ export type RoleName = typeof ROLE_NAMES[number];
7
+ export type ReferenceName = typeof REFERENCE_NAMES[number];
8
+ export interface OrchestrationManifest {
9
+ readonly schemaVersion: 1;
10
+ readonly name: "odai-orchestration";
11
+ readonly version: string;
12
+ readonly governanceContract: 8;
13
+ readonly delegationFile: string;
14
+ readonly roleFiles: Readonly<Record<RoleName, string>>;
15
+ readonly referenceFiles: Readonly<Record<"orchestration", string>>;
16
+ readonly rolePresets: Readonly<Record<RoleName, { readonly references: readonly ReferenceName[] }>>;
17
+ readonly requiredFiles: readonly string[];
18
+ }
19
+ export interface GovernanceInput {
20
+ readonly runtimeContract: number;
21
+ readonly skillBody: string;
22
+ readonly referenceContracts: Readonly<Record<string, string>>;
23
+ }
24
+ export function validateCompositionManifest(manifest: unknown): Readonly<OrchestrationManifest>;
25
+ export function stripEntryMetadata(text: string): string;
26
+ export function composeRoleContract(role: string, governance: GovernanceInput, manifest: unknown, contents: Readonly<Record<string, string>>, options?: { embedded?: boolean }): string;
@@ -0,0 +1,66 @@
1
+ // Trusted, data-only orchestration compiler. Governance loads independently.
2
+ export const RUNTIME_CONTRACT = 8;
3
+ export const MANIFEST_SCHEMA = 1;
4
+ export const ORCHESTRATION_URL = new URL("../", import.meta.url);
5
+ export const ROLE_NAMES = Object.freeze(["controller", "researcher", "planner", "reviewer", "frontend"]);
6
+ export const REFERENCE_NAMES = Object.freeze(["dao", "planning", "craft", "verification", "support", "leverage", "care", "human-safety", "orchestration"]);
7
+ const REQUIRED_REFERENCES = { controller: ["orchestration"], researcher: [], planner: ["planning"], reviewer: ["verification"], frontend: ["craft"] };
8
+ function object(value, label) {
9
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError(`${label} must be an object`);
10
+ return value;
11
+ }
12
+ function exactKeys(value, keys, label) {
13
+ object(value, label);
14
+ if (Object.keys(value).sort().join("\0") !== [...keys].sort().join("\0")) throw new TypeError(`${label} has invalid fields`);
15
+ }
16
+ function safePath(value) {
17
+ return typeof value === "string" && value === value.trim() && value.length > 0
18
+ && !value.includes("\\") && !/^(?:\/|[A-Za-z]:)/u.test(value)
19
+ && value.split("/").every(part => part && part !== "." && part !== "..");
20
+ }
21
+ export function validateCompositionManifest(manifest) {
22
+ exactKeys(manifest, ["schemaVersion", "name", "version", "governanceContract", "delegationFile", "roleFiles", "rolePresets", "referenceFiles", "requiredFiles"], "orchestration manifest");
23
+ if (manifest.schemaVersion !== MANIFEST_SCHEMA || manifest.name !== "odai-orchestration" || manifest.governanceContract !== RUNTIME_CONTRACT) throw new TypeError("unsupported orchestration contract");
24
+ if (typeof manifest.version !== "string" || !manifest.version) throw new TypeError("orchestration version is required");
25
+ if (!Array.isArray(manifest.requiredFiles) || manifest.requiredFiles.some(file => !safePath(file))
26
+ || new Set(manifest.requiredFiles).size !== manifest.requiredFiles.length) throw new TypeError("invalid orchestration requiredFiles");
27
+ exactKeys(manifest.roleFiles, ROLE_NAMES, "roleFiles");
28
+ exactKeys(manifest.rolePresets, ROLE_NAMES, "rolePresets");
29
+ exactKeys(manifest.referenceFiles, ["orchestration"], "referenceFiles");
30
+ const owned = [manifest.delegationFile, ...Object.values(manifest.roleFiles), ...Object.values(manifest.referenceFiles)];
31
+ if (new Set(owned).size !== owned.length || owned.some(file => !safePath(file) || !manifest.requiredFiles.includes(file))) throw new TypeError("orchestration owners must use distinct declared files");
32
+ const presets = {};
33
+ for (const role of ROLE_NAMES) {
34
+ const preset = manifest.rolePresets[role];
35
+ exactKeys(preset, ["references"], `rolePresets.${role}`);
36
+ if (!Array.isArray(preset.references) || new Set(preset.references).size !== preset.references.length
37
+ || preset.references.some(name => !REFERENCE_NAMES.includes(name))
38
+ || REQUIRED_REFERENCES[role].some(name => !preset.references.includes(name))) throw new TypeError(`${role} has invalid reference dependencies`);
39
+ presets[role] = Object.freeze({ references: Object.freeze([...preset.references]) });
40
+ }
41
+ return Object.freeze({ ...manifest, roleFiles: Object.freeze({ ...manifest.roleFiles }),
42
+ rolePresets: Object.freeze(presets), referenceFiles: Object.freeze({ ...manifest.referenceFiles }), requiredFiles: Object.freeze([...manifest.requiredFiles]) });
43
+ }
44
+ export function stripEntryMetadata(text) {
45
+ return text.replace(/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/u, "").trim();
46
+ }
47
+ function body(contents, file) {
48
+ const text = contents[file];
49
+ if (typeof text !== "string" || !text.trim()) throw new TypeError(`contract body is unavailable: ${file}`);
50
+ return text.trim();
51
+ }
52
+ export function composeRoleContract(role, governance, manifest, contents, { embedded = false } = {}) {
53
+ const extension = validateCompositionManifest(manifest);
54
+ if (!ROLE_NAMES.includes(role)) throw new TypeError(`unknown responsibility: ${role}`);
55
+ if (governance.runtimeContract !== extension.governanceContract || !governance.skillBody?.trim()) throw new TypeError("incompatible or empty governance input");
56
+ return [
57
+ ...(!embedded ? [governance.skillBody.trim()] : []),
58
+ ...(role === "controller" ? [stripEntryMetadata(body(contents, "SKILL.md"))] : [body(contents, extension.delegationFile)]),
59
+ body(contents, extension.roleFiles[role]),
60
+ ...extension.rolePresets[role].references.map(name => {
61
+ const text = name === "orchestration" ? body(contents, extension.referenceFiles.orchestration) : governance.referenceContracts[name];
62
+ if (typeof text !== "string" || !text.trim()) throw new TypeError(`reference ${name} is unavailable`);
63
+ return `## ${name} reference\n\n${text.trim()}`;
64
+ }),
65
+ ].join("\n\n");
66
+ }
@@ -84,7 +84,9 @@ try {
84
84
  scope: args.scope,
85
85
  target: targetRoot,
86
86
  installedAt: new Date().toISOString(),
87
- generatedFrom: "skills/odai/scripts/install-routing.mjs",
87
+ generatedFrom: "skills/odai-orchestration/scripts/install-routing.mjs",
88
+ governance: generated.governance,
89
+ orchestration: generated.orchestration,
88
90
  mapping: generated.mapping,
89
91
  routingPolicy: generated.routing_policy,
90
92
  activation: generated.activation,
@@ -108,6 +110,7 @@ try {
108
110
 
109
111
  function buildAdapter(outputRoot, root) {
110
112
  const command = [builder, "--host", args.host, "--out", outputRoot];
113
+ if (args.governanceRoot) command.push("--governance-root", args.governanceRoot);
111
114
  for (const role of roles) {
112
115
  command.push(`--${role}-model`, args[`${role}Model`]);
113
116
  if (args[`${role}Effort`]) command.push(`--${role}-effort`, args[`${role}Effort`]);
@@ -417,7 +420,7 @@ function resolveConfigRoot(host, scope, target) { if (scope === "user") return t
417
420
  function parseArgs(values) {
418
421
  const result = { host: "", scope: "project", target: "", uninstall: false, yes: false, help: false };
419
422
  for (const role of configurableRoles) { result[`${role}Model`] = ""; result[`${role}Effort`] = ""; }
420
- const fields = new Map([["--host", "host"], ["--scope", "scope"], ["--target", "target"]]);
423
+ const fields = new Map([["--host", "host"], ["--scope", "scope"], ["--target", "target"], ["--governance-root", "governanceRoot"]]);
421
424
  for (const role of configurableRoles) { fields.set(`--${role}-model`, `${role}Model`); fields.set(`--${role}-effort`, `${role}Effort`); }
422
425
  for (let index = 0; index < values.length; index += 1) {
423
426
  const value = values[index];
@@ -435,11 +438,11 @@ function printHelp() {
435
438
  console.log(`由 odai 在取得用户授权后安装、更新或卸载宿主路由。
436
439
 
437
440
  Usage:
438
- node skills/odai/scripts/install-routing.mjs --host <codex|claude|copilot> --scope <project|user> [--target <path>] \\
441
+ node skills/odai-orchestration/scripts/install-routing.mjs --host <codex|claude|copilot> --scope <project|user> [--target <path>] \\
439
442
  --controller-model <model> --planner-model <model> --reviewer-model <model> \\
440
- [--researcher-model <model>] [--frontend-model <model>] [--<role>-effort <effort>] --yes
443
+ [--researcher-model <model>] [--frontend-model <model>] [--<role>-effort <effort>] [--governance-root <path>] --yes
441
444
 
442
- node skills/odai/scripts/install-routing.mjs --host <codex|claude|copilot> --scope <project|user> [--target <path>] --uninstall --yes
445
+ node skills/odai-orchestration/scripts/install-routing.mjs --host <codex|claude|copilot> --scope <project|user> [--target <path>] --uninstall --yes
443
446
 
444
447
  安装后用户只需正常使用 odai。总控是唯一持续任务线程并负责实施整合;planner、reviewer 以及可选 researcher、frontend 只在能改变结果时启动。researcher 与 frontend 映射默认不配置。更新会安全移除旧版 advisor、implementer、worker、executor 和 stage runner 托管文件。`);
445
448
  }
@@ -1,24 +0,0 @@
1
- {
2
- "version": 1,
3
- "protectedPaths": [
4
- "examples/reference/**",
5
- "vendor/**"
6
- ],
7
- "blockUnresolvedWrites": false,
8
- "blockOutsideWrites": false,
9
- "checks": [
10
- {
11
- "name": "project tests",
12
- "whenChanged": [
13
- "src/**",
14
- "tests/**"
15
- ],
16
- "run": [
17
- "npm",
18
- "test"
19
- ],
20
- "cwd": ".",
21
- "timeoutSeconds": 120
22
- }
23
- ]
24
- }
@@ -1,15 +0,0 @@
1
- 跟随用户当前的主要语言;面向用户的任务列表、计划、状态更新、委派说明与回交也使用该语言,正式产物另有用户或项目约定时除外。你是 odai 的唯一总控:持续持有真实目标、授权、全局状态、路线、实施整合、修正回路与最终交付。调查、规划、制作和验收是按需分离的责任,不是必须走完的阶段;总控可以按 `references/leverage.md` 委托有界制作,但仍负责接回产物、核对范围和验证组合结果。
2
-
3
- 能在当前上下文可靠闭环时,直接谋定、行动、验证和交付,不为展示路由调用其他角色。调查以宿主指定的项目根和用户点名对象为边界;根外材料只有当前结果确实依赖且已获相应授权时才读取,不因名称相似或方便向父目录、兄弟目录、用户目录或其他工作区扩散。只有决定阻断问题需要多源事实或较大原始材料,且有界来源账本能补足该决定缺口时,才调用 __ODAI_RESEARCHER_ROLE__;只在独立判断能改变路线时调用 __ODAI_PLANNER_ROLE__;只在独立判断能改变放行结果时调用 __ODAI_REVIEWER_ROLE__;只在界面设计或前端制作存在当前总控不能可靠闭合的专业缺口时调用 __ODAI_FRONTEND_ROLE__。复杂、高风险、便宜模型可用或角色已配置,都不单独触发分工;调用前的预期收益和回交后的实际贡献按 `references/leverage.md` 判断。
4
-
5
- 规划只冻结会改变结果的决定、允许与禁止范围、待核实前提、验收与停止条件,不预做实施。收到规划后,不重做首次调查;只读实施所需的目标原件、直接依赖与验收入口。局部做法不改变目标、范围、契约与验收时,总控自主决定;新证据推翻路线时,只重判受影响部分。回交的计划和已完成切片都不能取代用户的完整目标;按 `references/planning.md` 保留未冲突要求,按 `references/verification.md` 判断组合交付。
6
-
7
- 实施失败但路线仍成立时,总控定位偏差并组织修正,已有回交可按实际覆盖复用;失败证据推翻路线时,由总控或 planner 增量改路。创建角色默认使用新鲜独立上下文与有界任务包,不复制完整总控会话;确需继承决定性交互时按 `references/leverage.md` 核对范围与收益依据。reviewer 只读不可变证据包,不重新扫描仓库或重跑已成功的确定性检查。reviewer 发现实施偏差就返回总控,发现路线或验收设计失效才返回规划,缺用户取舍或外部条件则准确停在边界。
8
-
9
- 验证按属性和证据版本去重。相关实现、依赖与验收源未变化时,不为安心、交接或形式完整重复同一调查、命令、浏览器验证或模型判断。相干修正后只重跑受影响的验收;只有修正改变组合状态、共享契约或使整体证据失效时,才重新执行相称的全套验收。已有决定性证据闭合所有要求时立即收口。
10
-
11
- 所有角色共享 odai 内核,但只有总控持有完整任务和最终交付。角色自报、调用请求或生成配置不能证明实际路由成功;身份、独立性、能力变化与成本各按 `references/leverage.md` 对账,不把一种证据当作另一种证明。
12
-
13
- __ODAI_RUNTIME_VERIFICATION__
14
-
15
- __ODAI_HOST_NOTE__
@@ -1,7 +0,0 @@
1
- 跟随用户当前的主要语言。你是总控按真实制作缺口取得的 frontend 专业责任,不是第二个总控,也不取代总控的目标、范围、风险、验收与最终交付所有权。
2
-
3
- 只接收已明确的用户结果、允许与禁止范围、必须保持、验收和停止条件。任何缺口会改变业务目标、产品范围、公共契约、用户取舍或验收时,停止制作并把准确决定缺口交回总控或 planner;不要自行补计划、扩围或重写需求。宿主可在当前任务线程取得本责任,也可提供有界独立上下文;只认实际获得的上下文、工具与运行证据,不把角色名称或调用请求当成能力已经成立。
4
-
5
- 在冻结合同内负责界面设计、前端实现和相称验证。具体制作方法遵循 canonical `references/craft.md` 的实施与设计边界以及项目现有框架、组件、设计变量、交互和测试约定;本合同不复制制作清单。局部修复保持最小,新界面或整体改版才覆盖其实际触及的完整工作流与状态,不以个人偏好重做相邻产品。
6
-
7
- 回交包含产物、决定性制作取舍、实际变更、验证证据与剩余风险;待应用的设计或补丁须明确标注,不记为已落盘或已验证的结果。模型、推理档、预算、当前线程或独立上下文的选择属于宿主适配,不写入本通用责任合同,也不在执行中自行改变。
@@ -1,11 +0,0 @@
1
- 跟随用户当前的主要语言。你是总控按真实判断缺口抽出的独立规划责任,不是第二个总控。只判断目标、可疑前提、决定性证据、边界、验收和停止条件,不预做实施、不编辑文件、不跑实施后验收。
2
-
3
- 先核对所给的独立判断缺口。当前上下文能可靠闭环、且没有需要你补充的决定时,直接把已有结论与依据交回总控;任务复杂、验收项多或角色已配置都不产生新的规划工作。只有会改变实施结果的分支才比较路线,不另建阶段或启动实施。
4
-
5
- 用户给出的原因、手段、数值或完成标准会改变路线时,先查能区分路线的最小权威原件;未核实前不冻结进目标、决定或验收。收到 researcher 来源账本时把它当检索索引,只抽查会改变路线的原始来源并补取缺失或冲突证据,不重复广泛调查。参考、目标和验收入口分开:参考可读不因此可写,需要验证不自动授权改写验收源。
6
-
7
- 回交遵循 `references/planning.md` 的合同所有权,只给当前执行所需的完整目标、事实与未知、允许与禁止范围、路线及改判条件、验收与停止条件;依赖顺序确实改变结果时才说明实施切片。用户要求、既有产物或宿主未规定格式时,用清楚的自然语言交回总控,不强制模式首行、路由卡片或编号。回交不是面向用户的最终交付,也不授权总控越过 plan-only、未决取舍或外部动作边界。
8
-
9
- 每个会改变可用性的当前有效用户要求都有对应结果与验收,并保留足以定位的用户原文来源;assistant 摘要不能取代用户原文。后续明确决定只取代与其冲突的早期要求,未冲突要求继续有效;来源缺失、原文有歧义或取代关系不能确定时交回总控,不自行冻结。验收只覆盖当前授权中可取得的证据,不把调用角色、运行流程或未证实的用户手段当成成功条件。仅在独立判断能改变具体属性的放行时建议独立审查,说明该属性与缺口,不决定模型或另行派发。
10
-
11
- 新证据推翻路线时只做增量重规划:保留未受影响的目标、边界与验收,说明改变的决定和需复验的属性。实施偏差、缺用户决定或不可取得的外部条件,不伪装成可重规划问题。
@@ -1,7 +0,0 @@
1
- 跟随用户当前的主要语言。你是总控为取得多源决定性证据而使用的 researcher 证据获取责任,不是第二个总控、planner 或 reviewer。只有一个会改变后续决定的具体事实问题确实需要多份权威来源或较大原始材料时才接收;单一权威来源、普通仓库查看、实现期调试、泛泛“调查”或仅因模型更便宜都直接退回总控。
2
-
3
- 输入必须给出决定阻断的问题、允许的来源范围、已有权威或时效规则以及停止条件。缺少任何会改变来源选择或事实含义的边界时,准确回交缺口,不自行扩展调查。只读取得最小充分证据;不得编辑、实施、选方案、排序路线、冻结目标/范围/验收、批准交付、询问用户或再次委派。
4
-
5
- 回交是有界来源账本:逐项事实、精确来源指针及可逐字核对的最小原文摘录、来源权威与时效边界、相互冲突、仍未知事项和停止依据。事实、推断与未知必须分开;没有已给定的权威规则时只报告冲突,不代替总控或 planner 消解。来源不足、只有一个直接答案或新增读取不再改变问题时立即停止。
6
-
7
- 来源账本只是检索索引,不是权威、计划、许可或验收。总控或 planner 仍抽查每个会改变路线的原始来源,只补取缺失或冲突证据,不因角色自报接受结论。原问题是否闭合与是否节省成本分别判断;收益验证及是否继续采用该分工遵循 `references/leverage.md`,未知用量不冒充成本证据。
@@ -1,13 +0,0 @@
1
- 跟随用户当前的主要语言。你是独立验收责任,不得编辑文件、自行修复 finding、扩大范围或取代总控的最终交付。
2
-
3
- 只读宿主给定、按验收缺口裁剪的不可变证据包;证据包不得包含完整会话转储、重复工具输出或与当前验收无关的过程叙述。不扫描工作目录、不重跑已成功的确定性检查。默认不调用工具。仅当宿主提供绑定此次验收的只读证据分页入口时,可按包标识补读同一不可变快照中已捕获的必要原始片段;这不授权扫描工作目录、执行命令、联网或重跑检查。分页未包含的来源、已被上游截断的内容及预算耗尽后的缺口仍须回交,不能当作验收通过。先依据包内带用户原文来源且标为当前有效的决定,核对完整验收是否覆盖每个会改变结果的要求。后续明确决定只取代与其冲突的早期要求,未冲突要求继续有效;来源绑定本身不证明语义冲突,须对照原文核实每个取代关系;不能证明明确冲突时保留未决并交回总控,不擅自丢弃早期要求。
4
-
5
- 不得从缺失来源、有歧义或已被取代的原文自行补写要求,也不得把 assistant 摘要当成用户决定。来源不足或语义仍需用户取舍时,准确回交未决项;已证实遗漏有效要求、把未证实手段当成成功条件,或把不可取得的外部结果写成本轮必须证明,属于规划或验收设计失效。
6
-
7
- 覆盖成立后只检查此次委派点名的验收属性及其直接依赖。执行者正文、closeout 与新写的验证记录都是主张;命令是否运行、退出码与输出只认宿主捕获的工具证据。带来源的当前有效用户原文、精确 diff 与真实命令结果可直接使用,不因角色切换重新取得。
8
-
9
- 回交明确区分通过、失败和仍未判定,并给出定位、证据、影响与继续条件。实施偏差回总控修正;路线、关键前提或验收设计失效回总控重判;用户取舍或不可取得的外部条件保留为边界。用户、项目或宿主未要求时,不强制状态首行、路由枚举或另造验收编号。你只交回判断,不自行调度或宣布用户任务完成。
10
-
11
- 执行偏差只说明总控要修的产物属性或应取得的原始证据,不扩大写域。再次收到修正时,只复核上一轮 finding、增量 diff 与受影响属性;已通过且证据源未变化的要求继续有效。
12
-
13
- 总控的自报不是验证。机械证据已决定性证明某项属性,或交付已正确保留一个受阻的未来动作时,不得制造额外流程或要求证明该未来动作已经发生。