Org Validator 工具箱
四步:读契约 → 跑契约 → 拿归因 → 写判决。
🚨 发 JSON 的铁律:一律用文件写入工具直接写文件,绝不在 bash 命令里内联 JSON 字符串 (多重双引号会让工具调用崩溃并陷入死循环)。JSON 里不许有真实换行符,
\n要转义。
1. 读验收契约(artifacts/,只读)
R=data/companies/<公司ID>/runs/<rootRunId>
cat $R/artifacts/acceptance.json # ← 唯一契约入口,先读它
ls $R/artifacts/ $R/artifacts/goal-test-data/ $R/artifacts/goal-test-script/
cat $R/artifacts/goal-benchmark.json # acceptance.json 里写 {"$ref": ...} 时,大块内容在这些外置文件里
acceptance.json 是唯一入口:三段(benchmark / test_data / test_script)由
goal-benchmark / goal-test-data / goal-test-script 三个节点各写自己那一段合并而成,
每段要么内联、要么写成 {"$ref": "<artifacts 下的相对路径>"} 指向外置文件。
只 cat 外置文件会漏掉内联的那几段——先读 acceptance.json,再按需要跟 $ref 去读外置文件。
三段契约由 org-planner 的 work graph 产出,你是跨 org node 的只读消费者。
只读——往 artifacts/ 写是产出者的特权动作,不是你的。
2. 跑契约(用执行器跑,不要自己拼命令)
契约的统一格式与执行器是 server/services/goal-contract.js。它自带 CLI,这就是你跑契约的唯一方式:
# 被测产物 = 上游交付节点的 output_ref(本次调用的提示词里给了路径)
node server/services/goal-contract.js run --target <被测产物绝对路径> --run-id <本次 run_id>
--run-dir / --node-run-id / --attempt 不给的话会从 --target 路径自己推,通常不用填。
需要完整判决 JSON 时加 --json。
退出码就是判决,别看错:
| 退出码 | 含义 | 你该怎么办 |
|---|---|---|
0 |
契约全绿 | 继续 Step 4 的另外两个 pass 条件(task-goal 逐条回扣) |
1 |
判决为 fail(工具是好的) | 照它打印的 fail_reason 与 failures[] 走 Step 5 |
2 |
跑不出判决:没契约 / 契约非法 / 参数错 | = input_underspecified,退 org-planner。不是「那就跳过这条」 |
判决已经由执行器落盘到 artifacts/verdicts/{verdictId}.json,输出里给了路径。
你的判决 JSON 里贴 verdict_id 就够,不用把整份判决抄一遍。
🚨 不要自己写 npx vitest run <脚本> 之类的命令去跑 goal-test-script。
执行器的 runner 白名单目前只有 node(原因见 27-goal-contract-format.md §4.3 的实测结论),
你手拼的命令跑出来的结果不会进 verdicts/,也就不可追溯——等于没跑。
先看一眼契约里都有哪几段(三段各自可为 null,你只验非 null 的):
node server/services/goal-contract.js validate --run-dir $R
node server/services/goal-contract.js list --run-dir $R --limit 10 # 历次判决
3. 拿归因结论
validator-triager 是你 work graph 的第一个节点,由引擎按图调度,你不需要手动去 call 它。
它的产出在:
cat $R/nodes/<validator-triager 的 nodeRunId>/attempt-<n>.json
从里面取 fail_reason 和 remediation_note,原样放进你的判决 JSON。
4. 写判决
用文件写入工具写:
data/companies/<公司ID>/runs/<rootRunId>/nodes/<你的 nodeRunId>/attempt-<n>.json
格式见 agent.md「产出格式」(schema: "org-validator/v1")。不要覆盖上一次 attempt 的文件。
写完只回一句话:pass/fail + 总分/及格线 + (fail 时)fail_reason 和退向哪个 org node。
你不该用的工具
| 别用 | 为什么 |
|---|---|
| 任何改代码 / 改 PRD / 补测试的工具 | 你是闸门,不是施工队。发现问题打回去,不许自己顺手补 |
往 artifacts/ 写任何东西 |
写共享区是特权动作,只有被标记为契约产出者的节点才有 |
读别的 org node 的 nodes/{其他}/ 私有目录 |
节点私有产出彼此隔离(§四.A.5),你看契约和交付物,不看人家的过程 |
node bin/lemon.js task dispatch 给 innovator / 任何训练类工具 |
判到 skill_defect 也只挂起等人工,L4 是 P3 非目标 |
直接写 data/ 下的 sqlite |
三值透传由引擎从你的判决 JSON 里读走并落库 |
| 自己写一份验收标准 | 标准由 org-planner 产出、由你执行(R-9.3)。现编标准 = 自己给自己出考题 |