Move Project
POST/projects/:project_id/move
Move a project — and its entire dependent entity graph — to another workspace.
A move is metadata-only (object storage carries no workspace component), so
every dependent row's workspace_id is restamped in one transaction; see
services.project_move.reparent_project. Workspace-level SUTs the
project's runs reference are copied or reused in the target rather than
moved — see the 2026-07-22 ADR
(docs/adr/2026-07-22_sut-follow-or-hash-dedup-copy-on-project-move.md).
A move also clears any test-plan pin and both locks, since plans are workspace-scoped
(services.project_move), recording a released_on_move row alongside the
ProjectMoveEvent.
Requires workspace_admin/workspace_editor on the source workspace
(via the path-resolved RBAC dependency above) and the target workspace
(checked explicitly below, since it comes from the request body) — with a
platform admin bypassing both checks. Rejected: a target that doesn't
exist, a personal-workspace target (no demotion), a name collision in the
target, or any run still pending/claimed/running for this
project.
Request
Responses
- 200
- 403
- 404
- 409
- 422
Successful Response
Forbidden
Not Found
Conflict
Unprocessable Entity