Skip to content

收口 orchestrator route claim map facade #726

Description

@kxn

父 issue

背景

#725 关闭后继续扫描 orchestrator direct access,progressitemBuffers 的同型 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'

建议范围

  1. 先加结构测试,允许 service.go 初始化和 service_routing_claims.go owner 访问 claim maps,预期红灯命中 service_route_core.goservice_snapshot_runtime.go
  2. 在 claim owner 文件增加 bind/clear facade:bindWorkspaceClaimbindInstanceClaimbindThreadClaimclearInstanceClaim 等。
  3. 迁移 route transition 和 instance disconnect/remove cleanup。
  4. 跑目标测试、全量测试与 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 无需更新。

收尾参考

执行快照

  • 当前阶段: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。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:runtimeRuntime manager, process lifecycle, and persisted statemaintainabilityRefactors, code structure, and long-term maintainability workstatus:implementable-nowReady to implement with current issue body and context

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions