# R1.2.1 任务报告

## 结论

已为 NC01 `devops-infra` 增加 YAML-first Kubernetes 历史对象留存。手动 `retention plan|run|status` 与 systemd policy timer 复用 `scripts/src/gc-remote-kubernetes-retention.py` 的同一个 fail-closed 筛选器；只删除终态、超过保留窗口、分组可识别且不属于每组最新保留数量的 PipelineRun，通过 Background ownerRef 级联回收下游对象。

## 配置与保护

- 配置真相：`config/unidesk-cli.yaml#gc.remote.targets.NC01.kubernetesObjectRetention` 与 `.policyTimer`。
- 手动单批上限 500，自动单批上限 100，自动周期每 15 分钟。
- 固定保护活跃、排队、过新、未知分组、时间不可解析、扫描截断和 Table 形状漂移对象。
- 不直接删除 TaskRun、Pod、Secret、Event、PVC/PV 或 runtime workload。
- NC01 policy 仅启用 `kubernetes-object-retention`，journal、tmp、cache、image 和 PVC 阶段全部关闭。

## 真实运行证据

- 初始 `devops-infra`：PipelineRun 1923、TaskRun 1922、Pod 932、Secret 1613。
- 三个异步 job 分别成功删除 500、500、484 个 PipelineRun，全部批次成功。
- 终态 overview：PipelineRun 451、TaskRun 450、Pod 444、Secret 455；剩余对象主要为活跃、24 小时内对象和每组最新保留对象。
- timer `unidesk-devops-infra-retention.timer` 已 `loaded/active/waiting`，配置、runner 和状态文件均由 YAML 渲染。
- 首次自动轮次 `failedCount=0`，只由 retention 阶段回收 6 个到龄 PipelineRun，下一轮已自动排期。
- Python `py_compile`、`git diff --check` 与 `bun scripts/cli.ts check --syntax-only` 通过；未运行 Vitest。

## 内存判定

- `memory-distribution` 只以 `/proc/meminfo` 的 `MemAvailable` 判定，swap 单独披露。
- 清理后 `MemAvailable` 约 2.8 GiB，距离 4 GiB 仍差约 1.25 GiB；WebProbe 不具备启动资格，未启动 Chromium。
- 剩余压力主要来自 k3s 常驻 PSS、Kafka/Tempo/Tekton 控制面和 Decision Center zombie；不得继续扩大为 raw delete、k3s 重启或无证据 reclaim。
