# R1.6.1.2 任务报告

## 阶段结论

PikaOA 生产附件离机备份已完成 owning YAML、受控 CLI、定向测试、最新 `origin/master` 合并和生产前置复核。NC01 生产 `pikaoa` namespace 与 `pikaoa-attachments` PVC 已就绪，但 YAML 声明的三项备份 Secret sourceRef 和 PK01 专用 SFTP 目录仍未就绪，因此真实首备与 restore smoke 未执行，保持具名 `prerequisite-waiting`，不冒充成功，也不阻塞 PikaOA、PaC 或 Argo。

## 变更

- `config/pikaoa.yaml`：声明 04:17 日常 Restic 备份、retention、只读附件 PVC、`.tmp` 排除、PK01 SFTP 目标、独立 check 与 forget/prune schedule、临时目录 restore smoke 和非阻塞策略。
- `config/secrets-distribution.yaml`：声明 Restic 密码 env 与 SSH 私钥、`known_hosts` 两个 raw-file 的 `sourceRef`、`sourceKey` 与 `targetKey`，禁止从运行面反解或手写 Secret。
- `scripts/src/pikaoa-attachments-backup.ts`：提供 `plan`、`status`、`init`、`apply`、`backup-now`、`restore-smoke`；`init` 通过独立短生命周期 Job 精确区分已初始化、仓库不存在和认证/网络失败，且不挂载生产 PVC；长 apply 使用异步 UniDesk job，手动备份和恢复提交 Kubernetes Job 后立即返回并通过 `status` 轮询。
- `scripts/src/pikaoa-test-target.ts`：把 `pikaoa attachments-backup` 接入现有 PikaOA CLI dispatcher。
- `scripts/src/help.ts`：让 `pikaoa --help` 同时披露 `test-target` 与 `attachments-backup`，并保留两个 scoped help 入口。
- `scripts/src/pikaoa-attachments-backup.test.ts`：覆盖独立 CronJob、只读 PVC、`.tmp` 排除、retention、Secret 不泄露、init 必须 confirm、init 已存在 no-op/精确 fresh init 语义与临时 `emptyDir` restore smoke。

## 验证

- `bun test ./scripts/src/pikaoa-attachments-backup.test.ts`：3 pass，0 fail，覆盖备份、init 与 restore smoke 安全边界。
- `pikaoa attachments-backup plan --target NC01 --output json`：`ok=true`、`mode=local-render`、4 个对象、schedule 为 04:17、晚于数据库 03:37、`valuesPrinted=false`。
- `pikaoa --help` 与 `pikaoa attachments-backup --help`：根帮助和 scoped help 均可见附件备份入口。
- `pikaoa attachments-backup status --target NC01 --output json`：真实只读观察确认 namespace/PVC 为 `true`，Secret/SFTP 目录为 `false`，等待项为 `yaml-first-secret-sync` 与 `pk01-sftp-directory`。
- `secrets plan --config config/secrets-distribution.yaml --target pikaoa-nc01`：`valuesPrinted=false`，缺失 `RESTIC_PASSWORD`、SFTP 私钥与 `known_hosts` 三项 sourceRef，不从运行面反解。
- `pikaoa attachments-backup apply --target NC01 --confirm --output json`：返回 `mode=prerequisite-waiting`、`mutation=false`、`businessBlocking=false`，未创建 CronJob/Job。
- `git diff --check` 通过。

## 真实备份与恢复结果

- 首备：未执行；具名 blocker 为 `yaml-first-secret-sync` 与 `pk01-sftp-directory`。
- restore smoke：未执行；在 repository 前置未就绪时禁止提交伪恢复 Job。
- PK01：本轮只读，未创建目录、用户或凭据，未修改其他备份 consumer。

## 后续原入口

由凭据与 PK01 目录 authority 补齐 YAML sourceRef 和最小权限 SFTP 目录后，主代理按顺序执行：

1. `bun scripts/cli.ts secrets sync --config config/secrets-distribution.yaml --target pikaoa-nc01 --confirm`
2. `bun scripts/cli.ts pikaoa attachments-backup status --target NC01`
3. `bun scripts/cli.ts pikaoa attachments-backup init --target NC01 --confirm`
4. `bun scripts/cli.ts pikaoa attachments-backup apply --target NC01 --confirm`
5. `bun scripts/cli.ts pikaoa attachments-backup backup-now --target NC01 --confirm`
6. `bun scripts/cli.ts pikaoa attachments-backup restore-smoke --target NC01 --confirm`

`init`、`backup-now` 与 `restore-smoke` 提交后均使用 `bun scripts/cli.ts pikaoa attachments-backup status --target NC01` 轮询，不改变上述主流程顺序。

只有首备 snapshot 摘要与临时目录 restore smoke 成功后，才可把 MDTODO R1.6.1.2 从 `in_progress` 更新为 `completed`。
