Problem
创建 Code Session 时,代码已经持有准确的 EnvironmentWork,但该 work 的身份没有持久化到 code_sessions。
当前 Sandbox 续期查询通过以下 JSON 字段反向推断 Environment Work:
work.data->>'type' = 'session'
and work.data->>'id' = code_session.session_external_id
随后从所有匹配 work 中选择最新的 running Sandbox。
如果同一个 Session 因重试、恢复或导入产生多个 Environment Work,就可能续期另一次执行遗留的 Sandbox,而不是创建该 Code Session 时绑定的 Sandbox。organization、workspace 和 environment 条件保证了租户隔离,但不能精确区分执行 attempt。
相关代码:
internal/codesessions/managed_agent_code_session.go
internal/db/environments.go
Proposed solution
- 通过 goose migration 为
code_sessions 增加 environment_work_uuid,不创建 PostgreSQL 外键约束。
- 创建 Code Session 时直接持久化当前
EnvironmentWork.UUID。
- 续期查询通过
environment_work_uuid 精确定位 Environment Work 及其 Sandbox。
- 继续保留
organization_id、workspace_id 和 environment_id 条件作为纵深约束。
- 明确既有 Code Session 数据的兼容或迁移策略,避免长期保留有歧义的反向推断。
Acceptance criteria
- 新创建的 Code Session 必须持久化准确的
environment_work_uuid。
- Sandbox 续期不再通过 Session external ID 和创建时间选择执行 attempt。
- 查询同时校验 organization、workspace 和 environment 边界。
- 增加回归测试:同一个 Session 存在两个 Environment Work,且两个 work 都有 running Sandbox;Code Session 只能续期自己绑定 work 的 Sandbox,而不能续期创建时间更新的另一个 Sandbox。
- 更新对应的 Code Session / Environment Work 生命周期设计文档。
Problem
创建 Code Session 时,代码已经持有准确的
EnvironmentWork,但该 work 的身份没有持久化到code_sessions。当前 Sandbox 续期查询通过以下 JSON 字段反向推断 Environment Work:
随后从所有匹配 work 中选择最新的 running Sandbox。
如果同一个 Session 因重试、恢复或导入产生多个 Environment Work,就可能续期另一次执行遗留的 Sandbox,而不是创建该 Code Session 时绑定的 Sandbox。organization、workspace 和 environment 条件保证了租户隔离,但不能精确区分执行 attempt。
相关代码:
internal/codesessions/managed_agent_code_session.gointernal/db/environments.goProposed solution
code_sessions增加environment_work_uuid,不创建 PostgreSQL 外键约束。EnvironmentWork.UUID。environment_work_uuid精确定位 Environment Work 及其 Sandbox。organization_id、workspace_id和environment_id条件作为纵深约束。Acceptance criteria
environment_work_uuid。