# 任务：CI Phase 0 落地（KMC + KAP 两仓）

先完整读背景报告：`/home/kai/shared/2026-08-25/glm-ci-gates-eval.md`（CI 硬门槛评估，
Phase 0 清单在其 D 节）。你负责把 Phase 0 做出来。

## 开工前必做

1. 两仓各记录 `git status --short` 基线。以下 dirty 文件属**并行会话，绝对禁碰、禁 commit**：
   - KMC(/data/workspace/kais-hermes-skills)：`plugins/review_gates/runner_hooks.py`、
     `plugins/kais_aigc/tests/test_review_platform.py`、`pipeline/phases/p11b_final_render.py`、
     `pipeline/phases/p11c_video_qc.py`、`.pipeline-state.json`、`.planning/**`、
     `episodes/**blackboard.json`
   - KAP(/data/workspace/kais-aigc-platform)：`src/lib/reviewBridge.ts`、`src/lib/canvasRelationalStore.ts`、
     `src/lib/gateCatalog.ts`、`src/lib/manifestWriteback.ts`、`src/routes/canvas/v2/select-winner.ts`、
     `packages/infinite-canvas/yarn.lock` 及其余全部 M 文件
2. 只允许新增/修改你清单内的文件。禁 push、禁顺手重构、禁碰基线外文件。

## KMC 修复项（每项独立 commit，前缀 `ci(phase0):`）

**K1 ruff bug 类清零**（范围：`skills/kais-movie-pipeline/pipeline plugins`）：
- F821×2：`runner.py:705` 调用未定义的 `_resolve_episode_genre_cached`——用
  `git log -S` 查该函数历史，恢复正确实现/导入或删除死分支；`plugins/pipeline_state/creative_history.py:80`
  `AssetBus` 未定义——补正确 import 或修引用。
- F402：`field` 被 loop var 遮蔽。
- F401 unused-import（~74 个）：`ruff check --fix` 自动清；清完必须跑 fast 层测试确认没删掉
  有副作用的导入。
- **跳过基线 dirty 文件里的所有 error**（runner_hooks.py / p11b 等），在摘要里列出跳过明细。
- 完成标准：`ruff check skills/kais-movie-pipeline/pipeline plugins --select E9,F63,F7,F82,F4`
  除 dirty 文件外 = 0。

**K2 test_structured_output.py 自执行治理**：模块级跑测试+sys.exit 打爆 pytest 收集。
转成规范 pytest 用例或移到 scripts/ 加 `if __name__=='__main__'` guard。
注意 `tests/test_v50_regression.py` 断言套件规模基线——收集数变化须同步更新并注明原因。
若 `tests/test_feedback_translator.py` 的 sys.path hack 影响任意 CWD 收集，最小修复：
conftest 里把仓根插到 sys.path 最前（不改该文件本身）。
完成标准：`python3 -m pytest tests --collect-only -q` 在 skills/kais-movie-pipeline 下 exit 0。

**K3 pre-commit 激活+扩展**：`.pre-commit-config.yaml` 已存在（manifest 三件套 hook）。
① `~/.local/bin/pre-commit install`；② 追加两个 local hook：ruff bug 类
（`--select E9,F63,F7,F82,F4`，entry 用绝对路径 `/home/kai/.local/bin/ruff`）、AST 全量语法检查
（`python3 -m compileall -q` pipeline+plugins）。完成标准：`pre-commit run --all-files` exit 0。

**K4 pre-push 门**：新增 `scripts/pre-push-gates.sh`（bash，set -euo pipefail）：
trufflehog3 扫 staged diff（`git diff --cached`，排除 *.lock/*.svg/*.png）→ ruff bug 类 →
compileall → manifest 三件套 pytest。装到 `.git/hooks/pre-push`（chmod +x）。
本机已有 `/home/kai/.local/bin/trufflehog3`。完成标准：手动执行脚本 exit 0。

**K5 p11c 真红（条件项）**：`TestP11cVideoQc::test_ensure_llm_kap_allocate_fallback`
挂于 tests/test_p11c_video_qc.py:362。但实现文件 p11c_video_qc.py 正被并行会话编辑——
**开工时它仍在 git status dirty 里就整项跳过**（摘要注明），只有已 commit 才允许修：
先根因分析（mock 期望 vs ensure_llm 实现），优先修实现让测试过；确属测试过时才改测试并说明。

**K6 小项**：`.coverage` 加入 .gitignore。

## KAP 修复项（独立 commit）

**P1 新增 `.github/workflows/ci.yml`**：触发 push master + PR master + workflow_dispatch。
单 job 步骤：checkout → setup-node 24（cache npm）→ `npm ci` → `npx tsc --noEmit` →
esbuild 构建校验（跑 build:server 同款打包但输出到 /tmp 或构建后删产物，不得污染 checkout；
本机实测 `npm run build:server` 现在 EXIT=0 可直接用，产物 data/serve/app.js 在 .gitignore 与否自行确认）
→ src 单测：`node --import tsx --test src/**/*.test.ts`（现有 7 个 node:test 文件，先本机跑通拿到真实命令形态）
→ `npm run verify:schema-drift && npm run verify:manifest-contract && npm run verify:phase-65`。
**每个命令先本机 dry-run 实测再写进 yml**，写不进 yml 的（如依赖本机路径）换成等价 CI 形态。

**P2 debug.yml 触发修正**：push branches [main,dev] → [master]，PR/master/手动保留原样。
只改 on: 块，别动 job 内容。

**P3 密扫接入 pre-push**：给 KAP 也装 scripts/pre-push-gates.sh + .git/hooks/pre-push：
trufflehog3 staged 扫描（排除 node_modules/、.venvs/、docker/hermes-agent/_hermes_source/、
data/web/、*.png/*.jpg）→ `npx tsc --noEmit` → esbuild 校验。报告 A3 节有 baseline 说明。

## 验证与收口

- KMC 收尾跑一次全量（双 ignore 不再需要 structured_output 的那个）：
  `cd skills/kais-movie-pipeline && python3 -m pytest tests -q -p no:cacheprovider`，
  记录 pass/fail 数与 K5 处置结果。p11b 相关既有测试必须仍绿（对照改动前基线）。
- KAP 收尾本地依次执行 ci.yml 的每一步确认全绿。
- 每仓 commit 拆分清晰（K1/K2/K3/K4/K5/K6 各一个，KAP P1/P2/P3 各一个）。
- stdout 最后打 `PHASE0_DONE` + 逐项摘要（做了什么/跳过什么/验证输出关键行）。
