父 issue
背景
#725 关闭后继续扫描 orchestrator direct access,progress 与 itemBuffers 的同型 map 外传/散写问题已收口。剩余高价值风险是 route claim map:
workspaceClaims / instanceClaims / threadClaims 是 remote surface route ownership 的核心 SSOT。
当前大部分 claim 逻辑集中在 service_routing_claims.go,但 service_route_core.go 仍在 route transition 中直接写三类 claim map。
service_snapshot_runtime.go 在 disconnect/remove instance path 中直接 delete(s.instanceClaims, instanceID)。
这些 direct access 仍让 claim owner 边界不清晰。
本单只收口 claim map owner,不改变 claim 策略、workspace/thread ownership 语义或 route transition 条件。
目标
把 workspaceClaims / instanceClaims / threadClaims 的直接 map 写入/删除收口到 claim owner/facade 方法,并新增结构测试防止非 owner/facade 文件直接访问这些 map。
非目标
不改变 attach/detach/use/follow/new 行为。
不改变 workspace busy、instance busy、thread claim conflict 判断。
不改变 route transition 条件、surface resume、headless recovery、queue dispatch 或 request gate。
不改测试 fixture 里直接构造 claim 的既有断言,除非生产结构测试需要。
完成标准
生产代码中除 service.go 初始化与 claim owner/facade 文件外,不再直接访问 s.workspaceClaims / s.instanceClaims / s.threadClaims。
service_route_core.go 的 route transition 不再直接写 claim map,而是调用 claim facade。
disconnect/remove instance path 不再直接 delete s.instanceClaims。
新增结构测试防止 claim map direct access 回归。
route/claim/snapshot/headless/thread selection 相关测试通过。
运行 remote-state-machine guardrail;若行为等价,记录 canonical doc 无需更新。
子 issue 结果回卷到 调研核心大包与高耦合结构拆分方案 #713 后再关闭。
信息索引
相关文件:
internal/core/orchestrator/service.go
internal/core/orchestrator/service_routing_claims.go
internal/core/orchestrator/service_route_core.go
internal/core/orchestrator/service_snapshot_runtime.go
docs/general/remote-surface-state-machine.md
扫描命令:
rg -n " workspaceClaims|instanceClaims|threadClaims" internal/core/orchestrator --glob ' *.go' --glob ' !*_test.go'
建议范围
先加结构测试,允许 service.go 初始化和 service_routing_claims.go owner 访问 claim maps,预期红灯命中 service_route_core.go 与 service_snapshot_runtime.go。
在 claim owner 文件增加 bind/clear facade:bindWorkspaceClaim、bindInstanceClaim、bindThreadClaim、clearInstanceClaim 等。
迁移 route transition 和 instance disconnect/remove cleanup。
跑目标测试、全量测试与 remote-state-machine guardrail。
执行决策
实现参考
service_routing_claims.go 作为 claim owner/facade 文件。
保持所有 existing validation/check 方法不变,新增最小 bind/delete helper 替换直接 map 写入。
transitionSurfaceRouteCore 中保持原有 sameAttachment/sameWorkspaceClaim 判断,只把实际 map mutation 改成 facade 调用。
disconnect/remove instance 中只把 delete(s.instanceClaims, instanceID) 改成 owner helper,保持 remote turn cleanup 顺序不变。
检查参考
建议验证命令:
go test ./internal/core/orchestrator -run ' Claim|Route|Attach|Detach|Workspace|Thread|Headless|Snapshot|Disconnect|RemoveInstance' -count=1
go test ./internal/core/orchestrator -count=1
go test ./internal/core/orchestrator ./internal/core/control ./internal/app/daemon -count=1
go test ./...
bash scripts/check/go-file-length.sh && git diff --check
Guardrail:
必须运行 remote-state-machine guardrail;若仅 owner/facade refactor 且 route graph 不变,记录 canonical doc 无需更新。
收尾参考
把完成结果、验证结果、verifier 结果和 commit 写回 调研核心大包与高耦合结构拆分方案 #713 。
关闭前运行 issuectl close-plan。
提交并通过 ./safe-push.sh 推送。
执行快照
当前阶段:close-out
当前执行点:close-out tail only;下一步只剩回卷 调研核心大包与高耦合结构拆分方案 #713 、commit/push、close-plan 和 finish --close。
已完成:结构测试红灯/绿灯;route claim map mutation 已收口到 claim owner/facade;remote-state-machine guardrail 已复核无需改文档;独立 verifier 结果为 pass。
下一步:回卷 调研核心大包与高耦合结构拆分方案 #713 后提交推送,并运行 close-plan/finish 关闭本 issue。
当前阻塞:无。
最近改变的假设:pickers/catalog 暂不混入本切片。
最后一致状态:本地测试 go test ./...、文件长度检查和 diff check 均通过;已提交 commit 25705de4。
未完成尾项:push、close-plan、finish --close。
恢复步骤:检查 git status 与 push 状态,运行 issuectl close-plan/finish --close。
父 issue
背景
#725 关闭后继续扫描 orchestrator direct access,
progress与itemBuffers的同型 map 外传/散写问题已收口。剩余高价值风险是 route claim map:workspaceClaims/instanceClaims/threadClaims是 remote surface route ownership 的核心 SSOT。service_routing_claims.go,但service_route_core.go仍在 route transition 中直接写三类 claim map。service_snapshot_runtime.go在 disconnect/remove instance path 中直接delete(s.instanceClaims, instanceID)。本单只收口 claim map owner,不改变 claim 策略、workspace/thread ownership 语义或 route transition 条件。
目标
把
workspaceClaims/instanceClaims/threadClaims的直接 map 写入/删除收口到 claim owner/facade 方法,并新增结构测试防止非 owner/facade 文件直接访问这些 map。非目标
完成标准
service.go初始化与 claim owner/facade 文件外,不再直接访问s.workspaceClaims/s.instanceClaims/s.threadClaims。service_route_core.go的 route transition 不再直接写 claim map,而是调用 claim facade。s.instanceClaims。信息索引
相关文件:
internal/core/orchestrator/service.gointernal/core/orchestrator/service_routing_claims.gointernal/core/orchestrator/service_route_core.gointernal/core/orchestrator/service_snapshot_runtime.godocs/general/remote-surface-state-machine.md扫描命令:
建议范围
service.go初始化和service_routing_claims.goowner 访问 claim maps,预期红灯命中service_route_core.go与service_snapshot_runtime.go。bindWorkspaceClaim、bindInstanceClaim、bindThreadClaim、clearInstanceClaim等。执行决策
实现参考
service_routing_claims.go作为 claim owner/facade 文件。transitionSurfaceRouteCore中保持原有 sameAttachment/sameWorkspaceClaim 判断,只把实际 map mutation 改成 facade 调用。delete(s.instanceClaims, instanceID)改成 owner helper,保持 remote turn cleanup 顺序不变。检查参考
建议验证命令:
Guardrail:
收尾参考
issuectl close-plan。./safe-push.sh推送。执行快照
go test ./...、文件长度检查和 diff check 均通过;已提交 commit25705de4。