feat(v0.1): add per-session RWO PVC foundation for true session state persistence

PR A for #770: docs + migration 007 + RBAC + types foundation.

- 新增 failureKind session-store-evicted,用于区分 PVC 缺失与真协议错误
- 新增 migration 007_v01_session_state_storage:sessions 表增加 storage_* 列 + 索引
- mgr SA RBAC 增量:persistentvolumeclaims: [create, get, list, watch, delete]
- 6 份 SPEC 升级(runtime-assembly / hwlab-manual-dispatch / backend-codex T7b / agentrun-runner / agentrun-mgr / services)
- 显式禁止:fake app-server mock、replacement threadId、runner 启动后 copy/restore、idleTimeoutMs 拉永驻
- selftest 断言更新到 007_v01_session_state_storage

后续 PR B/C 在此基础上接入 mgr 端 PVC 生命周期 + runner 端 mount + backend 端 observability。
This commit is contained in:
Codex
2026-06-03 18:45:13 +08:00
parent cb93992b1c
commit 87beb00bdb
10 changed files with 153 additions and 1 deletions
@@ -32,6 +32,38 @@ Kubernetes Job runner 必须把 credential source 与 runtime home 分开:Secr
RuntimeAssembly P0 中 `SessionRef` 可以显式为 `null`runner 不得把完整 `CODEX_HOME`、Secret projection 或节点 host path 当作 session store。`ResourceBundleRef` P0 收敛为 Git-onlyrunner 已支持把 `repoUrl + full commitId` checkout 到 `AGENTRUN_WORKSPACE_ROOT` 下的隔离目录,并记录 commit/tree 摘要,不能把用户上传文件或 env dump 混入 Git-only bundle。`toolAliases``promptRefs``skillRefs` 都属于该 Git-only bundle 的非敏感子资源:runner 必须在同一 checkout 中解析、校验和装配,不能从镜像默认目录、host path、旧 prompt 常量或用户长 prompt 中补齐。
### v0.1.1 Session state 持久化(per-session RWO PVC 直接挂载)
Runner 启动时若 run 携带 `storage_kind='pvc'` 的 session 引用,必须在 Job manifest 渲染阶段加一个 `agentrun-sessions` volume,把 `agentrun-v01-session-<sessionId>` PVC 直接挂到 `${CODEX_HOME}/<codex_rollout_subdir>`,并把以下 env 透传给 backend
- `AGENTRUN_SESSION_PVC_NAME`PVC 名(`agentrun-v01-session-<sessionId>`)。
- `AGENTRUN_SESSION_PVC_NAMESPACE`:默认 `agentrun-v01`
- `AGENTRUN_SESSION_PVC_MOUNT_PATH`:默认 `${CODEX_HOME}/<codex_rollout_subdir>`
- `AGENTRUN_CODEX_ROLLOUT_SUBDIR`:默认 `sessions`
边界:
- PVC 与 `runner-home` emptyDir 父目录共存;`auth.json` / `config.toml` / `state_*.sqlite` / `memories/` / `tmp/` / `skills/` 仍走 emptyDircodex rollout JSONL 走 PVC。
- `automountServiceAccountToken=false` 不变;runner 不通过 k8s API 读 PVC 内容,只把 PVC 摘要通过 `POST /api/v1/sessions/:id/storage/refresh` 写回 manager。
- PVC 不存在 + `storage_kind='pvc'` 时 runner 启动前 manager 端短路返回 `session-store-evicted`runner 不知道该 session。
- 禁止 runner 启动后做 copy/restorePR #78 已回退的 replacement 逻辑同源,禁止任何变体)。
Runner K8s manifest 增量(spec 形态参考):
```yaml
volumes:
- name: runner-home # emptyDirauth.json, config.toml, state_*.sqlite...
emptyDir: {}
- name: agentrun-sessions # 新增 PVC RWO
persistentVolumeClaim:
claimName: agentrun-v01-session-<sessionId>
volumeMounts:
- name: runner-home
mountPath: /home/agentrun
- name: agentrun-sessions
mountPath: /home/agentrun/.codex-<profile>/<codex_rollout_subdir> # <-- 唯一改这一行
```
### ResourceBundle 子资源装配
Runner materialize `ResourceBundleRef` 后必须按固定顺序处理子资源:先创建 `toolAliases` wrapper,再装配 `skillRefs` registry,最后读取 `promptRefs` 并生成当前 command 的 assembled initial prompt 摘要。任何子资源缺失或非法都必须按对应 failureKind 阻塞当前 command,不得继续运行后让模型自行猜测。