> ## Documentation Index
> Fetch the complete documentation index at: https://starforge.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# E2E 闭环测试

> 无 GPU 环境跑通「提交 → 调度 → 容器训练 → 回传」全链路

闭环测试：真的 `sf submit` → console 装配和调度 → 容器里真的训练 → 指标/日志/产物 ingest → `SUCCEEDED` → 断言。物理挂卡是仿真的，其余没有 mock。上线前、升级后、改执行器后跑一遍。

## 本地跑（macOS/OrbStack 或任何 Docker 机器）

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
# local 执行器：模拟训练负载（约 10 秒）
uv run python scripts/e2e/local_loop.py

# local 执行器：真实 TRL SFT（CPU tiny 模型真训练）
uv run python scripts/e2e/local_loop.py --flavor sft

# kuberay 执行器：kind 集群 + operator + MinIO 分发（约 40 秒）
bash scripts/e2e/setup-kind.sh
uv run python scripts/e2e/kuberay_loop.py
```

失败时自动倾倒容器日志 / K8s 事件 / 平台侧日志；`--keep` 保留现场。Harness 使用本仓 `cli/` 运行真实 `sf`，先 `sf init` 出独立临时仓库再提交。

## GPU 仿真开关

| 设置                              | 语义                                          |
| ------------------------------- | ------------------------------------------- |
| `FORGE_LOCAL_GPU_PASSTHROUGH=0` | local：分配 / 记账 / 标签照常，容器不带 `--gpus`          |
| `FORGE_K8S_GPU_PASSTHROUGH=0`   | kuberay：Pod 不请求 `nvidia.com/gpu`，Ray 逻辑资源照常 |

调度、配额、容量、台账全部按真实语义执行。**生产保持默认（直通）。**

## 断言覆盖

1. 状态机走到 SUCCEEDED（经历 PENDING / RUNNING）；
2. 指标闭环：`train/loss` 可从 API 读回；
3. 日志闭环：训练日志行入库可查询；
4. 产物闭环：checkpoint 登记可见。

## CI

`.github/workflows/e2e.yml`：单测 → local 闭环（sim + 真实 SFT 矩阵）→ kuberay 闭环（kind + operator）；不再依赖跨仓 token。

## 覆盖边界

slurm 后端暂不在闭环内（需容器化 slurmrestd + Apptainer）：批脚本渲染、REST 客户端、hetjob、状态映射由单测覆盖。详情与路线见仓库 `docs/ops/e2e-closed-loop.md`。
