# 项目执行摘要

> 更新时间：2026-08-30。项目已完成P0并阶段性归档；腾讯云CVM、云硬盘及相关计费资源已经释放，原k3s/BuildKit/sandbox当前不在线。本文中的集群状态、命令和资源规格均为历史验收记录或未来重建参考，不再代表可直接运行的环境。

## 1. 阶段结果

项目已完成从阿里云ACR到腾讯云TCR个人版的主仓切换，并将任务镜像布局优化为80个分片仓库。历史CVM曾使用batch 40、concurrency 10批量执行NOP/Oracle；Oracle选批从简单顺序遍历改为按split缺口和仓库覆盖的确定性轮询。停止条件从“accepted达到500”改为 `freeze_ready=true`，同时要求train/validation/test数量和至少70个仓库覆盖达标。该CVM及其云盘现已释放。

PPO已完成第二轮40K、900秒、并发8的20-step model-only warm-start：160个episode无error、12个timeout、32个成功，actor LoRA为177.5MiB，critic BF16模型为14.11GiB。前10步成功率22.5%，后10步17.5%；Pygments单题贡献一半成功，critic explained variance最终仍约为-1.689，因此只通过工程稳定性门禁，没有通过能力提升门禁。历史40K/32K评测曾显示parent step20点估计高于SFT，但统一64K P0已经消除协议差异：SFT run `p0-klear64k-sft-20260828T145119Z`与parent run `p0-klear64k-parent-20260828T160138Z`在test38均为6/38（15.79%），在Verified27按全部attempt均为9/27（33.33%）。test38配对为3胜32平3负，Verified27 benchmark为2胜23平2负，两个面板delta均为0、exact McNemar p均为1.0。parent在两个面板分别增加约47.7%/46.8%的平均input tokens、19.2%/27.0%的平均agent steps，运行时间约为SFT的2.33/2.24倍，却没有增加成功数。P0结论是没有稳定的总体PPO增益，停止追加训练；Sphinx 8621的单Pod 8Gi OOM仅作为基础设施异常保留，不再为此恢复整套云环境。

## 2. 最终归档状态

- 正式训练数据：`swesmith-curated-grpo-267-v1`，train/validation/test为187/42/38。
- 最终主要候选：原始`Klear-AgentForge-8B-SFT`与父checkpoint `20260820T154406Z/global_step_20`。
- 当前决策：不追加PPO step，不用训练reward、VF loss或critic explained variance替代held-out能力评测。
- 当前基础设施：腾讯云CVM、CBS和相关计费资源已释放；k3s、BuildKit、PVC、sandbox与verifier均不在线。
- 若未来恢复：必须按`PROJECT_LAYERED_ARCHITECTURE.md`和各setup/runbook重新创建运行面，不能沿用旧EIP、KubeConfig、PVC或端口转发。

## 3. ACR→TCR迁移（历史记录）

当前主仓：

```text
ccr.ccs.tencentyun.com/harbor-qwen-grpo-tcr
```

已完成：

- TCR命名空间、infra/基础镜像仓库和80个 `task-00` 到 `task-79` 仓库初始化。
- CVM `skopeo` authfile同时保存ACR源端和TCR目标端登录，权限600。
- `registry-migrate-linux` 迁移BuildKit、curl、uv共3个infra镜像，并逐一校验源/目标digest。
- 84个可用SWE-Smith基础镜像迁入TCR；3个超限项保持skipped；pending为0。
- completed/skipped/rewrites镜像状态已从ACR前缀原子改写为TCR前缀。
- `dataset-images-plan` 重建映射后，coverage为84/84 available、0 missing、0 errors。
- k3s runtime/builder namespace的pull secret已更新为TCR凭证。

`registry-migrate-linux` 不迁移任务镜像。已accepted的历史任务镜像由 `registry-task-migrate` 按旧/新分片映射单独处理；本轮完成166个迁移目标。

## 4. TCR任务仓库布局和预热

当前布局：

```bash
ACK_TASK_IMAGE_LAYOUT=base-sharded-tags
ACK_TASK_IMAGE_SHARDS=80
ACK_TASK_IMAGE_BASE_SHARDS=5
ACK_TASK_IMAGE_REPOSITORY_PREFIX=task
TASK_REPOSITORY_MAX_TAGS=100
TASK_REPOSITORY_PREWARM_CONCURRENCY=5
```

优化点：

1. task ID确定任务tag，基础镜像digest确定主分片，task hash再在5条lane中选择具体仓库。
2. `registry-prewarm-plan` 在复制前同时投影任务tag和 `basecache-*` tag，任一仓库超过100标签即拒绝执行。
3. `registry-prewarm-linux` 把基础镜像层预先复制到后续会使用它的 `task-XX` 仓库，避免每个新任务首次push时重复上传大层。
4. `registry-prewarm-check` 要求每个 `basecache-*` 目标和基础镜像digest一致。

验收结果：357/357预热组合通过digest验证，单仓库最大投影标签数93/100。该优化解决了CVM资源空闲但环境创建长时间停留在大镜像跨仓库push的问题。

## 5. 批量Oracle

当前CVM运行参数：

```bash
CURATION_ORACLE_BATCH_SIZE=40
CURATION_ORACLE_CONCURRENCY=10
CURATION_ORACLE_MAX_RETRIES=2
CURATION_ORACLE_VERIFIER_TIMEOUT_SEC=180
CURATION_ORACLE_ENVIRONMENT_BUILD_TIMEOUT_MULTIPLIER=4
```

已实施的选批优化：

- 过滤已处理和基础镜像不可用任务。
- 先按repo分组，组内用seed + task ID做稳定排序。
- 优先选尚无accepted任务的repo，其次选当前split仍有缺口的repo，再考虑repo已accepted/已处理数。
- 按repo轮询抽取，一轮最多每个repo选一条，避免单一仓库垄断整批。
- NOP失败任务不进入Oracle阶段，其他任务继续执行，单条失败不阻断整批。

批量会话每批先执行 `dataset-freeze-check`；如果未达标则执行一批 `dataset-oracle`，如果已达标则输出 `BULK_ORACLE_FREEZE_READY` 并结束。这避免了固定批数和人工监控导致的过度执行。

## 6. 冻结检查和平衡选择

`make dataset-freeze-check` 使用与真实freeze相同的选择函数，但不写入冻结文件。`freeze_ready=true` 必须同时满足：

- train至少350条。
- validation至少75条。
- test至少75条。
- 整体至少覆盖70个repository。
- 单一repository不超过 `max_per_repo=20`。
- split之间保持repository隔离，且各split按目标数比例分配最小repository数。

因此 `oracle_accepted>=500` 只是必要但不充分条件。本轮在accepted超过500后仍继续Oracle，原因是早期任务按名称集中在少量repo，split容量与repo覆盖尚未同时达标。

## 7. Verifier超时解耦

Oracle和训练的verifier超时使用不同配置：

| 阶段           | 配置                                         | 当前效果                           |
| ------------ | ------------------------------------------ | ------------------------------ |
| NOP/Oracle   | `CURATION_ORACLE_VERIFIER_TIMEOUT_SEC=180` | Harbor job CLI绝对180秒上限         |
| GRPO rollout | `TRAIN_VERIFIER_TIMEOUT_MULTIPLIER=0.06`   | SWE-Smith原始3000秒 × 0.06 = 180秒 |

`scripts/50_train_grpo.sh` 通过Hydra参数 `rllm.remote_runtime.harbor.verifier_timeout_multiplier` 将训练倍率传入runtime。Oracle参数的变化不会隐式改变GRPO，反之亦然。

## 8. BuildKit隧道故障与Oracle状态恢复

CVM重启后，k3s中的BuildKit Deployment、Pod和PVC会恢复，但CVM本机的 `kubectl port-forward` 不会自动重建。本轮故障的决定性错误是：

```text
dial tcp 127.0.0.1:1234: connect: connection refused
```

该错误发生在环境镜像构建阶段，所以尚未创建sandbox Pod。界面中的 `starting environment`、`Failed to download logs`和低资源使用率均是这一失败的表象，不是CPU/内存瓶颈。

恢复操作：

1. 停止 `dataset-oracle-bulk`，防止继续将可用候选记为失败。
2. 重建 `buildkit-tunnel`，并运行 `make buildkit-status` 和 `make buildkit-smoke`。
3. 根据job结果、`exception.txt` 和batch manifest确定受影响的task ID。
4. 备份持久状态，仅恢复已证实由该故障造成的task ID，然后重建Oracle summary。
5. 验证计数，重启bulk，观察首批Pod和异常数。

本轮恢复了batch `a8b550d0beb5` 和 `9b345ea2a202` 共80条错误拒绝记录；`fbaaf8c33f88` 在ingest前已停止。恢复后状态为 `oracle_total=1160`、`oracle_accepted=813`，备份和审计清单位于：

```text
oracle/recovery/20260811-buildkit-tunnel-loss/
```

不能按 `RuntimeError` 类型全局删除：事故前已存在其他真实RuntimeError，恢复必须以精确batch/task ID为边界。

## 9. 2026-08-11历史状态与后续进展

2026-08-11最终Oracle与冻结结果：

```text
static_total=3000
static_accepted=2614
oracle_total=1440
oracle_accepted=981
base_images_pending=0
base_images_completed=84
base_images_skipped=3

train=350/350
validation=75/75
test=75/75
repositories=77/70
freeze_ready=true
```

Oracle bulk已输出 `BULK_ORACLE_FREEZE_READY` 并停止。旧217条短缺冻结集已移动到版本目录外的可恢复归档；正式500条冻结集已在AutoDL导入并注册。split manifest内嵌语义摘要为 `8e29a24910b727e72b63fed539cb834fda47994b8d963c2e002ffa8deb23e654`，JSON文件SHA-256为 `0e23cbcf8c7a1d0eba498a867898514344f2a1e8826130cf0937691dc36077e5`，导出包SHA-256为 `8ce630ad5850c1b0456802cb26230257bb7a0b4ca76be50b643534c3248ced05`。后续进展与顺序：

1. Klear-AgentForge-8B-SFT + mini-swe-agent-plus validation Canary已10/10无异常，平均reward为0.1。
2. 单卡GRPO smoke已完成4/4 rollout、backward、optimizer step、权重同步和global step 1；`TRAIN_GPU_MEMORY_UTILIZATION=0.35`解决了backward OOM。
3. 该批reward、advantage和grad norm均为0，因此只完成链路验收，没有有效学习信号。
4. 原始双卡collective确认当前AutoDL的NCCL Direct P2P/CUMEM路径死锁；`NCCL_P2P_DISABLE=1` 后，两卡FSDP2与两卡FSDP1完整GRPO均通过。
5. 严格A/B确认rank 32在默认 `dummy_dtensor` 路径首轮即生成2048-token乱码并超时；改用 `safetensors` 后恢复合法Bash动作、无timeout且rollout/actor相关性0.999536。
6. runtime schema v3已完成空轨迹守卫、官方公开profile兼容、`working_dir`注入和64K live gate；固定Verified 27题的恢复口径为10/27 = 37.04%，详见第9节。
7. SWE-Smith RL重叠集固定30题仅27题正常评分，reward 1/0为2/25，scoreable-only `pass@1=7.41%`；其余2题OOM、1题ACK label 422。该结果未达到进入8题train smoke筛选的前提，按当前决策不重跑。
8. Klear公开66K SWE-Smith数据是SFT消息轨迹集，固定revision共65,994行且仅有`instance_id`、`messages`字段。论文未披露这些SWE轨迹的生成模型；“强教师模型至少成功一次”是另行描述的RL任务筛选条件。公开轨迹中的提交标记、自测结果和本项目的`klear_trajectory_count`都不能作为官方verifier成功数或reward 1标签。
9. 固定公开强模型证据与当前数据取交集后得到487题`filter-pro`；再与正式冻结500题和completed镜像取交集得到125题`freeze-pro`，其中train/validation/test为90/18/17。跨官方Claude/GPT与SWE-Master两个数据源成功的任务为8题，Claude 3.5成功任务为7题，GPT-4o成功任务交集为0。当前只完成数据派生，尚未从中选择下一轮Canary或训练任务。

## 10. SWE-bench Verified 27题能力Canary

2026-08-14固定27题诊断子集已完成首轮能力验证。该集合来自
SWE-bench Verified，由30题分层/仓库限额清单中镜像已完成的27题派生；3个超限镜像未纳入。

原offline-v2作业：

```text
job=state/harbor-jobs/2026-08-14__14-03-48
requested=27
normally_scored=25
exceptions=2
reward_1=10
reward_0=15
reported_mean=0.370
```

两个异常均为verifier基础设施问题，而非已判定的模型成功：

- `pallets__flask-5014`：原作业 `VerifierTimeoutError` 3000秒；offline-v3复测作业
  `2026-08-14__15-38-50` 为 `Exceptions=0, reward=0`，总耗时11分55秒。
- `sphinx-doc__sphinx-8621`：原作业 `DownloadVerifierDirError`；offline-v3复测作业
  `2026-08-14__15-40-10` 为 `Exceptions=0, reward=0`，总耗时2分40秒。

恢复口径下的校正结果为10成功、17失败，即 `10/27 = 37.04%`，与论文对同名SFT
checkpoint报告的38.2%相差1.16个百分点。这证明当前模型、64K服务、Plus Agent、sandbox和
SWE-bench verifier链路具有与论文数值一致的小样本能力表现。但该数字是“原批次 +
两个异常恢复作业”的合并口径，不得写成单一 `27 Trials / 0 Exceptions`作业；27题也不是
Verified 500的无偏抽样，不得写成完整榜单复现。

offline-v3通过预构建Python/SWE-bench评分环境、移除 `make_test_spec(datum)`引发的
GitHub访问，并为parser设置60秒硬超时。项目内存转换已对27/27个脚本完成编译校验，
全部103项本地测试通过。若需单一可归档证据，下一步在offline-v3下重跑完整27题，验收
`27 Trials / 0 Exceptions`。

## 11. SWE-Smith RL重叠集30题Canary

2026-08-14从Klear相关的166题候选中固定筛选30个train任务进行诊断。计划并发为4，但运行前临时导出的`CANARY_CONCURRENCY=10`覆盖了计划值。结果如下：

```text
job=state/harbor-jobs/2026-08-14__18-29-51
requested=30
normally_scored=27
reward_1=2
reward_0=25
scoreable_only_pass_at_1=2/27=7.41%
agent_oomkilled=2
kubernetes_label_422=1
job_finished_at=null
```

两题agent主容器在8GiB Pod内存上限内因OOMKilled以137退出，Harbor随后进入artifact/verifier阶段，造成界面长时间停留在“running verifier”；另1题因自动生成的label为66字节，超过Kubernetes的63字节上限而无法创建Pod。终端显示30/30后人工中断了未正常结束的job收尾，因此不能把该批写成`2/30`的完整无异常结果。

决策是使用27题正常评分口径判断模型在该候选集上的pass@1明显偏低，不再为3个基础设施异常重跑Canary，也不从这30题继续选8题进入train smoke。保留的代码修复是：ACK的session/environment自动label统一经过确定性63字符净化；`make canary`默认拒绝超过4的并发，只有Verified专用Make目标显式把硬上限提高到10。并发保护用于避免再次误设并发，不等价于两个单Pod OOM已经修复；由于本轮停止且缺少节点容量证据，不提高默认Pod内存。

数据调研同时确认：公开的
`Kwai-Klear/SWE-smith-mini_swe_agent_plus-trajectories-66k`是SFT数据而非公开RL数据；固定
revision含65,994行，schema只有`instance_id`和`messages`。SWE轨迹生成模型未公开，论文中的
“强教师模型”只用于RL任务筛选且身份、任务ID和保留数量均未披露。当前166题清单里的
`klear_trajectory_count`只表示同一任务在公开集中的轨迹行数，不表示成功轨迹数；提交命令、
模型自测或shell返回码也不能替代独立官方verifier结果。

## 12. 强模型验证交集数据

固定revision和逐任务证据边界详见`output/docs/SWESMITH_STRONG_MODEL_FILTER.md`。派生定义如下：

```text
filter-pro = 2614题静态通过集 ∩ verified_any = 487题
freeze-pro = filter-pro ∩ 正式冻结500题 ∩ completed镜像 = 125题
freeze-pro split = train 90 / validation 18 / test 17
```

`verified_any`允许官方Claude/GPT轨迹或SWE-Master教师池任一来源成功；`verified_cross_source`要求两个来源都成功。SWE-Master没有逐任务披露MiniMax-M2与GLM-4.6的单独归属，因此跨源任务不能写成五个指定模型全部成功。两个JSON清单位于`state/swesmith-pro/`；执行`make swesmith-pro-derive`可从固定上游revision重建，不会运行Canary。

## 13. 最小运维命令（历史）

```bash
tmux ls
tmux capture-pane -pt buildkit-tunnel:0.0 -S -30
tmux capture-pane -pt dataset-oracle-bulk:0.0 -S -100

make buildkit-status
make dataset-status
make dataset-freeze-check

KUBECONFIG="$HOME/.kube/harbor-curation.yaml" \
  kubectl get pods -n harbor-qwen-grpo -o wide
```

Oracle已结束，不应继续追加批次。后续只需保留BuildKit tunnel用于Canary/GRPO，并以manifest内嵌语义摘要、manifest JSON文件SHA-256和导出包SHA-256作为数据交接依据。

## 14. 2026-08-17历史freeze、Canary与PPO计划

```text
dataset=swesmith-curated-grpo-267-v1
train=187
validation=42
test=38
repositories=89
task_images_verified=267/267
base_images_available=103
base_images_skipped=2
split_manifest_semantic_sha256=ae5df9a3f4a3fc8af44fac420b36529e283839e1bd3de9daba65d5bcda51447d
```

`Klear-AgentForge-8B-SFT`已在该数据集validation按seed `20260817`抽取30题完成64K Canary：reward 1/0为12/18、Mean 0.400、Exceptions 0、耗时32m46s，作业目录为`state/harbor-jobs/2026-08-17__16-14-11`。该结果与旧32K固定57题不是同一题集，不合并排名。

本节以下内容保留当时的实施顺序，不代表当前状态。其后的PPO已改为4卡trainer加1卡单vLLM分离拓扑，完成两轮各20步及三模型能力评测；最终结论与归档状态以本文第1、2节及[`PPO_TRAINING_RUNBOOK.md`](PPO_TRAINING_RUNBOOK.md)为准。
