Skip to content

Commit 6044891

Browse files
committed
fix: bind Windows operation records to canonical targets
1 parent f633439 commit 6044891

3 files changed

Lines changed: 19 additions & 2 deletions

File tree

changelogs/releases/v1.20.0.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ v1.20.0 是一次面向长任务可靠性的控制面升级。它让正式任务
2121
- 用户可见响应、报告和进度以人类结论为主;大体量机器证据保留在索引和证据层,不再倾倒到主阅读面。
2222
- 历史 audit-state 按 current、legacy、non-audit、unsupported 和 invalid 分型;历史字节保持不变,当前无效状态仍严格失败。
2323
- Profile 分节读取按同一 source digest 累计全部必需标题,单节命中不再错误标记完整。
24+
- Windows 上任务操作记录复用产物决策层的 canonical 目标集,短路径、真实路径或大小写别名不再造成目标摘要误漂移并阻断合法写入与恢复。
2425
- 验证修复期新增 `RepairConvergenceStateV1`:先冻结完整问题集、批量修复,再统一 affected;独立失败一次收齐,相同绿色候选零执行复用,避免每修一个问题就重跑近全量。
2526
- 验证执行支持有界并发、候选证据缓存、关键路径 ETA 与项目 `.tmp` 临时数据治理;发布、安全、恢复、真实宿主与共享状态节点继续现场验证。
2627

hooks/_runtime/lifecycle.cjs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3509,6 +3509,10 @@ function startAllowedToolRecovery(state, payload, platform, artifactDecision = n
35093509
)
35103510
}
35113511
const recoveryFootprint = projectMutationFootprintForRecovery(footprint)
3512+
const canonicalOperationTargets = [
3513+
...(artifactDecision.sourceTargets || []),
3514+
...(artifactDecision.targetTargets || [])
3515+
]
35123516
state.turnLiveness.inFlightOperation.mutationLease = mutationLease
35133517
state.turnLiveness.inFlightOperation.mutationFootprint = recoveryFootprint
35143518
state.turnLiveness.inFlightOperation.mutationPreObservation = preObservation
@@ -3523,7 +3527,13 @@ function startAllowedToolRecovery(state, payload, platform, artifactDecision = n
35233527
state.taskRecoveryCommitFence?.writerGeneration ?? 0,
35243528
expectedStateSequence: state.taskRecoveryCommitFence?.stateSequence ?? 0,
35253529
kind: artifactDecision.operation || 'mutation',
3526-
exactTargets: recoveryFootprint.normalizedTargets || footprint.normalizedTargets,
3530+
// ArtifactSlotDecisionV2 computes targetSetDigest from its canonical target
3531+
// projection. The raw footprint can still contain a Windows short-path or
3532+
// differently-cased alias, so binding that raw spelling to the canonical
3533+
// digest makes an otherwise valid operation fail closed on some runners.
3534+
exactTargets: canonicalOperationTargets.length
3535+
? canonicalOperationTargets
3536+
: (recoveryFootprint.normalizedTargets || footprint.normalizedTargets),
35273537
targetSetDigest: artifactDecision.targetSetDigest,
35283538
beforeDigest: preObservation.snapshotDigest
35293539
}, operationFenceOptions)

scripts/test-mcp-servers.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2652,6 +2652,10 @@ function testMemoryArtifactMutationReconciliationContract() {
26522652

26532653
function operationTurn(state, fixture, phase = 'dispatched') {
26542654
const issuedAtMs = Date.parse(fixture.inFlightOperation.mutationLease.issuedAt)
2655+
const canonicalOperationTargets = [
2656+
...(fixture.inFlightOperation.artifactDecision.sourceTargets || []),
2657+
...(fixture.inFlightOperation.artifactDecision.targetTargets || [])
2658+
]
26552659
let turn = {
26562660
...(state.turnLiveness || {}),
26572661
inFlightOperation: fixture.inFlightOperation
@@ -2664,7 +2668,9 @@ function testMemoryArtifactMutationReconciliationContract() {
26642668
writerGeneration: state.taskRecoveryCommitFence?.writerGeneration || 0,
26652669
expectedStateSequence: state.taskRecoveryCommitFence?.stateSequence || 0,
26662670
kind: fixture.inFlightOperation.artifactDecision.operation,
2667-
exactTargets: fixture.inFlightOperation.mutationFootprint.normalizedTargets,
2671+
exactTargets: canonicalOperationTargets.length
2672+
? canonicalOperationTargets
2673+
: fixture.inFlightOperation.mutationFootprint.normalizedTargets,
26682674
targetSetDigest: fixture.inFlightOperation.artifactDecision.targetSetDigest,
26692675
beforeDigest: fixture.inFlightOperation.mutationPreObservation.snapshotDigest
26702676
}, { nowMs: issuedAtMs })

0 commit comments

Comments
 (0)