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
+11
View File
@@ -136,6 +136,17 @@ Run 的 `executionPolicy.secretScope` 应引用与 `backendProfile` 匹配的 pr
阅读本文和 [spec-v01-runtime-assembly.md](spec-v01-runtime-assembly.md),然后构造一个带旧 `SessionRef.threadId` 的真实或 fake app-server run,使 `thread/resume` 返回 `no rollout found for thread id`。确认 adapter 输出 `thread-resume-failed` 并终止当前 turnevents/result/sessionRef 不得出现 `thread/resume:non-resumable`、替代 `thread/start`、新 threadId 回写或历史 prompt 拼接。确认 provider auth、rate limit、model config 或其他 protocol error 仍按各自 failureKind 直接失败,不走替代路径。
### T7b Session state 持久化与 eviction
阅读本文和 [spec-v01-runtime-assembly.md](spec-v01-runtime-assembly.md) v0.1.1 SessionRef 持久化节,然后构造一个带 `AGENTRUN_SESSION_PVC_NAME` 环境变量的真实或 fake app-server run。验证:
1. `initialize` 之后 adapter emit `codex-rollout-storage-mounted` 事件,事件 payload 含 `pvcName` / `mountPath` / `codexRolloutSubdir``valuesPrinted=false`
2. codex 写 `${CODEX_HOME}/<subdir>/YYYY/MM/DD/rollout-<timestamp>-<threadId>.jsonl`adapter 不写 PVC 内容,但 `runtimeSummary` 必须能回答 mount 是否成功。
3. 删 PVC 后再次 turn`AGENTRUN_SESSION_PVC_NAME` 已设 + `thread/resume` 返回 `no rollout found for thread id` 时,failureKind 升级为 `session-store-evicted`**不是** `thread-resume-failed`
4. 同一 session 跨 runner pod 重建,PVC 不动:adapter 仍 emit `codex-rollout-storage-mounted``thread/resume:completed` 路径走通,events 不出现 `thread-resume-failed` / `thread/replacement-start:completed`
5. `AGENTRUN_SESSION_PVC_NAME` 未设 + `thread/resume` 失败:仍走 `thread-resume-failed`,不升级为 `session-store-evicted`
6. `codex_rollout_subdir` 走 env `AGENTRUN_CODEX_ROLLOUT_SUBDIR`,默认 `sessions`codex CLI 改子目录时只改 env,不改装配。
### T8 Initial prompt and skill refs
阅读本文和 [spec-v01-runtime-assembly.md](spec-v01-runtime-assembly.md),然后用 fake app-server 或真实 Codex stdio run 验证 `ResourceBundleRef.promptRefs``skillRefs`。首轮无 threadId 时,`turn/start` input 必须包含 initial prompt 与 skill facts,并记录 `initialPromptInjected=true`;第二轮带同一 `threadId` resume 时,`turn/start` input 只能包含当前用户 message,记录 `initialPromptInjected=false`,且不得拼接第一轮 prompt、assistant 回复或旧 skill facts。required prompt/skill 缺失时不得调用 Codex provider。