# R1.1 任务报告

## 任务回链

- MDTODO：R1.1。
- Target：NC01。
- targetWorkspace：`/root/.worktrees/unidesk/selfmedia-repo-github-authority`。
- repository：`pikasTech/unidesk`。
- ref：`docs/selfmedia-bootstrap-evidence`。

## Primary Workspace 轻量准备

- 仅加载并遵循任务要求的受控 resource bundle、工具与 skill。
- 未在 runner primary workspace 读取、修改或验证目标源码。
- 未把 runner 本地结果作为 Target 原入口证据。

## Target 实现

- 在 `config/platform-infra/gitea.yaml` 为 `selfmedia-nc01` 声明 repository credential override。
- 独立 `sourceRef` 为 `/root/.unidesk/.env` 根下的 `pikainc-selfmedia-gh-token.txt`。
- 独立 Secret key 为 `github-token-pikainc-selfmedia`，未修改全局 `gh_token.txt` 权限或内容。
- YAML 声明最小权限：Contents Read、Metadata Read、Webhooks Read/Write。
- 配置 parser 与 validator 支持通用 repository override，并校验 Secret key 唯一性、环境变量归一化碰撞、目标 namespace、bridge Secret 归属和必需能力。
- Secret 渲染支持多个 GitHub token key；token 仅通过环境变量进入受控执行，不进入 YAML、Git、日志或报告。
- bridge、candidate、受控 fetch、GitHub head、hooks list/status 和 hook reconciler 均按 repository 选择 credential。
- bridge/candidate 只注入所属 Target 仓库 token；hook owner reconciler 额外注入所有声明 `github-hooks-*` 的 override；JD01 不依赖 NC01 selfmedia token。
- CLI credential 摘要对 override 仅披露 `sourceRef`、`present`、`requiredKeysPresent`、`fingerprint`、`permissionResult`、有界错误与 `valuesPrinted=false`。

## Target 原入口证据

- 已通过 `trans NC01:/root/.worktrees/unidesk/selfmedia-repo-github-authority` 执行全部源码、Git 和验证操作。
- `bun test scripts/src/platform-infra-gitea-config.test.ts scripts/src/platform-infra-gitea-disclosure.test.ts`：11 项通过，0 项失败。
- `bun scripts/cli.ts platform-infra gitea plan --target NC01`：policy 为 `ok`。
- `git diff --check`、Node 语法、Python `py_compile`、Shell `sh -n`：通过。
- `mirror bootstrap --target NC01 --repo selfmedia-nc01 --dry-run --full`：`OK=true`、`blockers=[]`；全局与 repository override 均只显示脱敏 presence/fingerprint，不显示 token。
- `mirror webhook status --target NC01 --repo selfmedia-nc01 --full`：可读取私有仓库 HEAD `6e6a95297c3c153ab269410a079a997adc345774`；当前 `hookReady=false`、`driftTypes=[desired-url-missing]`、有界错误为 `github-hook-missing`。
- 三个 missing-credential 回归改用 synthetic blocker 输入，不再 spawn 宿主 CLI、不读取 sourceRef、不接触或打印 token；compact/full 合同仍覆盖。
- `mirror bootstrap --target JD01 --dry-run`：`OK=true`，证明 JD01 不依赖 NC01 override。
- 专用凭据只读状态：`sourceRef=pikainc-selfmedia-gh-token.txt`、`presence=true`、`mode=600`、`fingerprint=sha256:5eed1c04a44ac5e4`、`valuesPrinted=false`。
- 受控 status 已验证私有 HEAD 与 hooks list 可读，但未创建 hook；不得把可读性推断为超出 YAML 声明的额外权限，也不得披露 token 值。

## 并行保护

- 已两次按 `stash -u`、`fetch`、`rebase origin/master`、`stash apply` 安全吸收主线。
- 最终吸收 `origin/master@3aaa2616`。
- R1.2 保持 `[completed]`，`R1.2_Task_Report.md` 保留。

## 本轮 bootstrap Secret 物化修复

- PR #1926 合并后的只读运行面证据显示，candidate Pod 因 `devops-infra/gitea-github-sync-secrets` 缺少 `github-token-pikainc-selfmedia` 而失败；live Secret 脱敏 key 列表只有全局 `github-token`、Gitea 管理员与 webhook secret。
- 旧 Deployment/reconciler 仅引用全局 `github-token`；candidate desired manifest 已引用 repository key，因此故障发生在 YAML credential 选择之后、Secret 物化之前。
- 根因确认：`run_mirror_bootstrap()` 读取 repository token 并创建 Gitea repo，但从未执行 `run_apply()` 内的 webhook Secret upsert。此前“bootstrap 已写入 key”的现场假设不成立。
- 修复将 Secret upsert 抽为 `upsert_webhook_sync_secret()`，由 `run_apply()` 与 `run_mirror_bootstrap()` 复用。bootstrap 在任何 Gitea admin/repository mutation 前物化完整 Target/owner YAML credential key 集合；失败时显式 `return 1`，`apiBootstrap.skipped=true`、`valuesPrinted=false`。
- bootstrap 的 Secret key map 由本次实际加载的 `githubTokens` keys 生成，selfmedia override 不回落或合并到全局 token，也不会删除同 Target/owner 的其他 YAML repository keys。Secret 值未进入 GitOps、Git、日志或报告。
- 行为测试使用 fixture token 模拟全部 key 与 Secret apply 失败，不读取宿主 sourceRef；断言两个 GitHub key 均物化、失败时不发生后续 Gitea mutation。
- 主代理按 `bun.lock` 执行 `bun install --frozen-lockfile`，未修改 package/lock；`sh -n`、`git diff --check` 与 payload/config/PaC bootstrap 三个测试文件共 14/14 通过。
- 受控 webhook status 已可读取 `pikainc/selfmedia` master HEAD `6e6a95297c3c153ab269410a079a997adc345774`，先前 `github-api-get-404` 已消失；生产 Hook 尚未创建，R1.1 继续保持 `in_progress`。

## 首次受控 PaC bootstrap 交付证据

- PR #1929 已合并，merge commit 为 `d6deaabf`。
- 首次受控 PaC bootstrap 的 dry-run 与 confirm 均成功。
- NC01 live Secret 已新增 `github-token-pikainc-selfmedia`。
- NC01 原有 `gitea-password`、`gitea-username`、`github-token`、`github-webhook-secret` 四个 key 的 fingerprint 前后完全不变，且 `valuesPrinted=false`。
- JD01 仍仅有全局 `github-token`，不存在 selfmedia key。
- 旧 GitOps revision `49e7425b` 的 PreSync Job 创建于 bootstrap 前，已重试 5 次并失败，不能作为本次 bootstrap 后交付证据。
- 本次后续交付必须通过正常 source PR 生成新 revision；禁止手工 Argo、PipelineRun、source sync 或 rollout。
- R1.1 保持 `in_progress`。

## 未执行事项

- 未创建假 token，未复制 SSH 私钥，未修改仓库可见性。
- 未手工 apply、Secret sync、PipelineRun、Argo sync/refresh、rollout 或 cutover。
- 本轮仅追加既有受控 bootstrap 与运行面脱敏证据，不执行部署。

## Git 与 PR 交付

- 源码提交：`89b618de`。
- bounded status 修复：`21aed20f`。
- compact blocker renderer 修复：`a539a4ff`。
- 中文 PR：`pikasTech/unidesk#1926`。
- bootstrap Secret 物化修复 PR：`pikasTech/unidesk#1929`，已合并为 `d6deaabf`。
- 本轮仅文档 PR 不自行合并。

## 当前结论

- R1.1 配置、schema、renderer、Secret、bridge、observer 与受控 fetch 的源码能力已落地。
- 首次受控 PaC bootstrap dry-run 与 confirm 均成功，NC01 repository-scoped Secret key 已物化，原有四个 key fingerprint 保持不变且未打印值。
- JD01 未引入 selfmedia key，保持仅使用全局 `github-token`。
- 旧 revision `49e7425b` 的失败 PreSync Job 早于 bootstrap，后续只允许正常 source PR 生成新 revision，禁止手工控制面操作。
- R1.1 继续保持 `in_progress`。

## 本轮 unidesk-gh 仓库级 authority

- `config/unidesk-cli.yaml#github.auth.repositoryOverrides` 新增通用 exact repository 列表结构，声明 `repository`、`root`、`sourceRef`、`sourceKey`、`format` 与 `priority`；代码未硬编码 `pikainc/selfmedia`。
- `pikainc/selfmedia` 精确命中 `pikainc-selfmedia-gh-token.txt`，未命中的 `pikasTech/unidesk`、`pikasTech/HWLAB` 与其他仓库继续使用全局 `gh_token.txt`。
- gh token resolver 以最终 repo 为输入；issue、PR、repo、auth、preflight 与 merge 路径统一选择，positional `owner/repo#number` 在解析完成后才读取凭据。
- `before-env` repository override 优先于全局 `GH_TOKEN` 与 `GITHUB_TOKEN`；未命中 override 时保留原全局 YAML、环境变量与 gh fallback 顺序。
- 输出仅披露 `scope`、`configRef`、`sourceRef`、`sourceKey`、presence、fingerprint 与 `valuesPrinted=false`；不再披露完整 source path，错误保持有界。
- `bun test scripts/src/gh-token-repository-override.test.ts`：3/3 通过，覆盖 selfmedia 独立 token、unidesk/其他仓库全局 token、before-env 与 positional final-repo 隔离。
- `bun test scripts/src/gh-token-repository-override.test.ts scripts/src/gh-default-render.test.ts`：10/10 通过；生产文件 `bun --check`、旧签名扫描与 `git diff --check` 通过。
- Target 原入口 `bun scripts/cli.ts gh auth status --repo pikainc/selfmedia`：`scope=repository-override`、`sourceRef=pikainc-selfmedia-gh-token.txt`、`presence=true`、独立 fingerprint、`valuesPrinted=false`，REST/repo/issue-read 均成功。
- Target 原入口 `bun scripts/cli.ts gh auth status --repo pikasTech/unidesk`：`scope=global`、`sourceRef=gh_token.txt`、`presence=true`、全局 fingerprint、`valuesPrinted=false`，REST/repo/issue-read 均成功。
- 两仓 fingerprint 不同，证明选择未串线；本轮未执行任何 GitHub issue/PR 写入、运行面操作、部署或合并。
- 本轮源码分支为 `feat/selfmedia-gh-token-authority`；R1.1 继续保持 `in_progress`。
