Skip to content

Commit bb8d6dd

Browse files
committed
fix: harden lifecycle validation persistence
1 parent 71db0fe commit bb8d6dd

9 files changed

Lines changed: 196 additions & 23 deletions

‎CHANGELOG.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
> **说明**: 版本概览摘要;历史版本见对应详细变更文件。
44
> **最新版本详细变更文档**: [`changelogs/releases/v1.19.1.md`](./changelogs/releases/v1.19.1.md)
55
> **最后更新**: 2026-08-27
6-
> **当前版本**: v1.19.1 在任务所有权与 TaskRecoveryStoreV5 基线上完成发布收敛:宿主拥有操作权限且 fallback 不再 shadow deny、durable fail-closed 具备 exact server-owned 恢复与稳定 readback、ProjectTargetLease 绑定当前物理根、SkillRoute 语义容量恢复、ContextRead 确定性 CAS 折叠、验证逐节点恢复并聚合完整失败集、fresh Auto 严格后继 exact-scope 续接,以及 ExactReleaseArtifact 单一制品发布。版本发布权威以对应 Git tag、npm registry 与 GitHub Release 为准。
6+
> **当前版本**: v1.19.1 在任务所有权与 TaskRecoveryStoreV5 基线上完成发布收敛:宿主拥有操作权限且 fallback 不再 shadow deny、durable fail-closed 具备 exact server-owned 恢复与稳定 readback、Windows 瞬时占用不再阻断 V5 派生用量账本、ProjectTargetLease 绑定当前物理根、SkillRoute 语义容量恢复、ContextRead 确定性 CAS 折叠、验证逐节点恢复并聚合完整失败集、控制中止保留逐节点原因、fresh Auto 严格后继 exact-scope 续接,以及 ExactReleaseArtifact 单一制品发布。版本发布权威以对应 Git tag、npm registry 与 GitHub Release 为准。
77
88
---
99

1010
## 版本概览
1111

1212
| 版本 | 日期 | 变更摘要 | 详细 |
1313
|------|------|---------|------|
14-
| [v1.19.1](./changelogs/releases/v1.19.1.md) | 2026-08-27 | 🧩 **发布收敛补丁**:移除 DevCodex 影子权限层及 Grok fallback shadow deny;为 artifact/admission durable fail-closed 增加 exact server-owned 恢复;修复 SkillRoute 容量锁死并稳定 ContextRead;严格后继验证根支持 fresh Auto 续接;只发布经验证的唯一 tgz | [查看](./changelogs/releases/v1.19.1.md) |
14+
| [v1.19.1](./changelogs/releases/v1.19.1.md) | 2026-08-27 | 🧩 **发布收敛补丁**:移除 DevCodex 影子权限层及 Grok fallback shadow deny;为 artifact/admission durable fail-closed 增加 exact server-owned 恢复;修复 SkillRoute 容量锁死、Windows V5 用量账本瞬时占用与控制中止原因缺失;严格后继验证根支持 fresh Auto 续接;只发布经验证的唯一 tgz | [查看](./changelogs/releases/v1.19.1.md) |
1515
| [v1.19.0](./changelogs/releases/v1.19.0.md) | 2026-08-26 | 🧭 **任务所有权与验证授权闭环**:正式需求原子准入并绑定 session/project/task;正式产物和宿主工具写入统一鉴权;V5 按任务 A/B 恢复并精确计量;验证预览、执行、续权和稳定终态使用同一候选证据,普通改动不再误跑全量 | [查看](./changelogs/releases/v1.19.0.md) |
1616
| [v1.18.1](./changelogs/releases/v1.18.1.md) | 2026-08-23 | 🔧 **V5 用量台账预览契约修复**:doctor 发现台账与 A/B 槽扫描值漂移时,maintenance dry-run 明确投影 `reconcile-usage-ledger` 计划动作;预览仍零写,apply 只校正 V5 台账,不删除 legacy 或 runtime generation | [查看](./changelogs/releases/v1.18.1.md) |
1717
| [v1.18.0](./changelogs/releases/v1.18.0.md) | 2026-08-23 | 🧰 **跨宿主 AI Coding 工程 Harness 与按任务恢复的有界 Hook 状态**:明确不改变模型参数而提升真实工程有效智能;修复 Codex progressive route 循环;TaskRecoveryStoreV5 以正式任务稳定 A/B、256/512 MiB 与 8 MiB reserve 取代事件级 UUID 全快照,legacy 零删除;新增完成态动作、本地进化、默认不建分支、ordered cherry-pick、只读 worktree 诊断与显式 runtime generation 收敛 | [查看](./changelogs/releases/v1.18.0.md) |

‎changelogs/releases/v1.19.1.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ v1.19.1 是 v1.19.0 发布失败后的收敛补丁。它保留 v1.19.0 已完成
1313
- **SkillRoute 容量恢复**:turn cache 不再把空崩溃目录或 writer 崩溃留下的 lock/temp-only owner 计为永久活跃 route;达到 high water 时只安全回收无业务义务终态或同会话已被后继 context 取代的未提交 route,并通过 grace、root/turn lock、writer allowlist、identity、quarantine/readback 防误删。其他会话未完成 route、protected、live lock、未知文件和身份异常继续失败关闭;正式任务数量无硬上限的 V5 合同不变。
1414
- **ContextRead 稳定折叠**:观察结果先持久化,再在 TaskRecoveryStoreV5 CAS 内读取完整 durable ledger;按计划顺序和确定性质量规则选择每个 source 的唯一结果,避免乱序/重复事件把 rebind 或 `load_stage` 拉回陈旧循环。
1515
- **ManagedValidationRunner 可恢复**:增加 `node-start`、30 秒持久化心跳和逐节点紧凑检查点;同一 run/candidate/plan/manifest/lease 下可验证成功前缀并精确续跑,候选漂移或检查点不匹配则失败关闭。
16+
- **V5 Windows 写入韧性**:派生的 singleton usage ledger 遇到 Windows `EPERM`、`EACCES` 或 `EBUSY` 时先执行有界重试;仍被瞬时共享锁占用时,只对可重建账本使用受 store lock 保护且必须精确 readback 的 copy fallback。正式 task hot A/B 槽不放宽为非原子 copy,`EIO` 等非共享故障继续失败关闭,hard-limit 预充仍须先于状态写入成功。
1617
- **收敛优先验证**:多问题和发布任务先冻结完整问题集、批量修复,再执行一次 affected 验证;runner 在失败后继续执行独立节点,用 `failedNodes` 一次收齐失败,只跳过依赖失败/阻断节点并记录原因,durable terminal projection 同步保留有界完整失败节点集合与紧凑摘要。只有最终候选冻结后才执行一次 release V3/full,禁止逐问题重复跑重型验证。
18+
- **控制中止原因完整**:worker send、protocol、timeout、runner-state persistence 等控制面终止现在为每个尚未执行的节点写入 `VALIDATION_CONTROL_ABORTED + controlCode`,`abortedNodes` 与 `abortedNodeReasons` 始终一一对应,不再留下无法解释的中止清单。
1719
- **长任务验证根可安全续接**:同一 Auto authority 的严格后继 root rollover 继续要求 level、purpose、节点、边界、heavy、副作用和全部预算完全一致;若晚于父终态的不同真实用户 Auto 指令形成 fresh control,则可在同 task/project/root/session/revocation、无 live lease、严格 Git 后继且仍为 V2 的条件下,为当前精确影响范围建立新 root,并保留父 root/terminal lineage。已提交修复使用冻结 changed files,clean tree 不再退化成低覆盖计划。持久化 BudgetConfirmation 同时校验完整 `ProjectRootIdentityV1` 结构、digest 与 expected binding。
1820
- **发布对象唯一**:release V3/full 完成后只执行一次 `npm pack`,生成 `ExactReleaseArtifactReceiptV1`,绑定候选、终态 receipt、tarball SHA-256/SHA-512/SRI 与 npm metadata;发布精确 `.tgz` 并回查 registry integrity、gitHead 和 provenance。
1921
- **站点边界**:`public-site` 显式声明 ESM,并保留网站构建的本地依赖隔离与 Markdown 不进入 JS 语法校验的既有修复。

‎changelogs/unreleased.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
- **ProfilePathPortabilityGate(PI-305 / PF-372 / GR-095)**:新生成 Profile 采用 opt-in `portable-v1`,项目内长期路径使用 `<workspace-root>` / `<project-root>` / `<active-root>` 或相对路径,真实本机外部路径用同一行 machine-local marker 标注。validator 仅检查显式目标 Profile 顶层 Markdown,不枚举其他项目;legacy 未声明契约时兼容读取,历史报告/receipt 不改写。D 盘迁移已把 DevCodex 自身 12 处旧工作盘符改为语义根并保留 2 处真实 E 盘 DevDocs 例外;隔离 Windows/Unix/URL/legacy 回归、active Profile 残留探针、control-content、duplication、CSD 与治理台账均 PASS。
1010
- **CP3 v1.6 工作流与任务所有权 P0 候选(发布资格验证中)**:新增 `ActualInstructionEnvelopeV1 → WorkItemSetV1 → WorkflowRouteDecisionV2`,附件、截图/OCR、引用文档、工具输出与 ambient UI 仅作证据,不能反向覆盖用户真实指令。`WorkspaceSessionRouteIndexV1` 只提供 hint,`ProjectTargetLeaseV2` 精确绑定 session/project/root/context/route;正式任务由 server-owned `TaskAdmissionTransactionV1` 一次性写入 task identity、`00-需求概况.md` 与用户原样 `01-产品需求.md`,以 ingress idempotency 和 `FencedTaskWriteOwnerLeaseV2` 阻止重复准入、跨项目/跨任务写入、mtime 选错任务及 terminal 旧绑定复活。Simple task 仅使用 server-issued 两路径/两次租约,漂移立即升级正式流程。
1111
- **正式产物、Hook mutation 与恢复单一权威**:`MutationFootprintV2 → LayeredArtifactSlotRegistryV2 → ArtifactSlotDecisionV2 → TaskOwnedMutationLeaseV2 → TaskRecoveryStoreV5 prewrite → MutationObservationReceiptV1` 成为 Hook/MCP/宿主工具的统一写链;unknown writer、未观察实际效果、跨 active-root、重复消费与错误槽位均 fail closed。V5 继续使用 task hot A/B、cold stub、terminal 退出缓存、256/512 MiB 和 8 MiB closeout reserve,不再按每次 Hook/工具状态创建 UUID generation;hot 槽的容量判定、usage ledger 预充与实际写盘共用紧凑 JSON 字节序列,避免格式化空白把合法恢复状态误判为超过 256 KiB。产品提供型 `01-产品需求.md` 保持用户原始真相且 AI 不得改写。
12+
- **V5 Windows ledger replace 收敛(PI-338 / PF-425)**:派生 singleton usage ledger 的 `EPERM/EACCES/EBUSY` replace 使用有界重试,耗尽后仅对该可重建账本启用 store-lock 内的精确 readback copy fallback;task hot A/B 不采用非原子 fallback,`EIO` 等非共享故障继续 fail closed,预充账本成功仍是 task 状态写入前提。
1213
- **reconciliation 恢复闭环(PI-322 / PF-398~PF-407、PF-409)**:`memory_artifact_mutation_reconcile_v1` 复证 exact current ingress、same-session formal route、operation/closeout CAS、primary/reserve 来源和实际 effect snapshot;只关闭既有 pending closeout,不执行文件 mutation、不签发权限。exact-target/controlled-root pre-observation、逐层目录遍历与 descriptor/path 稳定回读共同防止范围扩张和并发漂移;正式任务强制 exact taskId。Memory server 每次复验 ProjectTargetLease 的 digest、TTL、context、route 与 workspace 当前 physical root,不再信任扩根 fallback。`TaskAdmissionReconciliationReceiptV1` 对同一请求采用 exact readback,完整前缀自动恢复,产品原文/概况等阶段内部分落盘由 create-if-absent 幂等补齐;drift 保持 fail closed。Lifecycle、V5 projection 与 validation continuation 统一消费 `reconciled` receipt,跨宿主回执统一走 canonical MCP leaf。
1314
- **ConvergenceFirst 失败集聚合(PI-317 / PF-408)**:affected/full runner 不再首错即停;独立节点继续执行并写入 `failedNodes`,只有依赖失败/阻断的下游进入 `abortedNodes + abortedNodeReasons`;durable terminal projection 有界保存完整失败节点集合与紧凑摘要,重启后不退化为首错视图。issue-set、repair generation、implementation complete 与 final freeze 保持由工作流/发布编排 Owner 持有,不伪装成 ValidationPlanV3 原生字段。
15+
- **控制中止逐节点原因(PI-339 / PF-426)**:worker send、protocol、timeout、runner-state persistence 等控制面终态为全部未执行节点生成 `VALIDATION_CONTROL_ABORTED + controlCode`,保证 `abortedNodes` 与 `abortedNodeReasons` 一一对应并可在 durable terminal projection 中解释。
1416
- **FreshCurrentAutoRescopeV1(PI-323 / PF-410)**:旧 Auto authority 的 continuation 与 root rollover 继续受 immutable exact-scope 约束;但晚于父终态的不同真实用户 Auto 指令是新的当前卡授权,可在同 task/project/root/session/revocation、无 live lease、严格 Git 后继且不超过 V2 时,为批量修复后的当前精确影响范围建立新 root。receipt 保留父 root/terminal lineage,V3/full/release 仍需独立发布授权,避免合法批量修复被迫复制无意义摘要重新确认。
1517
- **SkillRoute 语义容量与宿主权限余项收敛(PI-319~PI-321 / PF-395~PF-397)**:per-turn cache 使用 56/48 与 28/24 MiB high/low water、64/32 MiB hard;空 orphan、无业务义务终态和同会话 superseded 未提交 route 经双锁、identity 与 quarantine/readback 后退出,其他会话活跃状态零删除。Grok bridge 移除 adapter missing/failed/invalid/outside-workspace 及 adapter allow 后的本地危险命令 shadow deny;task source/decision 删除也交回宿主。发布驱动只消费 exact TaskRecoveryStoreV5 状态,不再读取稳定 projection 充当 authority。
1618
- **验证执行授权、稳定终态与安全消费者**:`VerificationIntentV2`、`ValidationRunIdentityV1`、`VerificationExecutionLeaseV2`、`ManagedValidationRunnerV2` 与固定 run shard 将 plan/budget/actor/candidate/HEAD/dirty identity、deadline/renew、runner-owned process 和 exactly-one terminal 绑定;worker 入口在 fork 前确定性校验,缺失固定为环境 `blocked`,不再由 Windows send/exit 竞争随机变成 `abandoned`。普通 changed edit 不得静默升级 V3/full,CI/release 只有显式角色与同一 BudgetCard 摘要回绑后才能执行。AI 计划现在必须先从当前 host session 取得 server-owned formal task 并绑定 ContextRead epoch;confirm 使用唯一 `PendingBudgetCardBindingV1` 与当前卡确认,Sticky Auto 可为 V0~V2 生成 server-owned `BudgetConfirmationReceiptV1`。失败后的 `ValidationContinuationAuthorizationV1` 始终相对 immutable root,完整 mutation observation 与同 HEAD/无新增 dirty 路径、节点或预算的 same-scope retry 共用最多两次上限;第三次必须 BLOCK,不能自动换根清零。首节点前的 runner/V5 基础设施失败没有业务节点名时,以有界 `terminalReason.code` 作为恢复锚点,仍受同一 immutable root 与重试上限约束。严格后继 root rollover 要求 task/project/root/session/revocation 不变且 level、purpose、边界、节点、heavy、副作用和全部预算逐项完全相等;当前 fresh server-owned Auto 可重绑 context/AutoRef 并保留父 lineage,过期 ingress 只可沿用原绑定。已提交修复显式传入冻结 changed files,clean tree 不能收窄 affected,扩大或收窄统一 typed BLOCK。pause/stop/scope reduction 会撤销全部 live authority。V5 evidence store 回读同一 session/task,缺失或错绑在 BudgetCard/首节点前失败关闭,不再产生“可确认但不可执行”的死卡。PF-342/PF-343、PowerShell 写入别名、wrong-server MCP leaf、宿主中性 Hook fixture、语法级危险命令分类和 `BoundedMaintenancePreviewV2` 同批收敛;只读搜索/文档文本不再误拦,真实危险 sink 仅产生 advisory,操作权限归宿主,task/root/slot/retention 无效仍失败关闭。运行态 MCP closure 默认只做 V2 依赖/隔离布局,npm packlist 与真实 pack/install `pack-clean` 均为显式 release consumer,避免专项验证暗跑打包生命周期。当前 validation manifest 为 115 nodes / 113 full、7 个 V2 边界;R7/R8、commit、push 与版本发布将在当前候选 affected/ECR 收敛后进入已授权发布链。

‎hooks/_runtime/evidence/codex-skill-route-pass.v1.json‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@
55
"hostVariant": "codex-cli/exec-user-global-local-stdio",
66
"testedVersion": "codex-cli 0.145.0 / source candidate 1.19.1",
77
"protocol": "MCP 2024-11-05",
8-
"runtimeContractDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a",
8+
"runtimeContractDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d",
99
"hostAdapterDigest": "d620c1e32db06e4c044401fc4abcf203d5370a697e3e3b0bdc9dc47344ef6136",
10-
"sourceEvidenceDigest": "1e594cdd4e9da878dc21ea183b5b4fcd8aa91e99e62aec20435c61409e57d01b",
10+
"sourceEvidenceDigest": "9b787f79d2fd61e10401f3884784e199f9791873392c1fcd481f6c0383828cc2",
1111
"sourceProbe": {
1212
"schemaVersion": "SkillRouteS15EvidenceV1",
13-
"probeRunId": "s15-codex-probe-4daaa6db-4dd5-449c-a82b-54baab031039",
13+
"probeRunId": "s15-codex-probe-9993adc7-f2c7-4e75-95c9-7004745a9859",
1414
"authorizationSource": "isolated-probe-authority",
1515
"contextSource": "host-hooks",
1616
"observationMode": "hook-post-history",
1717
"receiptStatus": "relevant-complete",
18-
"completedAt": "2026-08-26T23:34:16.282Z"
18+
"completedAt": "2026-08-27T02:22:12.223Z"
1919
},
2020
"runtimeBinding": {
2121
"source": "isolated-source-candidate",
22-
"expectedDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a",
23-
"generationDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a",
24-
"modeReceiptDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a",
25-
"routeEnvelopeDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a"
22+
"expectedDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d",
23+
"generationDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d",
24+
"modeReceiptDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d",
25+
"routeEnvelopeDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d"
2626
},
2727
"probe": {
2828
"schemaVersion": "SkillRouteProbeSummaryV1",

‎hooks/_runtime/host-skill-route-capabilities.v1.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
"status": "PASS",
1414
"testedVersion": "codex-cli 0.145.0 / source candidate 1.19.1",
1515
"protocol": "MCP 2024-11-05",
16-
"runtimeContractDigest": "f21d06d58f4b1b6854697c9806b5f3cdd700aaf8dbd195e74eb9a85692631f4a",
16+
"runtimeContractDigest": "ee930299f0cfa7cce55db2eb877a8c808a831d5910840bca4877388c3c59fa9d",
1717
"hostAdapterDigest": "d620c1e32db06e4c044401fc4abcf203d5370a697e3e3b0bdc9dc47344ef6136",
1818
"evidenceRef": "hooks/_runtime/evidence/codex-skill-route-pass.v1.json",
19-
"evidenceDigest": "457043eb0982e9b8749a484cf2c8672f9a4f2a958ec20459afa092720d83ad86",
19+
"evidenceDigest": "23cb187852a5c6f0ba2cf769df33b13e62d3298eeb2500769512235b09659337",
2020
"entrySurface": "codex exec --ephemeral",
2121
"bootstrapDelivery": "stable user-global Hook launcher UserPromptSubmit or profile_context_plan fallback",
2222
"defaultEligible": true

0 commit comments

Comments
 (0)