# R5.10 P0 事故复盘

## 结论

本次事故不是生产 lane writer 修改开发环境，也不是数据库迁移依赖。真正根因是一个此前被 admission 阻塞的旧 AgentRun PaC PipelineRun，在较新 `b258520` 已成功发布后才开始执行，并以较新的 GitOps commit 为父提交，把 `sourceCommit` 逆序写回旧值 `0ca2c73`。Argo 正常同步了错误 desired，manager 因此重新加载旧 `sub2api` Artificer AipodSpec，新任务在 admission 阶段失败。

## 影响

- NC01/nc01-v02 manager desired 与源码 `v0.2` 分叉。
- Artificer 从 `gpt-pika/grok` 回退到已删除的 `sub2api` provider。
- HWLAB 公网入口修复无法派单，主线被 CI/CD 运行面故障阻塞。
- 两个重复的生产 lane writer 被停止；后续证据确认它们不是 `bc12e93` 的作者。

## 时间线

- 较新 PipelineRun `agentrun-nc01-v02-ci-b258520...` 成功，生成 GitOps `dba70ac`。
- 旧 `agentrun-nc01-v02-ci-0ca2...` 在 admission 解除后延迟启动，生成父提交为 `dba70ac` 的 `bc12e93`，但把 sourceCommit 写回 `0ca2c73`。
- PR [UniDesk #2157](https://github.com/pikasTech/unidesk/pull/2157) 与 [AgentRun #364](https://github.com/pikasTech/agentrun/pull/364) 加入 stale/divergent/unverifiable revision 成功 no-op 逻辑。
- #364 的自动 PipelineRun 在 `place-scripts` init 阶段失败；共享 schema validator 与 Ajv 被明文嵌入，单步脚本约 172 KiB，init container 退出 255。
- PR [UniDesk #2160](https://github.com/pikasTech/unidesk/pull/2160) 将内嵌载荷改为 renderer 侧 gzip/base64，脚本降至 79,395 bytes；[AgentRun #365](https://github.com/pikasTech/agentrun/pull/365) 更新 repo-owned source artifact。
- #365 merge 自动产生 PipelineRun `agentrun-nc01-v02-ci-5d7ede...`，成功生成 GitOps `56b5f3ed...` 并滚动 manager。

## 根因与促成因素

- promotion 缺少 incoming revision 相对 source branch 与当前 GitOps desired 的 ancestry/新旧判定，旧任务可以覆盖新 desired。
- admission 阻塞把旧任务延迟到新任务之后执行，暴露了 PipelineRun 完成顺序不等于 source revision 顺序。
- schema warning-only 实现把完整依赖明文嵌入 Tekton step，缺少对 place-scripts 载荷尺寸的运行面约束验证。
- PaC `status/history/debug-step` 间歇性空 stdout，增加了定位成本；该可见性缺口由 [UniDesk #2165](https://github.com/pikasTech/unidesk/issues/2165) 独立跟踪，不改变交付 authority。

## 修复

- incoming revision 已过期、分叉或相对当前 desired 无法验证时，PipelineRun 保持成功终态、输出 `blocking=false` warning，并保留现有 GitOps commit。
- ancestry 判断只使用 source clone 已有 refs 与当前 GitOps `source.json`，不增加第二 authority 或额外网络 fetch。
- validator/Ajv 由 renderer 预压缩，运行时解压到有界临时文件；schema 与 OTel 失败仍只产生 warning，业务发布继续。
- 全部恢复只由正常 PR merge 的 GitHub webhook -> Gitea -> PaC -> Tekton -> GitOps/Argo 自动链完成；未执行人工 PipelineRun、mirror sync、Argo sync、runtime patch 或数据库操作。

## 验证

- schema stage 定向 Bun 测试：5 pass，0 fail；未运行 Vitest。
- AgentRun source artifact：aligned=true、provenance=true；生成 YAML 可解析，`gitops-promote` 脚本 `sh -n` 通过。
- 自动 PipelineRun `agentrun-nc01-v02-ci-5d7ede...`：Succeeded。
- GitOps commit：`56b5f3ed00f28b04e47f2e9baf3792d745d2a375`。
- manager Deployment `AGENTRUN_SOURCE_COMMIT=5d7ede07543d6f8d9924ce9853420a4c6051eabd`，新 Pod ready。
- `agentrun describe aipodspec/Artificer`：lane=`v0.2`、profile=`gpt-pika`、provider=`NC01`、model=`gpt-5.6-sol`，provider SecretRefs 为 `gpt-pika` 与 `grok`，旧 `sub2api` 已消失。

## 长期判定

- PipelineRun 的 source revision 决定新旧，排队与完成时间不能成为 desired authority。
- runtime patch 可按 `$unidesk-daddev` P2 用于调试或临时恢复，但不能冒充终态；本事故未使用 patch，终态已由正常自动链收敛。
- CI/CD 校验继续 warning-only，不得因 schema/OTel 漂移关闭功能或阻塞滚动。
