orca-graph
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: orca-graph
Skill: orca-graph
Nhánh của : cùng propose → gate → plan → dispatch, nhưng deps là DỮ LIỆU (graph.json),
không phải suy đoán trong đầu. Runtime: . Vẽ:
(1 graph) + (atlas 2D). Store mặc định .
orca-workflowharness/scripts/orca-graph.pyfdk/tools/graph-viz.pyfdk/tools/graph-atlas.pyllmwiki/graph/Engine sống ở repo riêng (test + bộ eval VT + lịch sử riêng), cài vào
. Ba đường dẫn ở trên trong overstack là shim trỏ sang engine đó — lệnh gõ y như cũ. Shim báo
"chưa cài engine" (rc 3) → chạy đúng lệnh nó in ra: .
Không có overstack: gọi thẳng .
https://github.com/Rheinmir/orca-graph~/.orca-graph/repo/curl -fsSL https://raw.githubusercontent.com/Rheinmir/orca-graph/main/install.sh | bash~/.orca-graph/bin/orca-graphorca-workflowdepsgraph.jsonharness/scripts/orca-graph.pyfdk/tools/graph-viz.pyfdk/tools/graph-atlas.pyllmwiki/graph/Engine 位于独立 repo (包含测试、独立 VT eval 套件及独立历史),安装到 。上述位于 overstack 的三个路径都是指向该 engine 的 shim——命令用法与以前相同。Shim 报告“尚未安装 engine”(rc 3)→ 运行它打印出的确切命令:。没有 overstack 时:直接调用 。
https://github.com/Rheinmir/orca-graph~/.orca-graph/repo/curl -fsSL https://raw.githubusercontent.com/Rheinmir/orca-graph/main/install.sh | bash~/.orca-graph/bin/orca-graphWHAT
WHAT
Purpose và context
目的与上下文
- Purpose: phân việc của một PLAN.md thành ĐỒ THỊ PHỤ THUỘC (deps là DỮ LIỆU trong graph.json), trả lời 5 câu hỏi bằng tool tất định, dispatch theo lớp topo có khoá + lease + generation, state bền append-only, và chấm mọi câu trả lời của model theo rubric có nguồn.
- Trigger (when to use):
- Có PLAN.md ≥ 3 task và cần biết: cái gì chạy song song, cái gì chờ cái gì, chạy tới đâu rồi.
- Dispatch nhiều agent và cần khoá để 2 agent không giành cùng task / ghi cùng file.
- Việc còn dở nhiều phiên: state phải sống qua crash, không được "nhớ trong đầu".
- Non-goals: KHÔNG dùng cho sự cố (→ ), không dùng khi chưa có PLAN (→
orca-issuerồi/propose). Ngoài phạm vi PRD v1.1 (nói thẳng): item pipeline bền có outbox/backpressure, layered fan-in theo token, anchor registry, routing model theo eval floor, scale proposal, seen ledger cho discovery — xem/plancủa repo engine: 13/28 kịch bản VT ghievals/vt-matrix.jsonkèm lý do. Ngoài phạm vi PRD (nói thẳng, không giả vờ có): PostgreSQL ledger, secret gateway, ngân sách tiền, LangGraph, integration queue/candidate hash, compensation cho effect ngoài, sandbox process-level (chạy lệnh agent trong container/VM riêng). Tool này là file-based cho một máy; cần những thứ trên thì đó là engine khác, không phải nâng cấp orca-graph. (Allow-list GHI file — khác sandbox process — đã có, xemout_of_scopeở mục Reference — Daemon & control-room bên dưới và GH#162.)run --strict
- 目的: 将一个 PLAN.md 中的工作拆分为依赖图(deps 是 中的数据),使用确定性工具回答 5 个问题,按带锁、lease 和 generation 的拓扑层进行调度,维护持久化 append-only 状态,并依据带来源的 rubric 评判模型的每个回答。
graph.json - Trigger(何时使用):
- PLAN.md 中有 ≥ 3 个 task,且需要知道:哪些任务可以并行运行、哪些任务必须等待其他任务、目前执行到哪里。
- 需要 dispatch 多个 agent,并需要锁来防止两个 agent 争抢同一 task 或同时写入同一文件。
- 跨多个 session 仍有未完成工作:state 必须能在 crash 后继续存在,不能只“记在脑中”。
- Non-goals: 不用于故障处理(→ );没有 PLAN 时不适用(→
orca-issue,然后/propose)。 明确说明 PRD v1.1 范围之外的功能:带 outbox/backpressure 的持久化 item pipeline、按 token 分层的 fan-in、anchor registry、依据 eval floor 的模型路由、scale proposal、用于 discovery 的 seen ledger——参见 engine repo 中的/plan:28 个 VT 场景中有 13 个被记录为evals/vt-matrix.json,并附有原因。 明确说明超出 PRD 范围、不能假装已经具备的功能:PostgreSQL ledger、secret gateway、金额预算、LangGraph、integration queue/candidate hash、外部 effect 的 compensation、process-level sandbox(在独立 container/VM 中运行 agent 命令)。此工具是面向单机的 file-based 实现;如果需要上述能力,应使用另一个 engine,而不是将 orca-graph 升级成那样。(GHI 文件 allow-list——不同于 process-level sandbox——已经存在;参见下方 Reference — Daemon & control-room 中的out_of_scope以及 GH#162。)run --strict
Mental model
心智模型
PLAN.md → build → graph.json (cache) + events.jsonl (nguồn chân lý, append-only) → ask (5 câu hỏi) → next/lock/set/run theo lớp topo → verify (+ qc) → audit → graph-viz / graph-atlas / control-roomMáy state mỗi node:
; = HITL chờ người.
Ba chiều tách nhau: (vòng đời) · (verify rc 0?) · (upstream làm lại sau khi mình xong → , chỉ cảnh báo).
Luật vay từ Reprise PRD: op_key idempotent · CAS · generation chặn kết quả cũ · lease hết → không phải · không verify thì không .
proposed → ready (mọi deps xong) → locked → dispatched → done | done_unverified | failed | unknownblockedstateverifiedfreshstale--if-revunknownfaileddone- (GH#163, tuỳ chọn — trường
qctrong PLAN.md, nằm trong**QC:**nhưspec_hash): lệnh review ĐỘC LẬP chạy SAUverifyrc=0, KHÔNG chạy bởi cùng lời gọi đã tự verify (verifyởby != "reconcile") — tách vai reviewer khỏi vai người/agent vừa tự verify. Fail thì: quaemit()/runtrực tiếp →set donedemoteemit()→done(giống verify fail); quadone_unverified→ kết luậnreconcile(reconcile tự quyết dứt khoát, không để lửng done_unverified). Không khaiready→ hành vi y hệt trước đây (tương thích ngược).**QC:**
PLAN.md → build → graph.json(cache)+ events.jsonl(唯一真实来源,append-only)→ ask(5 个问题)→ 按拓扑层执行 next/lock/set/run → verify(+ qc)→ audit → graph-viz / graph-atlas / control-room每个 node 的 state:
; 表示 HITL,正在等待人员介入。
三个相互独立的维度:(生命周期)· (verify 是否 rc 0?)· (upstream 在自身完成后重新执行 → 标记为 ,仅发出警告)。
借鉴 Reprise PRD 的规则:op_key 幂等 · CAS · generation 阻止旧结果写入 · lease 过期 → ,而不是 · 未 verify 不得标记为 。
proposed → ready(所有 deps 完成)→ locked → dispatched → done | done_unverified | failed | unknownblockedstateverifiedfreshstale--if-revunknownfaileddone- (GH#163,可选——PLAN.md 中的
qc字段,且与**QC:**一样纳入verify):独立 review 命令在spec_hashrc=0 之后运行,不得由刚刚自行 verify 的同一次调用执行(verify中要求emit())——将 reviewer 角色与刚刚自行 verify 的人员/agent 分离。失败时:通过by != "reconcile"/run直接完成 →set done将emit()降级为done(与 verify 失败相同);通过done_unverified→ 判定为reconcile(reconcile 自主作出最终判定,不让节点悬挂在ready)。未声明done_unverified时,行为与此前完全一致(向后兼容)。**QC:**
Input và output contract
输入与输出契约
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | | có | ≥ 3 task; dòng |
| In | lý do cạnh | nên có | |
| In | claim tài nguyên | khi dùng chung | |
| In | store | không | mặc định |
| In | | không | gắn graph con vào node graph mẹ |
| In | agent + lệnh agent | khi dispatch | tên agent cho |
| Out | | có | graph + state bền |
| Out | output | có | cycle, deps suy luận ( |
| Out | answer có nhãn + nguồn | khi model trả lời | chấm theo rubric 1 / 0 / 0.3 / 0.5 / bịa 0 |
| Out | HTML graph + atlas 2D + | có | 2 file python vẽ + generator control-room |
| Out | | khi kết | kết quả mở lại từng nguồn, bịa = 0 |
| Field | Required? | 含义 | |
|---|---|---|---|
| 输入 | | 是 | ≥ 3 个 task;包含 |
| 输入 | 边的原因 | 建议提供 | |
| 输入 | 资源 claim | 存在共享时 | |
| 输入 | store | 否 | 默认 |
| 输入 | | 否 | 将子 graph 挂载到父 graph 的 node 上 |
| 输入 | agent + agent 命令 | dispatch 时 | agent 名称用于 |
| 输出 | | 是 | graph + 持久化 state |
| 输出 | | 是 | cycle、推断出的 deps( |
| 输出 | 带标签和来源的 answer | model 回答时 | 按 rubric 评分:1/0/0.3/0.5/捏造为 0 |
| 输出 | HTML graph + 2D atlas + | 是 | 2 个 Python 绘图文件 + control-room generator |
| 输出 | | 结束时 | 重新打开每个来源进行核对,捏造数 = 0 |
Rules và capabilities
规则与能力
- RULE-01 (MUST): Lock kiểm soát DISPATCH; side-effect ghi file có allow-list MỀM (GH#162) — xem ở trên. Allow-list KHÔNG thay thế cách ly process thật → worktree riêng mỗi task vẫn là lựa chọn khi cần cô lập hoàn toàn (chạy lệnh, biến môi trường, side-effect ngoài filesystem).
run --strict - RULE-02 (MUST): Không dispatch node (HITL) cho CLI headless — nó sẽ đoán thay người rồi im lặng (bài học 250626, giao ~1/5).
blocked - RULE-03 (MUST): Mọi câu trả lời của model về graph phải qua với nhãn + nguồn mở được. Không có nguồn → chọn
answer(0.3) thay vì bịa (0).không-biết - RULE-04 (MUST): Deps (suy luận) phải được user xác nhận hoặc khai
gợi-ýtrước khi dispatch lớp đó.**Depends:** - RULE-05 (MUST): Không xoá/sửa tay ; sai thì append event sửa.
events.jsonlchỉ là cache — hỏng thìgraph.jsonlại, state fold từ events.build - RULE-06 (MUST): HTML sinh ra: toggle sáng/tối + full path + thuật ngữ có giải nghĩa (luật fdk) — 2 file vẽ đã lo, đừng viết HTML tay.
- RULE-08 (MUST): Tranh chấp tài nguyên KHÔNG phải cạnh DAG (PRD v1.1 §23.2). Hai task độc lập dùng chung nhánh tích hợp / schema DB / cổng test / quota API → khai , để
**Resources:**tuần tự hoá lúc chạy; ĐỪNG thêmlockgiả. Worktree riêng không miễn claim.**Depends:** - RULE-09 (MUST): chỉ ĐỌC và chỉ ĐỀ XUẤT. Cạnh thiếu lý do (
audit-edges) thì GIỮ và hỏi user; "không thấy dependency" không bằng "đã chứng minh độc lập". Bỏ cạnh = user đồng ý → sửa PLAN → build lại.EDGE_UNJUSTIFIED - RULE-10 (MUST): User yêu cầu THÊM việc vào graph đang chạy → (nó sửa PLAN gốc rồi build lại,
add-node, lịch sử giữ nguyên). Cấm vá tayplan_version + 1; cấm tạo graph mới cho cùng một goal.graph.json - RULE-07 (MUST): Không làm được (nói thẳng): coupling ngầm không lộ ra file; rollback tự động khi agent chết nửa chừng; sync 2 chiều với sổ Orca; atlas > ~500 node cần graphviz; allow-list chỉ soát filesystem, không soát network/process/secret access.
- Capabilities: đọc PLAN và file dự án; ghi store graph append-only + khoá file; spawn và theo dõi process agent (heartbeat theo pid); chạy lệnh verify/qc; đọc diff git để soát allow-list; sinh HTML tĩnh. Mirror một chiều sang sổ điều phối ngoài là tuỳ chọn.
- RULE-01 (MUST):锁用于控制 DISPATCH;文件写入副作用采用宽松 allow-list(GH#162)——参见上文的 。Allow-list 不能替代真正的 process 隔离 → 当需要完全隔离时(命令执行、环境变量、filesystem 以外的副作用),每个 task 使用独立 worktree 仍是可选方案。
run --strict - RULE-02 (MUST):不得向 headless CLI dispatch node(HITL)——它会代替人员猜测,然后保持沉默(250626 的经验,约占 1/5)。
blocked - RULE-03 (MUST):model 对 graph 的所有回答都必须经过 ,并附带可打开的标签与来源。没有来源 → 选择
answer(0.3),而不是捏造(0)。không-biết - RULE-04 (MUST):推断得出的 deps 必须在 dispatch 对应层之前得到用户确认,或预先声明
gợi-ý。**Depends:** - RULE-05 (MUST):不得删除或手动编辑 ;如需修正,应 append 一个修正事件。
events.jsonl只是 cache——损坏后重新graph.json,并从 events 折叠恢复 state。build - RULE-06 (MUST):生成的 HTML 必须支持明暗切换、显示完整路径,并为术语提供解释(fdk 规则)——2 个绘图文件已经实现,不要手写 HTML。
- RULE-08 (MUST):资源争用不是 DAG 边(PRD v1.1 §23.2)。两个独立 task 共享集成分支/DB schema/test gate/API quota → 声明 ,让
**Resources:**在执行时将它们串行化;不要添加虚假的lock。独立 worktree 不会免除资源 claim。**Depends:** - RULE-09 (MUST):只能读取并提出建议。发现缺少原因的边(
audit-edges)→ 保留该边并询问用户;“没有看到 dependency”不等于“已证明二者独立”。移除边需要用户同意 → 修改 PLAN → 重新 build。EDGE_UNJUSTIFIED - RULE-10 (MUST):用户要求向正在运行的 graph 添加工作 → (它会修改原始 PLAN 并重新 build,
add-node,保留历史)。禁止手动修改plan_version + 1;禁止为同一个 goal 创建新 graph。graph.json - RULE-07 (MUST):明确说明无法完成的功能:文件中未暴露的隐式 coupling;agent 中途死亡后的自动 rollback;与 Orca ledger 双向同步;超过约 500 个 node 的 atlas 需要 graphviz;allow-list 仅检查 filesystem,不检查 network/process/secret access。
- 能力:读取 PLAN 和项目文件;写入 append-only graph store 及文件锁;spawn 并监控 agent process(按 pid 执行 heartbeat);运行 verify/qc 命令;读取 git diff 以检查 allow-list;生成静态 HTML。可选地向外部协调 ledger 进行单向 mirror。
Failure boundaries
失败边界
- Chưa có PLAN → blocked, gọi (hoặc
planrồi/propose); là sự cố → chuyển/plan.orca-issue - Cycle (rc 2) hoặc vượt depth ≤ 6 / ≤ 20 node → tool từ chối, blocked tới khi giảm scope.
check-cycles - Deps chưa xác nhận → clarify với user trước khi dispatch lớp đó.
gợi-ý - Node (HITL) → chờ người, KHÔNG dispatch headless.
blocked - Agent im lặng quá lease → (không phải
unknown) →failed; quá 3 attempt → failed.reconcile - Kết quả gen cũ hoặc plan_version khác → STALE, không publish.
- Không có nguồn cho câu trả lời → nhãn , không bịa.
không-biết
- 没有 PLAN → blocked,调用 (或
plan,然后/propose);属于故障 → 转移到/plan。orca-issue - Cycle(rc 2),或超过 depth 6/node 数 20 → tool 拒绝执行,blocked,直到缩小范围。
check-cycles - 尚未确认的 deps → dispatch 对应层之前,向用户 clarify。
gợi-ý - node(HITL)→ 等待人员,禁止 headless dispatch。
blocked - Agent 超过 lease 仍无响应 → (不是
unknown)→failed;超过 3 次 attempt → failed。reconcile - 旧 generation 的结果或不同的 plan_version → STALE,不得 publish。
- 回答没有来源 → 标签为 ,不得捏造。
không-biết
HOW
HOW
Main workflow
主工作流
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | repo có harness | Bước 0: pre-work sweep | sweep xong | không harness → bỏ |
| W02 | judgment | PLAN | Bước 1: PLAN có chưa; chưa → skill | PLAN.md | thiếu Depends → tool suy, nhãn gợi-ý |
| W03 | deterministic | PLAN.md | Bước 2: | graph.json + cảnh báo cycle, xung đột file | xung đột → thêm Depends hoặc chấp nhận có lý do |
| W03b | deterministic | graph.json | Bước 2b: | bảng finding (chỉ đọc) | |
| W04 | judgment | graph | Bước 3: 5 câu hỏi bằng | answer có nhãn | không nguồn → không-biết |
| W05 | effect | graph.json | Bước 4: vẽ | HTML + gate | kind lạ → B06 |
| W06 | effect | graph đã duyệt | Bước 5: vòng | node done | lease hết → B05 |
| W07 | deterministic | graph xong | Bước 6: | audit-log + atlas | bịa > 0 → báo |
Chi tiết từng bước (nguồn chân lý cho W01–W07; bước 0–6 ứng với W01–W07):
- Pre-work sweep như orca-workflow () nếu có harness.
pull-gate-sweep.sh - PLAN có chưa? Chưa → gọi skill . Khuôn
plancó dòng/planvà**Depends:** Task 1, Task 3— điền thật; thiếu Depends thì tool SUY từ Consumes/Produces và gắn nhãn**Verify:** <lệnh rc 0>.gợi-ý - Dựng graph: → in cycle, deps suy luận, và xung đột ghi cùng file giữa 2 node song song (⚠ → thêm Depends để ép tuần tự, hoặc chấp nhận có lý do).
python3 harness/scripts/orca-graph.py build <PLAN.md> - Trả lời 5 câu hỏi — bằng tool trước, model sau:
- ·
ask <id> needs·ask <id> parallel·ask <id> deps <n>·ask <id> why <n>.ask <id> related - Phần model bổ sung (ý nghĩa, liên hệ ngữ nghĩa với graph cũ, rủi ro) → ghi bằng kèm nhãn + nguồn:
answer.answer <id> <n> --q why --label chắc|gợi-ý|không-biết --score S --evidence file:path:line edge:a->b event:<op_key> absence:<lệnh> --text "..." - Rubric (user chốt 2026-09-12): đúng 1 · sai 0 · không-biết 0.3 · gợi-ý có nguồn thật 0.5 · bịa nguồn 0. Không chắc → nói /
gợi-ý, đừng gắnkhông-biết.chắc
- Vẽ + gate: → gửi HTML cho user duyệt (
python3 fdk/tools/graph-viz.py llmwiki/graph/<id>.graph.jsonnhư orca-workflow).gate-create- Node trên đồ thị vẽ theo kind của task (trong PLAN.md, mặc định
**Kind:** build|test|fix|research|docs|design|review|security|infra|data|migrate|deploy|release|cleanup|integration|wiki) — icon + shape + màu nền tra ởbuildcủa repo engine (engine/kind-glyphs.json; sổ mặc định DÙNG CHUNG mọi graph — sửa/thêm qua PR vào repo đó). Viền node vẫn là state (không đụng).~/.orca-graph/repo/engine/ - lạ chưa có trong sổ → tool tự sinh tạm (monogram + màu/hình theo hash, ghi vào
kind— máy-local, không bẩn git clone của engine) và in cảnh báo ra stderr. Thấy cảnh báo này → hỏi user có muốn~/.orca-graph/kind-glyphs.local.jsonđể submit glyph mới vào/raise-issuekhông; đừng tự ý thêm vào sổ mặc định mà không hỏi.kind-glyphs.json
- Node trên đồ thị vẽ theo kind của task (
- Vòng chạy (lặp tới khi báo hoàn tất):
nextAgent im lặng quá lease →next <id> # node ready = chạy song song NGAY; blocked = HITL, KHÔNG dispatch headless lock <id> <n> --by <agent> # O_EXCL + lease (mặc định 90 phút); heartbeat <id> <n> khi chờ lâu set <id> <n> dispatched --op-key <uuid> # rồi orca orchestration dispatch --task … --inject (brief NGUYÊN VĂN từ PLAN) set <id> <n> done --gen <gen> --op-key <uuid> # gen lấy từ output lệnh dispatched; gen cũ → STALE, không publishtự đẩy node vềnext→unknown(chạy verify) trước khi lock lại. Tối đa 3 attempt. Muốn mirror sang sổ Orca:reconcile <id> <n>(một chiều; sổ Orca runtime-global, đóng dấu dự án).sync-orca <id> --run - Kết: (mở lại từng nguồn; bịa = 0; ghi
audit <id>) →audit-log.jsonlregen atlas → cập nhật problem-tree nếu lộ vấn đề quy trình.graph-atlas.py llmwiki/graph/
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | 确定性 | 存在 harness 的 repo | 步骤 0:执行 pre-work sweep | sweep 完成 | 没有 harness → 跳过 |
| W02 | 判断 | PLAN | 步骤 1:检查是否存在 PLAN;不存在 → skill | PLAN.md | 缺少 Depends → tool 推断,标签为 gợi-ý |
| W03 | 确定性 | PLAN.md | 步骤 2: | graph.json + cycle、文件冲突警告 | 冲突 → 添加 Depends 或接受有充分理由的冲突 |
| W03b | 确定性 | graph.json | 步骤 2b: | finding 表格(只读) | |
| W04 | 判断 | graph | 步骤 3:先使用 | 带标签的 answer | 没有来源 → không-biết |
| W05 | 执行 | graph.json | 步骤 4:绘制 | HTML + gate | 未知 kind → B06 |
| W06 | 执行 | 已审批的 graph | 步骤 5:循环 | node done | lease 过期 → B05 |
| W07 | 确定性 | 已完成的 graph | 步骤 6: | audit-log + atlas | 捏造数 > 0 → 报告 |
各步骤详情(是 W01–W07 的真实来源;步骤 0–6 对应 W01–W07):
- 如果存在 harness,按 orca-workflow 的方式执行 Pre-work sweep()。
pull-gate-sweep.sh - PLAN 是否存在? 不存在 → 调用 skill 。
plan模板包含/plan和**Depends:** Task 1, Task 3行——必须如实填写;缺少 Depends 时,tool 根据 Consumes/Produces 推断,并标记为**Verify:** <rc 0 命令>。gợi-ý - 构建 graph: → 输出 cycle、推断出的 deps,以及两个并行 node 之间的同文件写入冲突(⚠ → 添加 Depends 强制串行,或接受有充分理由的冲突)。
python3 harness/scripts/orca-graph.py build <PLAN.md> - 回答 5 个问题——tool 在前,model 在后:
- ·
ask <id> needs·ask <id> parallel·ask <id> deps <n>·ask <id> why <n>。ask <id> related - model 补充的部分(含义、与旧 graph 的语义关系、风险)→ 通过 写入,并附带标签和来源:
answer。answer <id> <n> --q why --label chắc|gợi-ý|không-biết --score S --evidence file:path:line edge:a->b event:<op_key> absence:<lệnh> --text "..." - Rubric(用户于 2026-09-12 确认):正确 1 · 错误 0 · 未知 0.3 · 有真实来源的建议 0.5 · 捏造来源 0。不确定时 → 使用 /
gợi-ý,不要标记为không-biết。chắc
- 绘图 + gate: → 将 HTML 交给用户审批(与 orca-workflow 相同的
python3 fdk/tools/graph-viz.py llmwiki/graph/<id>.graph.json)。gate-create- Graph 中的 node 根据 task 的 kind 绘制(PLAN.md 中的 ,默认
**Kind:** build|test|fix|research|docs|design|review|security|infra|data|migrate|deploy|release|cleanup|integration|wiki)——icon、shape 和背景色查表自 engine repo 中的build(engine/kind-glyphs.json;默认 ledger 被所有 graph 共享——通过向该 repo 提交 PR 来修改或新增条目)。node 边框仍表示 state(保持不变)。~/.orca-graph/repo/engine/ - 默认 ledger 中尚无的 → tool 自动生成临时 glyph(monogram + 基于 hash 的颜色/形状),并写入
kind(machine-local,不污染 engine 的 git clone),同时向 stderr 打印警告。看到此警告 → 询问用户是否要通过~/.orca-graph/kind-glyphs.local.json提交新 glyph 到/raise-issue;不要在未经询问的情况下自行添加到默认 ledger。kind-glyphs.json
- Graph 中的 node 根据 task 的 kind 绘制(PLAN.md 中的
- 执行循环(重复直到 报告完成):
nextundefined
next <id> # node ready = chạy song song NGAY; blocked = HITL, KHÔNG dispatch headless
lock <id> <n> --by <agent> # O_EXCL + lease (mặc định 90 phút); heartbeat <id> <n> khi chờ lâu
set <id> <n> dispatched --op-key <uuid> # rồi orca orchestration dispatch --task … --inject (brief NGUYÊN VĂN từ PLAN)
set <id> <n> done --gen <gen> --op-key <uuid> # gen lấy từ output lệnh dispatched; gen cũ → STALE, không publish
Agent 超过 lease 仍无响应 → `next` 自动将 node 推进到 `unknown` → `reconcile <id> <n>`(运行 verify),然后才能重新 lock。最多 3 次 attempt。
如需 mirror 到 Orca ledger:`sync-orca <id> --run`(单向;Orca ledger 是 runtime-global,并带有项目标记)。
6. **结束:** `audit <id>`(重新打开每个来源;捏造数 = 0;写入 `audit-log.jsonl`)→ 运行 `graph-atlas.py llmwiki/graph/` 重新生成 atlas → 如果发现流程问题,则更新 problem-tree。Branches
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | user_optional | việc cần tách graph con dưới một node | | vượt depth 6 hoặc 20 node → tool từ chối | W03 |
| B02 | conditional_required | | | kết quả plan_version cũ → STALE | W06 |
| B03 | user_optional | user muốn dừng / tiếp / huỷ | | | W06 |
| B04 | capability_optional | muốn một lệnh thay 4 lệnh gõ tay | | node thiếu verify → từ chối headless | W06 |
| B05 | recovery | agent im lặng quá lease | | tối đa 3 attempt rồi failed | W06 |
| B06 | conditional_required | | tool sinh glyph tạm vào | không tự thêm vào sổ mặc định | W05 |
| B07 | user_optional | muốn mirror sang sổ Orca | | — | W06 |
| B09 | user_optional | user yêu cầu thêm việc / "vẽ thêm node" khi graph đã có | | sinh cycle / > 20 node / dep lạ → tool từ chối, PLAN nguyên vẹn | W05 |
| B10 | recovery | | node khác đang giữ claim xung đột → làm node ready khác trước, | không tự | W06 |
| B08 | conditional_required | node khai | chạy QC độc lập sau verify rc 0; fail → | không khai → hành vi cũ | W06 |
| ID | Kind | Guard | 行为 | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | user_optional | 需要将工作拆分到某个 node 下的子 graph | | 超过 depth 6 或 20 个 node → tool 拒绝 | W03 |
| B02 | conditional_required | 对已有 graph 重新 | | 旧 plan_version 的结果 → STALE | W06 |
| B03 | user_optional | 用户希望暂停/继续/取消 | | | W06 |
| B04 | capability_optional | 希望用一条命令代替 4 条手动命令 | | node 缺少 verify → headless 拒绝 | W06 |
| B05 | recovery | agent 超过 lease 仍无响应 | | 最多 3 次 attempt,之后标记 failed | W06 |
| B06 | conditional_required | | tool 生成临时 glyph 并写入 | 不得自行添加到默认 ledger | W05 |
| B07 | user_optional | 希望 mirror 到 Orca ledger | | — | W06 |
| B09 | user_optional | graph 已存在时,用户要求添加工作/“再画一个 node” | | 产生 cycle/超过 20 个 node/未知 dep → tool 拒绝,PLAN 保持不变 | W05 |
| B10 | recovery | | 其他 node 正持有冲突 claim → 先执行另一个 ready node,通过 | 不得自行 | W06 |
| B08 | conditional_required | node 声明了 | verify rc=0 后运行独立 QC;失败 → | 未声明 → 保持旧行为 | W06 |
Validation và stopping
验证与停止条件
Tất định: chỉ khi rc 0 (và QC nếu khai); lease/generation/op_key/CAS do tool quyết; và / rc 2 khi hỏng; mở lại từng nguồn, bịa = 0. Cần người: duyệt HTML graph ở gate, xác nhận deps , xử lý node . Vòng chạy dừng khi báo hoàn tất; mỗi node tối đa 3 attempt.
doneverifycheck-cycleslintbuild --strictauditgợi-ýblockednext确定性条件:只有 verify rc 0(且声明了 QC 时 QC 通过)才能标记 ;lease/generation/op_key/CAS 由 tool 决定; 以及 / 在损坏时返回 rc 2; 重新打开每个来源,捏造数 = 0。需要人工介入:审批 HTML graph、确认 deps、处理 node。执行循环在 报告完成时停止;每个 node 最多 3 次 attempt。
donecheck-cycleslintbuild --strictauditgợi-ýblockednextExamples
示例
- Positive: PLAN 5 task, t2 và t3 cùng Depends t1 → báo không cycle, không xung đột file →
buildtrả t3 →ask t2 parallelcấp t1, xong thì cấp t2 + t3 song song mỗi cái mộtnext,lock --by→set done --genbịa = 0 → atlas regen.audit - Boundary/failure: t2 và t3 song song cùng ghi →
src/api.tsin ⚠ xung đột ghi cùng file → thêmbuildvào t3 để ép tuần tự rồi build lại; agent t3 im quá lease →**Depends:** Task 2→unknownchạy verify trước khi lock lại.reconcile - Boundary: model muốn nói "t4 tồn tại để mở khoá release" nhưng không có nguồn mở được → (0.3), không gắn
answer … --label không-biết.chắc
- Positive: PLAN 包含 5 个 task,t2 和 t3 都依赖 t1 → 报告没有 cycle、没有文件冲突 →
build返回 t3 →ask t2 parallel先分配 t1,完成后同时分配 t2 + t3,每个都使用独立的next,然后执行lock --by→set done --gen捏造数 = 0 → 重新生成 atlas。audit - Boundary/failure: t2 和 t3 并行且同时写入 →
src/api.ts输出 ⚠ 同文件写入冲突 → 在 t3 中添加build强制串行,然后重新 build;t3 agent 超过 lease 仍无响应 →**Depends:** Task 2→unknown运行 verify,然后才能重新 lock。reconcile - Boundary: model 想说“t4 的存在是为了解锁 release”,但没有可打开的来源 → (0.3),不得标记为
answer … --label không-biết。chắc
Reference — Phân cấp graph mẹ → con (PRD Reprise Graph Engine §4)
Reference — 父 graph → 子 graph 分层(PRD Reprise Graph Engine §4)
- → graph con gắn vào một node của graph mẹ (containment tree, KHÁC dependency DAG). Node mẹ có
build <PLAN> --parent <gid>/<node>, join tự động: chỉchild_graphkhi MỌI node con xong (invariant 4); con có nodedone_unverified→ mẹblocked.blocked - Giới hạn cứng: depth ≤ 6, ≤ 20 node/graph. Vượt → tool từ chối, giảm scope thay vì đào sâu.
- Deps xuyên graph: — thoả khi node đó xong ở graph kia.
**Depends:** other-graph/t3gộp mọi graph, in ĐƯỜNG cycle cụ thể (check-cycles [dir]), rc 2 (PRD §5.3).a/t2 → b/t3 → a/t2 - — leaf đủ hợp đồng chưa (PRD §4.4): title · files · produces · verify · deps rõ.
lint <id>rc 2 nếu thiếu verify/files.build --strict
- → 子 graph 挂载到父 graph 的一个 node(containment tree,与 dependency DAG 不同)。父 node 拥有
build <PLAN> --parent <gid>/<node>,并自动 join:只有在所有子 node 完成后才进入child_graph(invariant 4);子 node 中存在done_unverified→ 父 node 为blocked。blocked - 硬性限制:depth ≤ 6,每个 graph ≤ 20 个 node。超过限制 → tool 拒绝执行,应缩小范围,而不是继续深入。
- 跨 graph deps:——当另一个 graph 中该 node 完成时满足。
**Depends:** other-graph/t3合并检查所有 graph,输出具体 cycle 路径(check-cycles [dir]),返回 rc 2(PRD §5.3)。a/t2 → b/t3 → a/t2 - ——检查 leaf node 的契约是否完整(PRD §4.4):title · files · produces · verify · deps 是否明确。
lint <id>在缺少 verify/files 时返回 rc 2。build --strict
Reference — Topology có lý do & tài nguyên có chủ (PRD v1.1 §23)
Reference — 有原因的 topology 与受控资源(PRD v1.1 §23)
- Depends parse NGHIÊM: token không resolve được (ghi chú chen vào sau dấu ,
—, task không tồn tại, dep xuyên graph sai dạngTask 1 và Task 2) là LỖI<gid>/<tid>, không bị nuốt — cạnh biến mất im lặng thì node ready sớm mà không ai thấy. Ngăn bằngbuildhoặc,; ghi chú để ở dòng khác.; - Lý do cạnh: . Năm lớp cứng (data · contract · acceptance · effect_order · control) không bỏ được dù không truyền artifact — cổng duyệt không mang payload vẫn là cạnh thật.
**Depends:** Task 1 (data), other-graph/t3 (control)= chỉ do thứ tự viết. Reason KHÔNG nằm trongpreference: gắn lý do cho graph đang chạy không làm node đã xong thành stale.spec_hash - — dry-run. Mã finding:
audit-edges <id> [--json] [--strict](khai Depends mà thiếu lý do → giữ) ·EDGE_UNJUSTIFIED(deps suy luận) ·EDGE_INFERRED(đề xuất bỏ) ·PREFERENCE_REMOVABLE(ghi preference nhưng Consumes/Verify/QC của downstream nhắc tới Task, file hoặc output của upstream, hoặc hai node cùng ghi một file → giữ; so CHUỖI nên coupling không lộ ra chữ thì không bắt được). In critical path đếm theo node (unit-weight, KHÔNG phải thời lượng), số lớp và tập chạy-ngay trước/sau.PREFERENCE_HAS_HIDDEN_CONSTRAINTrc 2 khi còn--strict.EDGE_UNJUSTIFIED - Resource claims: key do tool chuẩn hoá (lowercase + normpath) nên alias khác chữ vẫn là một tài nguyên. lấy HẾT claim hoặc không lấy gì (không giữ A chờ B), soi mọi graph trong cùng store, chạy dưới một mutex admission.
lockchặn mọi claim cùng key;exclusive= KÍCH THƯỚC POOL của key — mỗi node đang giữ key (kể cảcapacity:N) chiếm 1 slot, các node khai N khác nhau thì lấy N nhỏ nhất (không phụ thuộc thứ tự lock,sharedkhông lách được quota);sharedthuần chỉ bị exclusive hoặc pool đầy chặn. Lease hết ở graph KHÁC cũng được reaper quét khishared/lock(claim không kẹt xuyên graph);nexttay một node đang chạy đưa nó vềunlock— reconcile trước khi lock lại.unknowninbuildcho cặp song song — thông tin, không phải lỗi.ℹ … cùng claim - — mỗi node chưa chạy kèm MỘT lý do:
ask <id> waiting(chờ upstream) ·data(HITL, cổng control/acceptance, verify chưa xanh, unknown chờ reconcile) ·gate(claim bị giữ, nêu ai giữ) ·resource(max_parallel đầy) ·queue(pause/cancel) ·control(hết 3 attempt) ·retry.nonein thêm dòng cho node ready nhưng chưa lock được — ready ≠ admitted.next - Lớp topo () là hình chiếu để giải thích, không phải rào: node đủ deps là ready ngay dù node khác cùng lớp với upstream của nó chưa xong.
ask parallel
- 严格解析 Depends: 无法解析的 token(插在破折号后的注释、、不存在的 task、格式错误的跨 graph dep
Task 1 和 Task 2)均为<gid>/<tid>错误,不能被静默忽略——否则边会悄悄消失,导致 node 过早 ready 且无人察觉。使用build或,分隔;注释写在其他行。; - 边的原因: 。五种硬层级(data · contract · acceptance · effect_order · control)即使没有传递 artifact 也不能移除——不携带 payload 的审批 gate 仍是真实的边。
**Depends:** Task 1 (data), other-graph/t3 (control)仅表示因书写顺序产生的依赖。原因不纳入preference:为正在运行的 graph 添加原因,不会使已完成的 node 变成 stale。spec_hash - ——dry-run。Finding 代码:
audit-edges <id> [--json] [--strict](声明了 Depends 但缺少原因 → 保留)·EDGE_UNJUSTIFIED(推断出的 deps)·EDGE_INFERRED(建议移除)·PREFERENCE_REMOVABLE(虽然记录为 preference,但 downstream 的 Consumes/Verify/QC 引用了 upstream 的 Task、文件或输出,或者两个 node 写入同一文件 → 保留;由于比较的是字符串,无法发现未显式暴露的 coupling)。输出按 node 计数的 critical path(unit-weight,不是时长)、层数,以及前后可立即运行的 node 集合。仍有PREFERENCE_HAS_HIDDEN_CONSTRAINT时,EDGE_UNJUSTIFIED返回 rc 2。--strict - Resource claims: key 由 tool 标准化(lowercase + normpath),因此拼写不同但含义相同的 alias 会归为同一资源。要么获取全部 claim,要么一个都不获取(不能只持有 A 并等待 B);检查同一 store 中的所有 graph,并在单个 mutex admission 下执行。
lock阻止同一 key 的所有 claim;exclusive表示该 key 的 pool 容量——每个持有该 key 的 node(即使为capacity:N)都占用 1 个 slot,各 node 声明不同 N 时取最小值(不依赖 lock 顺序,shared也不能绕过 quota);纯shared只会被shared或已满的 pool 阻止。其他 graph 中的 lease 过期,也可由 reaper 在exclusive/lock时扫描清理(claim 不会跨 graph 卡住);手动next一个正在运行的 node 会将其转为unlock——必须先 reconcile 才能重新 lock。unknown会为并行 claim 相同的 node 对输出build;这是信息,不是错误。ℹ … cùng claim - ——为每个尚未运行的 node 给出一个原因:
ask <id> waiting(等待 upstream)·data(HITL、control/acceptance gate、verify 尚未通过、unknown 等待 reconcile)·gate(claim 被占用,并说明持有者)·resource(max_parallel 已满)·queue(pause/cancel)·control(已用完 3 次 attempt)·retry。none还会为已 ready 但无法 lock 的 node 输出一行信息——ready ≠ admitted。next - 拓扑层()是用于解释的投影,不是硬性屏障:只要依赖满足,node 立即 ready,即使同层其他 node 的 upstream 尚未完成。
ask parallel
Reference — Định danh, vòng khô, ngân sách lần gọi (PRD v1.1 §24–27)
Reference — 标识、无环与调用预算(PRD v1.1 §24–27)
- — ghép verdict (
reconcile-items --expected A,B,C --verdicts rows.jsonl [--universe N]) theosupported|refuted|inconclusive, không theo vị trí.item_idđủ 3 dòng vẫn THIẾU C → rc 2. Dòng{A,A,B}hoặcverdict: null≠ ok = outcome thiếu CÓ ID (status), không bị lọc mất, không tính refuted; cùng item vừa có verdict vừa có dòng lỗi →errored_ids; manifest rỗng cầnCONFLICTING_OUTCOME; thiếu file verdict là lỗi, không phải "0 dòng".--allow-emptytách hai mẫu số: xong/đã-chọn và đã-chọn/toàn-tập (coveragekhi không biết — không báo 100%). Dùng khi fan-out một lô item (vdunknown) rồi gom kết quả./tc-run - — vòng discovery khô chỉ tính khi vòng HOÀN TẤT và không có ứng viên mới; vòng lỗi reset về 0. Khô = heuristic dừng, không chứng minh đã rà hết.
dry-streak --prev N --complete 0|1 --new N - — đếm LẦN GỌI model trước dispatch: planner 1 + worker/node afk + reviewer × node có QC + synthesis 1;
cost-envelope <id> [--reviewers N] [--max-attempts N]nhân trần retry;max_callsghi unknown khi chưa có số đo. Verify shell = 0 token nhưng vẫn tốn CPU, báo riêng. Đừng nói "N agent" thay tổng call.expected
- ——根据
reconcile-items --expected A,B,C --verdicts rows.jsonl [--universe N]匹配 verdict(supported|refuted|inconclusive),而不是根据位置。item_id即使有 3 行,仍表示缺少 C → rc 2。{A,A,B}或verdict: null≠ ok 表示缺少带 ID 的结果(status),不能被过滤掉,也不能计为 refuted;同一 item 同时有 verdict 和错误行 →errored_ids;空 manifest 需要CONFLICTING_OUTCOME;缺少 verdict 文件属于错误,不能报告为“0 行”。--allow-empty拆分为两个分母:已完成/已选择,以及已选择/全集(未知时填coverage,不能报告为 100%)。适用于 fan-out 一批 item(例如unknown)后汇总结果的场景。/tc-run - ——dry discovery streak 只有在整轮完成且没有新候选时才计数;发生错误时重置为 0。dry 仅表示使用 heuristic 停止,不能证明已经检查全部内容。
dry-streak --prev N --complete 0|1 --new N - ——统计 dispatch 前的 model 调用次数:planner 1 + worker/node afk + 含 QC 的 node reviewer × node + synthesis 1;
cost-envelope <id> [--reviewers N] [--max-attempts N]按 retry 次数向上取整相乘;尚无测量值时,max_calls记为 unknown。Verify shell = 0 token,但仍消耗 CPU,应单独报告。不要用“N agent”代替总调用次数。expected
Reference — Replan không phá lịch sử (PRD §10)
Reference — Replan 不破坏历史(PRD §10)
- lại trên graph đã có =
build; node bị bỏ vàoplan_version + 1(giữ state cuối), node đổi hợp đồng (superseded[]= title/files/deps/verify/produces) mà đã xong →spec_hash(chỉ cảnh báo, không lùi state).fresh=stale - Kết quả cũ: với N ≠ hiện tại → STALE, không publish (invariant 2).
set done --plan-version N - nhớ
runlúc dispatch: replan xảy ra GIỮA lúc agent chạy → kết quả là STALE, node vềplan_versionđể làm lại theo spec mới (rc ≠ 0).ready - là replan một-node: chạy dưới mutex admission (hai lệnh song song không đè nhau), nhìn PLAN đúng như parser (bỏ qua code fence), mọi field phải MỘT dòng,
add-nodetừ chối node đang--blocks, PLAN phải khớp graph (sửa tay thìlocked|dispatchedtrước); id mới không tái dùng id node đã bị bỏ;buildchèn node mới TRƯỚC t5 (nối vào dòng Depends của t5, chưa có thì thêm). Build lại graph CON mà quên--blocks t5vẫn giữ liên kết mẹ cũ.--parent
- 对已有 graph 重新 =
build;被移除的 node 进入plan_version + 1(保留最终 state);已完成的 node 若契约改变(superseded[]= title/files/deps/verify/produces),则spec_hash(仅警告,不回退 state)。fresh=stale - 旧结果:使用与当前值不同的 → STALE,不得 publish(invariant 2)。
set done --plan-version N - 会记住 dispatch 时的
run:如果 agent 运行期间发生 replan → 结果为 STALE,node 回到plan_version,按新 spec 重做(rc ≠ 0)。ready - 是一次单 node replan:在 mutex admission 下执行(两个并行命令不会互相覆盖),像 parser 一样读取 PLAN(忽略 code fence),每个 field 必须只有一行;
add-node拒绝指向处于--blocks的 node;PLAN 必须与 graph 匹配(若被手动修改,先执行locked|dispatched);新 id 不得复用已移除 node 的 id;build会将新 node 插入 t5 之前(连接到 t5 的 Depends 行;如果该行不存在则创建)。重新 build 子 graph 时即使忘记--blocks t5,仍会保留原父级链接。--parent
Reference — Control (PRD §8.3, invariant 11)
Reference — Control(PRD §8.3,invariant 11)
- . "Yêu cầu" ≠ "đã dừng":
control <id> pause|resume|cancel|statuschỉ thànhpause_requestedkhi không còn nodepaused;locked|dispatched/nextkhông cấp node mới khi khônglock.activekhông resume — build plan version mới.cancelled - (mặc định 4):
build --max-parallel Ntừ chối khi số node đang chạy đã đủ (PRD §12.1).lock
- 。“已请求”不等于“已停止”:只有在不存在
control <id> pause|resume|cancel|statusnode 时,locked|dispatched才会变为pause_requested;当 graph 不处于 active 状态时,paused/next不再分配新 node。lock不可 resume——需要创建新的 plan version。cancelled - (默认 4):正在运行的 node 数量达到上限后,
build --max-parallel N将被拒绝(PRD §12.1)。lock
Reference — Daemon & control-room (PRD §8.4: lease 60 s · heartbeat 15 s · reaper 15 s)
Reference — Daemon 与 control-room(PRD §8.4:lease 60 秒 · heartbeat 15 秒 · reaper 15 秒)
- — thay 4 lệnh gõ tay: lock ngắn → dispatched → spawn lệnh → heartbeat theo pid → exit 0 thành
run <id> <node> [--hb 15] [--lease-sec 60] [--strict] -- <lệnh agent>(verify tự chạy), khác 0 thànhdone. Node không cófailedbị từ chối headless (verifyđể ép). Tự ghi thư mục vào registry--allow-unverifiedvà tự spawn daemon nếu chưa có (~/.orca-graph/registry.jsonđể tắt,ORCA_GRAPH_NO_DAEMON=1đổi thư mục nhà).ORCA_GRAPH_HOME - Allow-list ghi (GH#162): khi trong git repo, diff file THẬT bị đổi (tracked sửa + untracked mới, so với NGAY TRƯỚC lúc spawn) với
runkhai của node. Ngoài phạm vi → mặc định chỉ CẢNH BÁO (ghi vàofilescủa eventnote);donemới phục hồi cứng (untracked mới bị xoá, tracked sửa bị--strictvề HEAD). Không phải git repo (vd store nằm ngoài repo) → tự bỏ qua, không lỗi. Bookkeeping của CHÍNH orca-graph (git checkout/.graph.json/.events.jsonl) luôn bị loại khỏi diff, không tính là "agent ghi"..locks/ - — một daemon cho cả máy, lock
watch [--once] [--interval 5] [--idle-sec 600]theo pid. Mỗi lượt chỉ đọc các dir trong registry còn node chạy (chi phí theo số node chạy, không theo số dự án mở; đo 84 ms/lượt kể cả khởi động Python): reaper lease hết →daemon.lock→ có verify thì reconcile ngay; in bảng sống/chết; registry rỗng quá idle-sec thì tự thoát; graph đổi thì regen control-room.unknown - →
fdk/tools/build-control-room.py— trang đầu tiên mở ra, data-first (chỉ đọc registry, graph.json, problem-tree, tokens.jsonl, audit-log): đang chạy gì toàn máy + trần, tiến độ từng graph + node kẹt, nợ mở, chi phí hôm nay + khoảng cách tự chấm/audit. Tự refresh 5 s; daemon regen mỗi lượt và mỗi lầnllmwiki/html/control-room.htmlbắt đầu/kết thúc nên trang LIVE không cần server. Bậc 2 (server + bấm pause/cancel) và bậc 3 (nhúng Orca) chưa làm, chỉ làm khi bậc 1 dùng hằng ngày thấy thiếu.run - Sống/chết ≠ đúng/sai: daemon chỉ biết process còn hay mất; hay làm lại vẫn do
donequyết. Process sống mà treo thì heartbeat vẫn xanh — đặtverifyidempotent và trần thời gian theo node.**Verify:**
- ——用于代替 4 条手动命令:短暂 lock → dispatched → spawn 命令 → 按 pid 执行 heartbeat → exit 0 变为
run <id> <node> [--hb 15] [--lease-sec 60] [--strict] -- <agent 命令>(自动运行 verify),非 0 变为done。Node 没有 verify 时,headless 会被拒绝(可使用failed强制执行)。自动将目录写入 registry--allow-unverified,并在 daemon 尚未运行时自动 spawn(设置~/.orca-graph/registry.json可关闭,使用ORCA_GRAPH_NO_DAEMON=1更改 home 目录)。ORCA_GRAPH_HOME - 写入 allow-list(GH#162): 位于 git repo 中时,会对实际发生变化的文件进行 diff(相对于 spawn 前一刻,包括 tracked 修改和 untracked 新文件),并与 node 声明的
run比较。超出范围 → 默认仅发出警告(写入files事件的done);只有note才会执行硬恢复(删除 untracked 新文件,将 tracked 修改通过--strict恢复到 HEAD)。不在 git repo 中时(例如 store 位于 repo 外)→ 自动跳过,不报错。orca-graph 自身的 bookkeeping(git checkout/.graph.json/.events.jsonl)始终从 diff 中排除,不计为“agent 写入”。.locks/ - ——整台机器只使用一个 daemon,通过 pid lock
watch [--once] [--interval 5] [--idle-sec 600]。每轮只读取 registry 中仍有运行中 node 的目录(开销取决于运行中的 node 数,而不是打开的项目数;实测每轮 84 ms,包含 Python 启动时间):lease 过期时 reaper 将 node 转为daemon.lock→ 如果存在 verify,则立即 reconcile;输出存活/死亡表格;registry 为空的时间超过 idle-sec 后自动退出;graph 发生变化时重新生成 control-room。unknown - →
fdk/tools/build-control-room.py——默认首先打开的页面,采用 data-first 方式(只读取 registry、graph.json、problem-tree、tokens.jsonl、audit-log):整台机器当前正在运行的任务与上限、各 graph 的进度及卡住的 node、尚未偿还的工作量、今日成本,以及与自动评分/audit 的差距。每 5 秒自动刷新;daemon 在每轮及每次llmwiki/html/control-room.html开始/结束时重新生成,因此 LIVE 页面无需 server。第 2 层(server + pause/cancel 按钮)和第 3 层(嵌入 Orca)尚未实现,只有当第 1 层被日常使用且确认缺少这些能力时才继续构建。run - 存活/死亡 ≠ 正确/错误:daemon 只能判断 process 是否仍存在;还是需要重做,始终由
done决定。Process 存活但卡住时 heartbeat 仍为绿色——应为每个 node 设置幂等的verify和超时限制。**Verify:**
Reference — Recap
Reference — Recap
/orca-graphaskanswerauditbuildrelated/orca-graphaskanswerauditbuildrelated