vicTop-cw/fist-mbt/src/engine does not have a README file

    FistEngine

    核心引擎:持有 store,暴露指挥-执行-验收完整闭环。 store 为后端路由(内存 / SQLite),业务逻辑不感知具体实现。

    FistEngine::all_subtasks_completed

    fn FistEngine::all_subtasks_completed(self : FistEngine, parent :
    Task
    ) -> Bool

    是否为「非叶节点且所有直接子任务都已完成」

    FistEngine::archive

    fn FistEngine::archive(self : FistEngine, task_id~ : String, by~ : String, now~ : String) -> Result[
    Task
    , String]

    人类确认归档:Completed -> Archived(仅限人类指挥官)

    FistEngine::budget_split_by_dag

    fn FistEngine::budget_split_by_dag(self : FistEngine, budget : Int, root? : String, ns? : String) -> Json

    预算按依赖图阶段切分(R81,ZEBRA 背包水填充蒸馏简化版):给定总预算, 按任务 DAG 阶段(slack 分析的 earliest 层级 0..makespan)切分——每阶段基础份额 = 该阶段任务数 × 难度权重(难3/中2/易1,复用难度档单一来源;无难度标记按 1), 总权重归一化后乘总预算(向下取整,余数补给最大权重阶段)。 返回 { verdict, stages:[{level, tasks, difficulty_sum, share}], total_budget, makespan, scope, note }。 ——"预算在依赖图上按阶段切分:瓶颈阶段(关键路径层)占额可见,超支先预警",机制设计叙事。

    BUG-20 改的三件事: ① 过去只吃 budget,task_id/namespace 传了也不生效,算的永远是整个 store(实测 某轮 T0r292 子树 7 个任务,它报 tasks=1152=全库数)——现在 root/ns 真的参与取数, 与同族 dag_slack/dag_mc 的作用域口径一致; ② budget<=0(含负数)过去直接产出负份额(-50 → -42/-5/-2),既不拒也不警——现在拒绝; ③ 切了哪些任务写进返回体的 scope 自证。root/ns 都不给=全库(旧行为,零回归), 但这一点从此写在返回体里,而不是靠调用方记得自己没传。

    FistEngine::challenge

    fn FistEngine::challenge(self : FistEngine, task_id~ : String, by~ : String, factor? : Int, strat? : String, now~ : String, critic? :
    Archive
    ?) -> Result[Json, String]

    对一条已完成/已归档任务发起 Challenger 进阶变体:发布一个新根任务 [challenge]。 可选 critic(DGM 档案库,缺省 None = 关闭防漂移门禁,旧行为零回归):传入时先对生成 的挑战题做 Critic 防漂移评审(与 evolve_critic 同一单一真源),全部策略皆漂移则拒发。 返回 { new_id, source, by, factor, strat, importance, ns, description, critic, critic_status }。

    FistEngine::children_of

    fn FistEngine::children_of(self : FistEngine, task_id : String) -> Array[
    Task
    ]

    列出某任务的所有直接子任务

    FistEngine::circuit_fail

    fn FistEngine::circuit_fail(self : FistEngine, ns? : String, circuit~ : String, now_secs~ : Int, window_secs? : Int, threshold? : Int, recovery_secs? : Int) -> Json

    上报一次失败并推进熔断状态机。窗口内失败达阈值 → Open(记 opened_at);Half-Open 探测失败 → 回 Open。

    FistEngine::circuit_status

    fn FistEngine::circuit_status(self : FistEngine, ns? : String, circuit~ : String, now_secs~ : Int, probe_limit? : Int) -> Json

    查询熔断状态(含 Half-Open 到期判定:Open 且 elapsed≥recovery → 转 Half-Open 放行探测)。

    BUG-34:半开态必须节流——旧实现 allow = state != "open" 让恢复窗内所有调用全部放行, 半开退化成"换个名字的 closed",正是要防的下游踩踏(工具描述一直承诺"放行探测请求,其余仍快速失败", 承诺与实现相反)。 配额计数复用已持久化的 failures 列(半开态下它的含义是"本恢复窗已放行探测数"): 不扩 cb 表列 ⇒ 不动 native/js 双后端与既有迁移,也就不必把"跨进程计数"做成分布式预算 (上一轮 NOT-FIXED 的理由 ① 因此不成立)。 探测丢失兜底:拿到配额却既不 succeed 也不 fail 时,超过一个 recovery 窗就把配额重置—— 否则一次被吞掉的探测会把半开态永久锁在快速失败(那是把旧 bug 换成新 bug)。

    FistEngine::circuit_succeed

    fn FistEngine::circuit_succeed(self : FistEngine, ns? : String, circuit~ : String, now_secs~ : Int) -> Json

    上报一次成功:Closed 复位计数;Half-Open 探测成功 → Closed;Open 保持。

    FistEngine::claim

    fn FistEngine::claim(self : FistEngine, task_id~ : String, assignee~ : String, now~ : String) -> Result[
    Task
    , String]

    认领任务(executor 认领,待领取 -> 已领取 -> 执行中) 领取前检查依赖是否满足

    FistEngine::cold_publish

    fn FistEngine::cold_publish(self : FistEngine, ns~ : String, description~ : String, created_by~ : String, project_dir~ : String, now~ : String) -> Result[String, String]

    冷启动发布(无上一轮根任务时创建首个任务)。 仅用于 cron-auto 等自动化命名空间,语义等同「人类指挥官发布首轮」 但审计日志标记为 watchdog 自动发布。

    安全边界:
    • 仅允许作用于非 default 命名空间;
    • 该命名空间必须为空(已有任务时拒绝,避免重复发布)。

    FistEngine::cost_stats

    fn FistEngine::cost_stats(self : FistEngine) -> Json

    成本聚合统计:委托给 store 后端(SQLite 从 executions 表聚合,内存返回零值)。

    FistEngine::critical_path

    fn FistEngine::critical_path(self : FistEngine) -> Array[String]

    关键路径:全图中按 depends_on 建图后的最长依赖链(任务 id 序列)。 多条等长链取先遇到的一条;空仓库返回空数组。

    FistEngine::dag_ascii

    fn FistEngine::dag_ascii(self : FistEngine, ns~ : String) -> String

    ASCII 树/缩进图:展示某命名空间下的任务依赖结构。 层级由 parent_id(子任务归组)与 depends_on(依赖深度)共同决定, 同层任务按 id 字典序稳定输出;跨命名空间的父/依赖不计入缩进。 每行格式:<缩进> [<状态>](有依赖时追加 " (依赖: a,b)"),行尾换行。

    FistEngine::dag_cost_route

    fn FistEngine::dag_cost_route(self : FistEngine) -> Json

    依赖图成本路由(R77,STAR 蒸馏简化版):在 dag_schedule 排程视图之上补「成本」维度—— 对 flexible(slack>0)批中未认领任务,按拓扑序贪心给出建议执行者:在「能力覆盖的 已注册执行者」里选 执行成本 + 切换成本 之和最小者。
    • 执行成本:难度档映射(易/中/难 → 1/2/3,复用 extract_difficulty 单一来源);
    • 能力约束:任务所需能力 = 描述命中的最长已注册能力标签(复用 auto_want), 未命中标签的执行者被排除(want 空则全命中);
    • 切换成本:任务依赖链上已路由执行者若与候选不同则 +1(STAR 的上下文切换税);
    • 成本相等时取活跃负载最低者(与 R75 一致)。 纯计算、无副作用(只给建议不 claim)。——排程优化闭环最终形态: critical_path→slack→schedule→suggest→cost_route。

    FistEngine::dag_depend

    fn FistEngine::dag_depend(self : FistEngine, task_id~ : String, dep_id~ : String, now~ : String) -> Result[
    Task
    , String]

    显式给任务追加一条前置依赖(构建 DAG 依赖边,不只靠 plan_deep 隐式父子)。 校验:task 与 dep 均存在、非同一任务、且不会形成直接自环;去重追加并落库。 返回追加后的任务 JSON。失败返回 Err(含人语原因)。

    FistEngine::dag_mc

    fn FistEngine::dag_mc(self : FistEngine, ns? : String, root_task_id? : String, deadline? : Int, samples? : Int, seed? : Int) -> Json

    Monte Carlo 概率式完工预测(R94,Van Slyke 1963 首倡 MCS 求网络完工分布)。 对作用域内每个任务按难度档采样三角分布时长,整网模拟 samples 次, 输出完工时间分布(min/mean/p50/p90/max)+ 按期概率 + 关键度排行。 deadline>0 时给出 P(完工 ≤ deadline);seed 固定则结果可复现。

    FistEngine::dag_schedule

    fn FistEngine::dag_schedule(self : FistEngine) -> Json

    排程视图(R75 增强):在 dag_slack_analysis 基础上把任务落成可执行排程—— 按 slack 分两层批:critical 批(slack=0,关键路径瓶颈,须串行盯紧)与 flexible 批(slack>0,可按最早开始排序并行的弹性任务),每批附 assignee 当前占用, 并对 flexible 批中未认领任务给出「负载感知建议派单」(suggest:活跃负载最低的已注册执行者)。 复用 dag_slack_analysis(不重复算图)。——"谁在瓶颈、谁可并行派单"一目了然,排程优化闭环。

    FistEngine::dag_slack_analysis

    fn FistEngine::dag_slack_analysis(self : FistEngine) -> Json

    瓶颈与松弛分析(PERT/CPM 硬核调度能力,R71):对每个任务计算 earliest(依赖全部就绪的最早开始步数)、latest(不拖慢总工期的最晚开始步数)、 slack(latest-earliest;0=关键路径上,>0=可灵活并行安排)。 返回 { critical:[关键路径任务id], slack_map:{id:{earliest,latest,slack}}, makespan, cycle:[成环任务] }。 ——"找出谁在关键路径上、谁有松弛可并行",直接支撑排程优化(不是视图叠加)。

    FistEngine::delete_task

    fn FistEngine::delete_task(self : FistEngine, task_id : String) -> Result[Unit, String]

    删除任务(仅限已归档,ARCHIVING 清理)

    FistEngine::deps_satisfied

    fn FistEngine::deps_satisfied(self : FistEngine, task_id : String) -> Bool

    检查某任务的直接依赖是否全部完成

    FistEngine::dispatch_next

    fn FistEngine::dispatch_next(self : FistEngine, ns : String, agent : String, want : String, now : String) -> Json

    引擎层自治派单(纯增量、零回归):取 triage 顶部可领取任务 → 用 store 持久化执行者能力 注册经 executor 包 route_pick 按「能力覆盖 → 负载」路由最佳执行者 → 将任务直接认领给该执行者; 无注册/路由失败时回退到 agent。want 为空时自动从顶部任务描述抽取所需能力(R58)。 返回 { dispatched, task_id, to_executor, remaining, note?/error?, want? }。

    FistEngine::docs_verify_gate

    fn FistEngine::docs_verify_gate(self : FistEngine, task_id : String) -> Result[Unit, String]

    「文档即实现」验收门禁:task 需为 [docs:required] 或显式传 docs_check=true 时生效。 校验结构与回传格式,任一项缺失/不达标 → Err(含明细)。

    FistEngine::eval_feedback

    fn FistEngine::eval_feedback(self : FistEngine, feedback : String, task_id? : String) -> Json

    反馈收敛:归一为四段式 schema + verdict(E/O 蒸馏:生成→评估→定向修订→收敛)。 返回 { ok, task_id, schema:{defects,evidence,fix,acceptance}, counts, verdict, flags, note }。

    FistEngine::execute

    fn FistEngine::execute(self : FistEngine, task_id~ : String, deliverable~ : String, now~ : String) -> Result[
    Task
    , String]

    记录执行交付物

    FistEngine::execute_with_meta

    fn FistEngine::execute_with_meta(self : FistEngine, task_id~ : String, deliverable~ : String, now~ : String, executor? : String, model? : String, tokens_in? : Int, tokens_out? : Int, cost? : Double, duration_ms? : Int, rate_limited? : Bool, failure_reason? : String) -> Result[
    Task
    , String]

    记录执行交付物 + 执行元数据(executor/model/tokens/cost/duration)。 元数据写入 executions 表(供成本统计使用);task 本身状态照常流转。

    FistEngine::executor_clear

    fn FistEngine::executor_clear(self : FistEngine) -> Bool

    清空全部执行者能力注册(Marketplace 重置/整洁)。

    FistEngine::executor_list

    fn FistEngine::executor_list(self : FistEngine) -> Array[(String, String, String)]

    读取全部已注册执行者 (name, abilities_json, created_at)。

    FistEngine::executor_save

    fn FistEngine::executor_save(self : FistEngine, name~ : String, abilities_json~ : String, created_at~ : String) -> Result[String, String]

    持久化写入/覆盖一个执行者的能力注册(abilities_json 为 JSON 数组串)。

    FistEngine::executor_trust

    fn FistEngine::executor_trust(self : FistEngine) -> Map[String, Double]

    执行者历史信任分(R80,SwarmHarness 蒸馏):各 assignee 名下 已完成任务数 / 名下任务总数 (分母含打回/执行中/待验收等,防"只认领不交付");名下无任务取 0.5 中性。 供 executor_route 历史信任轴(排序键 能力覆盖→信任→负载)。

    FistEngine::gate_check_record

    fn FistEngine::gate_check_record(self : FistEngine, task_id : String, check_json : String, status : String, now : String) -> Result[Json, String]

    记录一次外部命令检查结果(门禁状态从 check_json 的 ok/exit_code==0 推导, status 参数已不参与判定,仅保留以维持公开签名兼容)。 记录 id = check:<task_id>:r(round = 该任务已有 check 记录数 + 1)。

    FistEngine::gate_verify_gate

    fn FistEngine::gate_verify_gate(self : FistEngine, task_id : String) -> Result[Unit, String]

    验收前闸门:[gate:required] 任务须存在最新且通过且新鲜的 check 记录。 未标记任务直接放行(默认关闭即现状)。

    FistEngine::get_task

    fn FistEngine::get_task(self : FistEngine, task_id : String) ->
    Task
    ?

    查询单个任务

    FistEngine::goal_drift_check

    fn FistEngine::goal_drift_check(self : FistEngine, root_task_id : String, subtask_id? : String, ns? : String) -> Json

    全局目标校验(R100,goal drift arXiv 2505.02709 / Repetitiveness Rate 2603.12710 / IntentCUA 2602.17049 / HiMAP ICML2026 蒸馏落地)——advisory 判据,不是硬门(BUG-25)。

    词法口径(单真源 @evolve.tokens):similarity = max(jaccard, coverage),drift = 1 - similarity。 · coverage 非对称(|根∩子|/|根|):只问"根目标的词还在不在",子任务多写模板不被长度惩罚; · jaccard 保留给兄弟冗余(对称量,语义正确)。

    为什么必须降级成 advisory(标定实测,scripts/calibrate_goal_drift.py): 真实父子对全集 1222 条 drift_suspect=1.9%,随机错配对照 400 条=81.3%(有分离); 但改写型父子对(去掉前缀拼接桩与模板桩后剩 39 条,如 T0r61→T0r61.1「依赖图恒空」 被写成「增量编译链与依赖图修复:cypyc/incremental/...」)假阳性 56~59%, 3 个可测家族上绝对阈值 0.7 命中 15/15——合法拆解与真漂移在词面上不可分。 所以:判据照旧发红(离群时最有信息量),但 verdict 一律带 advisory=true, 下游按它打回就是把 15/15 的正常子任务反复打回(BUG-25 影响 2 的病灶)。 subtask_id 缺省校验根下全部后代。纯计算、只读不写库(决策建议,执行权在 agent/指挥官)。

    FistEngine::heartbeat_backend

    fn FistEngine::heartbeat_backend(self : FistEngine) -> String

    心跳后端自述 "sqlite" / "memory"(BUG-119:落库与否必须让调用面看得见)。

    FistEngine::list_all

    列出全部任务

    FistEngine::list_by_status

    按状态过滤列出

    FistEngine::list_in_ns

    fn FistEngine::list_in_ns(self : FistEngine, ns : String) -> Array[
    Task
    ]

    按命名空间列出任务(ns 为空串时回退默认命名空间)。 供 watchdog 等运维编排按 ns 扫描使用。

    FistEngine::omega_auto_lesson

    fn FistEngine::omega_auto_lesson(self : FistEngine, seq : Int, cat : String, reason : String, fix : String, now : String) -> Bool

    /// Omega 打回自动落一条教训。cat 为类目 tag,reason 为失败原因,fix 为纠偏提示。 seq 用于同一类目、同一时刻多次打回的 id 趋唯一;id 纳入 cat, 保证 spec 打回 / 复验打回 / 超限升级在同一时间戳下互不覆盖(upsert 语义防丢史)。

    FistEngine::omega_count

    fn FistEngine::omega_count(self : FistEngine, task_id : String, spec_type : String, status : String) -> Int

    统计某类型记录中处于指定状态的条数。

    FistEngine::omega_count_type

    fn FistEngine::omega_count_type(self : FistEngine, task_id : String, spec_type : String) -> Int

    统计某类型的全部记录条数。

    FistEngine::omega_execute_gate

    fn FistEngine::omega_execute_gate(self : FistEngine, task_id : String) -> Result[Unit, String]

    执行前门禁:强验证任务必须先有「已通过」语料;默认关闭的任务直接放行。

    FistEngine::omega_latest

    fn FistEngine::omega_latest(self : FistEngine, task_id : String, spec_type : String) ->
    SpecRecord
    ?

    取最新一条指定类型记录。

    FistEngine::omega_records

    fn FistEngine::omega_records(self : FistEngine, task_id : String) -> Array[
    SpecRecord
    ]

    列出某任务的全部语料 / 复验 / 升级记录。

    FistEngine::omega_result_verify

    fn FistEngine::omega_result_verify(self : FistEngine, task_id~ : String, reviewer~ : String, verdict~ : String, reason? : String, now~ : String, max_rounds? : Int) -> Result[Json, String]

    成果复验(角色:验证者 verifier,或人类指挥官)。 verdict = pass 达标;其余视为打回重做(超限升级人工)。

    FistEngine::omega_spec_create

    fn FistEngine::omega_spec_create(self : FistEngine, task_id~ : String, author~ : String, content~ : String, now~ : String, max_rounds? : Int) -> Result[Json, String]

    语料创建(角色:语料创建者 spec_author,或人类指挥官)。 落库 specs 表:id = spec:<task_id>:r,status = pending。

    FistEngine::omega_spec_review

    fn FistEngine::omega_spec_review(self : FistEngine, task_id~ : String, reviewer~ : String, verdict~ : String, reason? : String, now~ : String, max_rounds? : Int) -> Result[Json, String]

    语料审核(角色:验证者 verifier,或人类指挥官)。 verdict = approve 通过;其余视为打回(打回累计超限则升级人工)。

    FistEngine::omega_status

    fn FistEngine::omega_status(self : FistEngine, task_id : String) -> Result[Json, String]

    查询某任务的强验证状态(开关、语料轮次、打回次数、复验状态、是否已升级)。

    FistEngine::omega_verify_gate

    fn FistEngine::omega_verify_gate(self : FistEngine, task_id : String) -> Result[Unit, String]

    验收前门禁:强验证任务必须先有「已通过」的成果复验记录。

    FistEngine::open_sqlite

    fn FistEngine::open_sqlite(db_path : String) -> FistEngine?

    以指定 SQLite 数据库打开持久化引擎(内建数据库入口;失败返回 None 供调用方回退)。

    FistEngine::parallelism

    fn FistEngine::parallelism(self : FistEngine) -> Int

    当前可并行执行的任务数:状态为待领取且依赖已满足的任务数。

    FistEngine::pause_task

    fn FistEngine::pause_task(self : FistEngine, task_id~ : String, now~ : String) -> Result[
    Task
    , String]

    暂停任务:任意活跃状态 -> 已暂停

    FistEngine::pick_next

    fn FistEngine::pick_next(self : FistEngine, namespace : String, agent : String, want : String, now : String) -> Json

    下一步自动取单(自驱推进):按 triage 的能力推荐取顶部候选并认领给 agent(0 状态迁移:待领取→已领取)。 复用 triage(排行+suggestion)与 claim(认领),只动一条推荐任务,不动看门狗主流程(零回归)。 返回 { picked, remaining, claimed, ns, want, task?, note|error? }。

    FistEngine::plan

    fn FistEngine::plan(self : FistEngine, task_id~ : String, split_n? : Int, by~ : String, now~ : String) -> Result[Array[String], String]

    对指定任务生成子任务树(一层)。非原子任务才可拆分。 返回生成的子任务 id 列表。

    FistEngine::plan_deep

    fn FistEngine::plan_deep(self : FistEngine, task_id~ : String, split_n? : Int, by~ : String, spec? : Json?, now~ : String, omega_strong_verify? : Bool, gradient? : Bool, calibrate? : Array[Double]?, gradient_dag? : Bool, reinject_context? : Bool, boundary_probe? : Bool) -> Result[Json, String]

    AO 式递归拆解入口:对指定任务拆出整棵子任务树并写库。

    入参: task_id 要拆解的根/拳节任务 id(非原子任务才可拆); split_n 每层默认拆分数(无 spec.laws 时生效,默认 3); by 执行拆解的拳长身份(仅记录); spec 可选 omega spec JSON(laws 作切割依据,fingerprint 作验收基准); now 时间戳。 reinject_context 是否把「父计划 + 剩余兄弟」回注进每条子任务描述(R63,ReCAP 借鉴; 默认 false 零回归)——让原子片知道自己"为什么做、旁边还有谁",防上下文漂移。 boundary_probe 是否为「spec 没写的域外行为」补一个 owner(R115+,atgc-merge 归因报告 机理 1「递归拆解损失全局视角」+ 机理 2「验收锚定 + 弱语料」): true 时本层末尾追加一条「边界审视叶」(全局输入域 owner), 并给其余每条叶挂「边界四问」提示。默认 false 零回归。

    返回:{ "root", "by", "created", "tree" },tree 为多层子树结构; 任一子节点非叶时将继续递归(depth 递减,is_leaf=depth<=1 停止)。

    FistEngine::plan_exec_order

    fn FistEngine::plan_exec_order(self : FistEngine, root_id : String) -> Json

    生成整棵拆解子树的「执行计划」视图:收集根任务全部后代(BFS),按 DAG depends_on 拓扑排序,输出一张扁平、按依赖可安全执行的清单(每条含 id/depth/难度档/依赖/状态)。供 agent 拆解后拿到即可照单执行——"一张计划、 一目了然",而非再全库去翻。纯读、无副作用。

    FistEngine::plan_revise

    fn FistEngine::plan_revise(self : FistEngine, root_task_id : String, feedback? : Array[Json], ns? : String) -> Json

    反馈驱动的计划修订(R98,ReAct arXiv 2210.03629 / CoPAL arXiv 2310.07263 蒸馏落地): 把"拆完即弃"升级为"执行中持续修订"——给定根任务及子任务执行反馈,计算计划三分: keep(已证有效、承诺保留)/ rework(失败或其依赖链受牵连,需返工/重做)/ ready (依赖全部有效且未执行 = 下一步可做)。feedback 缺省时读真实状态(已完成/已归档 =ok;已打回/已暂停=否;其余=未证)。级联:失败任务的下游依赖者一并 rework (plan commitment 控涟漪——与 saga_repair 依赖者闭包同构)。纯计算、只读不写库 (决策建议,执行权在 agent/指挥官,与 saga 返回补偿序列同一抽象层)。

    FistEngine::progress_gate

    fn FistEngine::progress_gate(self : FistEngine, task_id : String, budget : Int, spent_override : Int) -> Json

    进度预算路由门控(R88,PROGROUTER arXiv 2608.25992 蒸馏简化版):在线进度引导—— 对任务子树按「已消耗预算(难度权重 易/中/难→1/2/3,复用 extract_difficulty 单一来源) 与 完成进度(已完成+已归档 / 子树任务数)」做双路径剩余成本预测: 线性 = 燃尽率(burn_rate=spent/progress) × 剩余工作量(1-progress); 保守 = 线性 × 1.2(PROGROUTER 双路径,缓冲 20%)。 元门控给决策:OK(预算充足继续)/ CAUTION(线性可行但缓冲不足 → 建议降档/缩范围)/ ESCALATE(线性已超支 → 建议追加预算或暂停)。纯计算、无副作用。 spent_override>0 可覆盖自动估算(如按真实 token/成本统计注入);0 或缺省=自动。

    FistEngine::publish

    fn FistEngine::publish(self : FistEngine, project_dir~ : String, description~ : String, created_by~ : String, now~ : String, ns? : String) -> Result[String, String]

    发布根任务(仅限人类指挥官)

    FistEngine::publish_next_round

    fn FistEngine::publish_next_round(self : FistEngine, ns~ : String, description~ : String, created_by~ : String, prev_task_id~ : String, now~ : String) -> Result[String, String]

    自动续轮(仅供定时任务看门狗 watchdog_tick 调用,见 ops_watchdog.mbt)。

    语义:把已完成的上一轮根任务标记为已续轮并归档,同时发布下一轮根任务。 安全边界(watchdog 计划文档第 0 节):
    • 仅允许作用于非 default 命名空间,避免干扰人工指挥流程;
    • 上一轮必须是「已完成」的根任务。

    返回新根任务 id(T0r2、T0r3 ...)。

    FistEngine::publish_parallel

    fn FistEngine::publish_parallel(self : FistEngine, ns~ : String, description~ : String, created_by~ : String, project_dir~ : String, now~ : String) -> Result[String, String]

    并行追加独立根任务:连续发布多条互不依赖的根任务(自驱式编程「审视 -> 自我派活」用)。

    与 cold_publish(要求 ns 为空)和 publish_next_round(要求前轮已完成并续轮归档)不同, 本方法允许命名空间已有任务,直接以唯一 id(T0 / T0r2 / T0r3 ...)追加为新的独立根任务, 不续轮、不归档、不要求前轮状态,专用于同一审视报告的多条 Next Tasks 并行落地。

    FistEngine::publish_with_deps

    fn FistEngine::publish_with_deps(self : FistEngine, project_dir~ : String, description~ : String, depends_on? : Array[String], created_by? : String, now? : String, ns? : String) -> Result[String, String]

    创建任务时指定依赖(depends_on 为依赖的任务 id 列表)

    FistEngine::ready_tasks

    fn FistEngine::ready_tasks(self : FistEngine, ns_filter? : String) -> Array[
    Task
    ]

    获取当前命名空间内所有 Pending 且依赖满足、可领取的任务

    FistEngine::reject_task

    fn FistEngine::reject_task(self : FistEngine, task_id~ : String, reason? : String, by~ : String, now~ : String) -> Result[
    Task
    , String]

    验收拒绝(reject):待验收 -> 已打回

    FistEngine::reopen_task

    fn FistEngine::reopen_task(self : FistEngine, task_id : String, now : String) -> Result[
    Task
    , String]

    回滚/重派:任意非归档任务 -> 已领取(M4 heal watchdog 用)。返回回滚后的任务。

    FistEngine::resume_task

    fn FistEngine::resume_task(self : FistEngine, task_id~ : String, now~ : String) -> Result[
    Task
    , String]

    恢复任务:已暂停 -> 已领取

    FistEngine::retry_task

    fn FistEngine::retry_task(self : FistEngine, task_id~ : String, now~ : String) -> Result[
    Task
    , String]

    打回后重试(retry):已打回 -> 执行中

    FistEngine::rsv_get

    fn FistEngine::rsv_get(self : FistEngine, scope : String) -> (String, String, String)?

    FistEngine::rsv_list

    fn FistEngine::rsv_list(self : FistEngine) -> Array[(String, String, String)]

    FistEngine::rsv_release

    fn FistEngine::rsv_release(self : FistEngine, scope : String, agent : String) -> Bool

    FistEngine::rsv_set

    fn FistEngine::rsv_set(self : FistEngine, scope~ : String, agent~ : String, ttl_until~ : String, created_at~ : String) -> Result[String, String]

    FistEngine::rsv_try_set

    fn FistEngine::rsv_try_set(self : FistEngine, scope~ : String, agent~ : String, ttl_until~ : String, created_at~ : String) -> Result[
    RsvOutcome
    , String]

    按裁决抢预订(BUG-136):互斥由后端定,工具面只渲染结论——不许在这里先读后写。

    FistEngine::saga_register

    fn FistEngine::saga_register(self : FistEngine, ns? : String, root_task_id~ : String, step~ : String, task_id? : String, compensation~ : String, now~ : String) -> Result[Json, String]

    登记一个 Saga 补偿步骤(幂等:同 (ns, root_task_id, step) 重登记会把 status 重置为 pending 并刷新 compensation——重试安全,不改 LIFO 位置)。

    FistEngine::saga_repair

    fn FistEngine::saga_repair(self : FistEngine, ns? : String, root_task_id : String, failed_step~ : String, mark? : Bool) -> Result[Json, String]

    局部补偿(控级联,R96,Plan Commitment / scope-aware repair 蒸馏落地): 给定失败步骤,计算最小补偿切片——失败步骤 + 其依赖下游(任务 depends_on 传递闭包中仍 pending 的步骤)——只补偿切片、保留切片外已接受承诺(keep), 与 saga_rollback(全局 LIFO 整链收尾)互补;无 task_id 时按注册序保守兜底。 mark=true(默认)返回后即把切片标记 done(幂等),keep 步骤保持 pending 供后续按需补偿(局部修复保留承诺,不涟漪撤销)。

    FistEngine::saga_rollback

    fn FistEngine::saga_rollback(self : FistEngine, ns? : String, root_task_id : String, mark? : Bool) -> Result[Json, String]

    按 LIFO(严格倒序)返回某根任务待补偿步骤序列;mark=true(默认)返回后一并标记 done(幂等:重复调用返回空 pending,防重复回滚;mark=false 仅预览不消费)。 补偿是"业务逆转"动作描述,调用方(agent/指挥官)按序列顺序执行真实补偿。

    FistEngine::store_delete_heartbeat

    fn FistEngine::store_delete_heartbeat(self : FistEngine, task_id~ : String) -> Result[Unit, String]

    删除心跳记录(委托给 store 后端)。

    FistEngine::store_list_heartbeat_intervals

    fn FistEngine::store_list_heartbeat_intervals(self : FistEngine, task_id : String) -> Array[Int]

    读取心跳间隔历史(R90,时间序旧→新;委托给 store 后端)。

    FistEngine::store_list_heartbeats

    fn FistEngine::store_list_heartbeats(self : FistEngine) -> Array[(String, String, String, String)]

    列出全部心跳记录(供启动时加载)。

    FistEngine::store_list_saga_actions

    fn FistEngine::store_list_saga_actions(self : FistEngine, ns : String, root_task_id : String) -> Array[(Int, String, String, String, String)]

    列出某根任务的 Saga 补偿步骤(R92;前向顺序)。

    FistEngine::store_mark_saga_actions_done

    fn FistEngine::store_mark_saga_actions_done(self : FistEngine, ns? : String, root_task_id~ : String, ids~ : Array[Int]) -> Result[Unit, String]

    把指定 Saga 补偿步骤标记 done(R92;幂等)。

    FistEngine::store_read_heartbeat_last_seen

    fn FistEngine::store_read_heartbeat_last_seen(self : FistEngine, task_id : String) -> String

    读单个任务的持久化心跳 last_seen(BUG-119:跨进程真相的唯一读取点;无记录返回空串)。

    FistEngine::store_recent_call_logs

    fn FistEngine::store_recent_call_logs(self : FistEngine, limit? : Int) -> Array[Json]

    读取最近 N 条调用日志(委托给 store 后端,新的在前)。

    FistEngine::store_write_call_log

    fn FistEngine::store_write_call_log(self : FistEngine, ts~ : String, tool~ : String, caller~ : String, ns~ : String, params_json~ : String, result_json~ : String, ok~ : Bool, runtime_ms~ : Int, seq~ : Int) -> Result[Unit, String]

    写入一条调用日志(委托给 store 后端;best-effort,调用方应忽略错误)。

    FistEngine::store_write_heartbeat

    fn FistEngine::store_write_heartbeat(self : FistEngine, agent_id~ : String, task_id~ : String, last_seen~ : String, status~ : String) -> Result[Unit, String]

    写入心跳记录(委托给 store 后端)。

    FistEngine::store_write_heartbeat_interval

    fn FistEngine::store_write_heartbeat_interval(self : FistEngine, task_id~ : String, interval_sec~ : Int, ts~ : String) -> Result[Unit, String]

    追加心跳间隔历史(R90,Phi Accrual 判活数据源;委托给 store 后端)。

    FistEngine::store_write_saga_action

    fn FistEngine::store_write_saga_action(self : FistEngine, ns? : String, root_task_id~ : String, step~ : String, task_id? : String, compensation~ : String, created_at~ : String) -> Result[Unit, String]

    登记 Saga 补偿步骤(R92,durable action log;委托给 store 后端)。

    FistEngine::submit

    fn FistEngine::submit(self : FistEngine, task_id~ : String, now~ : String) -> Result[
    Task
    , String]

    FistEngine::topo_sort

    fn FistEngine::topo_sort(self : FistEngine, task_ids : Array[String]) -> Array[String]

    拓扑排序(Kahn 算法):task A 在 depends_on 中的任务之后执行(依赖先输出)。 仅按 task_ids 集合内的依赖建图;集合外的依赖视为已满足(不影响本集合内排序)。 稳定:同批 indegree=0 的节点按 task_ids 原序输出;环残留节点按原序追加尾部。

    FistEngine::transition_contract

    fn FistEngine::transition_contract(self : FistEngine, task_id : String, action : String, assignee? : String, completed_by? : String) -> Json

    迁移契约检查(R109 · Design by Contract 蒸馏):precondition / invariant / postcondition 三件套只读预检。 任一失败 → verdict=rejected 整笔拒绝,状态 A 回稳(不落库);全部通过 → verdict=allowed(建议仍走正式生命周期工具执行)。

    FistEngine::triage

    fn FistEngine::triage(self : FistEngine, namespace : String, agent : String, want : String) -> Json

    下一步推荐(Triage,带能力偏好路由):返回 { count, ns, agent, want, suggestion?, tasks:[...] }。 namespace 为空表示全量;只统计"待领取且依赖已满足"的任务。want 为能力关键词(Marketplookup 雏形): 非空时,命中该关键词的候选排在头部(按能力匹配路由"这个 agent 擅长啥就先领啥"),不命中者照旧跟进。

    FistEngine::verify

    fn FistEngine::verify(self : FistEngine, task_id~ : String, verifier~ : String, now~ : String, docs_check? : Bool) -> Result[
    Task
    , String]

    验收(verifier):Reviewing -> Completed;若因此父任务全部子任务完成,则父任务自动待验收。

    TriageRow

    type TriageRow

    下一步排行行(triage 内部行)。

    COMPLEXITY_L1

    let COMPLEXITY_L1 : String

    复杂度分级枚举(文本常量)

    COMPLEXITY_L2

    let COMPLEXITY_L2 : String

    COMPLEXITY_L3

    let COMPLEXITY_L3 : String

    COMPLEXITY_L4

    let COMPLEXITY_L4 : String

    COST_TIER_FREE

    let COST_TIER_FREE : String

    成本档枚举

    COST_TIER_HOLD

    let COST_TIER_HOLD : String

    COST_TIER_PREMIUM

    let COST_TIER_PREMIUM : String

    advance_mark_prefix

    fn advance_mark_prefix() -> String

    自动续轮标记前缀:已完成但尚未续轮的根任务,其 deliverable 不带该前缀。

    boundary_probe_hint

    fn boundary_probe_hint() -> String

    边界四问·叶级提示(R115 后置改进,对准 atgc-merge 归因报告机理 2「验收锚定 + 弱语料」)。 语料只断言"做了没"时,执行体理性地停在判据边界上;这一行把"域外行为"变成每条叶子的显式义务。

    boundary_probe_slice

    fn boundary_probe_slice() -> String

    边界审视叶的切片文本(对准机理 1「递归拆解损失全局视角 ⇒ 全局不变量无 owner」)。 拆完之后"spec 没写的域外行为"是无人负责地带;本切片给这类思考一个可领取、可验收的归属。

    budget_check

    fn budget_check(limit : Double, current : Double) -> Json

    预算检查结果 返回 JSON:{ limit, current, exceeded, remaining, action }

    budget_check_json

    fn budget_check_json(args : Json) -> Json

    从 JSON 参数计算 budget_check(供 MCP 工具调用)。 输入 JSON:{ "limit": Number, "current": Number }

    ch_desc

    fn ch_desc(task_id : String, src_desc : String, frame : String) -> String

    组装一条候选挑战题的描述(任一策略共用同一模板,保证可比)。

    challenge_strategies

    fn challenge_strategies() -> Array[String]

    进阶策略白名单:为已完成任务"上难度"的几种规则化变体框架。 generalize:去具体场景 → 抽象为通用能力并覆盖边界 unhint :去提示/约束 → 从空白规格重推且不降正确性 constrain :加硬约束 → 本次在性能/并发/兼容上加严并保证不回归 scale :扩规模 → 把规模/负载提升 factor 倍并保持语义正确

    extract_difficulty

    fn extract_difficulty(desc : String) -> String

    从任务描述中抽取 LADDER 难度档([难度梯度 idx/n:档] 中档位子串),无则返回空串。

    gate_enabled

    fn gate_enabled(t :
    Task
    ) -> Bool

    任务是否开启外部判据闸门。

    gate_mark

    fn gate_mark() -> String

    外部判据标记:出现在任务 description 中即表示该任务验收必须过闸门。

    omega_author_prefix

    fn omega_author_prefix() -> String

    语料 author 前缀(纯文本行,避免为嵌入 author 而引入 JSON 转义)。

    omega_clean_slice

    fn omega_clean_slice(s : String) -> String

    去掉切片文本中已存在的强验证标记(避免递归下钻时标记逐层累积)。

    omega_enabled

    fn omega_enabled(t :
    Task
    ) -> Bool

    任务是否处于强验证模式(未打标记 = 关闭 = 既有行为)。

    omega_escalation_id

    fn omega_escalation_id(task_id : String, stage : String, round : Int) -> String

    升级记录 id:escalation:<task_id>::r

    omega_mark

    fn omega_mark() -> String

    强验证标记:出现在任务 description 中即表示该任务处于强验证模式。

    omega_max_rounds_default

    fn omega_max_rounds_default() -> Int

    默认最大打回轮次。

    omega_norm_max_rounds

    fn omega_norm_max_rounds(v : Int) -> Int

    归一化轮次上限:非正数取默认,超过 10 硬截断(防死循环的最终边界)。

    omega_result_id

    fn omega_result_id(task_id : String, round : Int) -> String

    成果复验记录 id:result:<task_id>:r

    omega_spec_id

    fn omega_spec_id(task_id : String, round : Int) -> String

    语料记录 id:spec:<task_id>:r

    phi_accrual

    fn phi_accrual(intervals : Array[Int], elapsed : Int, threshold? : Int) -> Json

    Phi Accrual 主计算:给定心跳间隔历史 intervals(秒)与自上次心跳起的 elapsed(秒), 返回 { verdict: rejected|insufficient|healthy|suspect, phi, mean, stddev, window, threshold, note, basis }。 threshold 默认 8(原论文口径);窗口默认取最近全部传入间隔(≤1000 条)。 取值域外返回 rejected 且不出结论——以前这类输入带着饱和后的均值照样回 healthy, 看护据此不 heal,任务永久卡在已领取。

    phi_coerce_seconds

    fn phi_coerce_seconds(v : Double) -> Int?

    JSON 秒数 → Int 的安全转换(BUG-26 的上溢落点):Double::to_int() 对超出 Int 域的 值(如实测的 1e300)饱和成 2147483647,随后仍被当成均值继续算 φ;带小数的值被截断、 非数字元素被整条丢掉。这里把这三类失真一律收成 None,让调用面在转换之前拒绝。

    phi_domain_error

    fn phi_domain_error(intervals : Array[Int], elapsed : Int) -> String

    取值域校验(BUG-26):φ 的建模输入一旦失真(负 elapsed、非正间隔),输出仍是格式完好的 healthy/suspect——看起来是结论,实际是溢出后的算术。把「不可建模」提到结论之前。 返回拒绝原因(空串=通过)。间隔的上溢发生在 JSON→Int 的转换点,由调用面拦。

    plan_route

    fn plan_route(description : String, n_files? : Int) -> Json

    组合 schedule + route:输入 description + n_files,输出完整调度+路由方案。 返回 JSON:{ schedule: {...}, route: {...} }

    root_task_id

    fn root_task_id() -> String

    根任务 id

    route

    fn route(complexity : String, cost_tier : String) -> Json

    路由结果 返回 JSON:{ executor, cost_tier, hold, priority, reason }

    schedule_json

    fn schedule_json(args : Json) -> Json

    从 JSON 参数中计算 schedule(供 MCP 工具调用)。 输入 JSON:{ "description": String, "n_files"? : Int }

    schedule_task

    fn schedule_task(desc : String, n_files? : Int) -> Json

    核心调度函数:根据描述长度、文件数、风险词计算分级与参数。

    输入: desc 任务描述文本 n_files 涉及文件数(可选,默认 1) 返回 JSON: { complexity, n_split, depth, parallel, cost_tier, hold, reason }