dagr-producer 是 herdr-dagr 仓库下的一个技能,用于编写和维护 dagr 运行文件。dagr 是一个表示内核:生产者断言任务真相,dagr 只从这些事实推导出已定义的视图信号。缺失或错误的事实仍会产生缺失或错误的图,系统没有工作流引擎来修复它。
用途 该技能面向需要以结构化、可校验方式记录递归项目执行状态的场景。运行文件是 dagr view 实时渲染的数据源,生产者是运行文件的唯一写入者。契约版本为 "dagr": 3,v1/v2 文件仍可读取,新运行应写入 v3。
主要能力
- 定义项目与子项目层级:项目是递归的可视范围,运行是隐式根,子项目就是带 parent 的项目。阶段或工作流也只是一个项目,不是另一种实体。
- 定义任务:任务有稳定的 id、kind(开放集合,如 impl、review、test、gate、question、docs、ship 等)、状态(queued、working、review、blocked、done、failed、rejected、canceled、settled_unverified)。
- 记录尝试:每次尝试有 id(形如 T·aN,n 从 1 开始)、状态、时间戳、actor、model、locator、liveness 等。重试不重写尝试,而是追加带 cause 的新尝试。
- 事件溯源:事件为追加式,包括 attempt_started、attempt_settled、promoted、directive、message_resolved、note,按时间戳升序,不可重写或重排。
- 证据等级:每个终态结果带证据等级——verified(机械校验,如测试运行、提交回执)、reported(来自执行者的类型化信封)、heuristic(推断)、asserted(仅口头声明)。无人声明完成时使用 settled_unverified。
- 门控汇聚:gate 的 fan-in 就是它的 deps,inputs 仅在 fan-in 集合与依赖集合不同时用于覆盖。
- 循环策略:policy 块声明 rounds_max 与 futures,futures 可指向已有任务(ref)或声明尚未存在的节点(node),支持 loop_back、after、streak 等。
使用方式
- 先找到校验器:$DAGR_BIN、PATH 中的 dagr、插件/仓库构建 <dagr repo>/target/release/dagr(herdr 面板中运行时注入 $HERDR_PLUGIN_ROOT),或回退 cargo run --manifest-path <dagr repo>/Cargo.toml -- check …。没有校验器就不要开始写运行文件。
- 遵循不可协商的循环:写 run.json.tmp → dagr check run.json.tmp --strict --json → 修复 → 重复直到输出 [] → 然后重命名覆盖 run.json。退出码 0 且 [] 表示干净;退出码 1 表示有发现(E 码为错误,W 码为可表示但可疑,--strict 将其视为失败);退出码 2 表示校验器无法读取文件,属于路径或工具问题,stdout 为空,绝不能把空输出当作干净。只有干净时才执行 mv run.json.tmp run.json(原子重命名)。
- 写入位置:面板先找 $DAGR_RUN,再找 .dagr/run.json,再找工作区 cwd 下的 run.json;都不存在时等待 .dagr/run.json。默认写入工作区根目录的 .dagr/run.json(加入 gitignore),一个运行一个文件。
- 每次写入刷新 generated_at,它锚定屏幕上所有“Nm ago”,过期值会渲染出过期横幅。
- run.orchestrator 应自动从自己的 $HERDR_PANE_ID 设置(或稳定的 Herdr agent 目标),不要指向 worker。
适用场景
- 需要以可校验 JSON 描述递归项目、任务、尝试、门控、证据、策略与事件的运行记录。
- 需要在 herdr 面板中实时渲染任务图与状态。
- 需要追加式历史、证据分级、门控汇聚与循环策略声明的多智能体或人工协作流程。
限制
- 没有可用的 dagr 校验器时,不应开始写运行文件。
- 运行文件必须通过 dagr check --strict 校验后才能发布,不能先发布再校验。
- 任务状态是尝试的投影,必须满足不变量:working 需要 working 尝试;done/rejected/settled_unverified 需要最新尝试匹配;failed 接受最新尝试为 failed 或 lost;queued 禁止 working 尝试,也禁止最新尝试为 done 或 settled_unverified;review 需要至少一个尝试;canceled 仅限任务。
- 运行是有向无环图,deps 或 gate inputs 不得成环。
- cause 必须指向更早的尝试,n=1 只能用 initial。
- 终态尝试必须带 outcome,result 等于 state,并有真实证据等级;时间戳为真实 ISO-8601,尝试结束时间晚于开始时间。
- id 必须唯一,任务 id 不得与尝试 id 冲突;herdr 面板 id 放在 locator,不放在 id。
- 活跃尝试需要 locator 和填充的 liveness(prompt_acknowledged、last_output_at、queued_input 为数字而非布尔)。
- blocked 必须指明解除阻塞者;promotion 是事件而非推断。
- 项目包含关系不是依赖关系,每个任务只有一个真实的视觉归属,不得为让两个项目都可见而复制任务。
- 操作员消息保留其权威与 id,需尊重 recommend_and_return 与 may_decide_and_continue,并在 resolution 事件中保留 message_id。
- policy 是当前意图而非历史,是唯一可原地编辑的块;历史在 attempts 和 events 中,为追加式。
- 资料中未提供收费、价格、平台支持范围等具体信息。