///|
/// —— 外部判据闸门([gate:required],默认关闭即现状)——
///
/// 背景:LLM 执行方与 LLM 测试方同源,"cargo test 全绿"不构成验收判据
/// (自写自测恒绿)。本闸门是流水线中第一个**非 LLM 判据源**的强制关口:
///   1) 任务 description 含 [gate:required] 时,verify 之前必须先由
///      服务端 run_check 工具**真实执行**一条外部命令(如 bash
///      scripts/e2e_golden.sh:真跑可执行产物 + golden diff)并把结果
///      落库(specs 表,spec_type="check",status="passed"/"failed");
///   2) 闸门校验该记录**新鲜**——检查时间必须不早于任务最后一次
///      updated_at(防止改完代码后用旧的一次通过记录蒙混);
///   3) 未标记任务行为与现状完全一致(零侵入)。
///
/// 记录 content 为 run_check 产出的 JSON 文本(exit/stdout/stderr),
/// 人类可直接在库内复核真实命令输出。

///|
/// 外部判据标记:出现在任务 description 中即表示该任务验收必须过闸门。
pub fn gate_mark() -> String {
  "[gate:required]"
}

///|
/// 任务是否开启外部判据闸门。
pub fn gate_enabled(t : @core.Task) -> Bool {
  t.get_description().contains(gate_mark())
}

///|
/// 记录一次外部命令检查结果(status = "passed" 当且仅当 exit_code==0)。
/// 记录 id = check::r(round = 该任务已有 check 记录数 + 1)。
pub fn FistEngine::gate_check_record(
  self : FistEngine,
  task_id : String,
  check_json : String,
  status : String,
  now : String,
) -> Result[Json, String] {
  match self.store.get_task(task_id) {
    None => Err("task not found: \{task_id}")
    Some(_) => {
      let round = self.omega_count_type(task_id, "check") + 1
      let rec = @store.SpecRecord::new(
        id="check:\{task_id}:r\{round}",
        task_id~,
        spec_type="check",
        content=check_json,
        status~,
        created_at=now,
        updated_at=now,
      )
      match self.store.upsert_spec(rec) {
        Err(e) => Err(e)
        Ok(_) => {
          let m : Map[String, Json] = Map([])
          m.set("ok", Json::boolean(true))
          m.set("check_id", Json::string(rec.id))
          m.set("task_id", Json::string(task_id))
          m.set("round", Json::number(round.to_double()))
          m.set("status", Json::string(status))
          m.set(
            "note",
            Json::string(
              "外部判据已落库;若任务带 [gate:required],verify 将校验本记录新鲜度(created_at >= 任务 updated_at)",
            ),
          )
          Ok(Json::object(m))
        }
      }
    }
  }
}

///|
/// 验收前闸门:[gate:required] 任务须存在**最新且通过且新鲜**的 check 记录。
/// 未标记任务直接放行(默认关闭即现状)。
pub fn FistEngine::gate_verify_gate(
  self : FistEngine,
  task_id : String,
) -> Result[Unit, String] {
  match self.store.get_task(task_id) {
    None => Ok(())
    Some(t) =>
      if !gate_enabled(t) {
        Ok(())
      } else {
        match self.omega_latest(task_id, "check") {
          None =>
            Err(
              "外部判据闸门:任务 [\{task_id}] 带 [gate:required],但尚无外部检查记录。请先由服务端执行 run_check(真实运行外部命令并落库)",
            )
          Some(c) =>
            if c.status != "passed" {
              Err(
                "外部判据闸门:任务 [\{task_id}] 最新外部检查 [\{c.id}] 状态为 [\{c.status}],未通过前禁止验收",
              )
            } else if c.created_at < t.get_updated_at() {
              Err(
                "外部判据闸门:任务 [\{task_id}] 的检查记录 [\{c.id}](\{c.created_at})早于任务最后更新(\{t.get_updated_at()}),代码可能已变更,请重新执行 run_check",
              )
            } else {
              Ok(())
            }
        }
      }
  }
}