-- Ephemeral team lifecycle: a `lifecycle` column on teams + a back-ref from -- topology_runs so the post-terminal hook in cm-api::topology_worker knows -- which team an ephemeral run belongs to. -- -- permanent — the default; team + claws persist across runs (Specialists / Team modes). -- ephemeral — team is torn down (claws deprovisioned, rows deleted) after the last -- in-flight run terminates. Scheduled + Triggered modes use this. -- -- Teardown policy: on a run's terminal transition (completed/failed/cancelled), -- if the run's team is ephemeral AND no siblings are still queued/running for -- that team, deprovision every bound claw and delete the team row. The FK on -- team_members (ON DELETE CASCADE from 0010) cleans the bindings; agents rows -- are removed by the worker after deprovision_claw() succeeds. ALTER TABLE teams ADD COLUMN lifecycle TEXT NOT NULL DEFAULT 'permanent' CHECK (lifecycle IN ('permanent', 'ephemeral')); -- Back-ref from a durable run to its team, when the run was fired by -- `POST /api/teams/:id/run` or a scheduled/webhook fire of a team's graph. -- Nullable — ad-hoc topology runs + swarm/research runs leave this NULL. ALTER TABLE topology_runs ADD COLUMN team_id UUID REFERENCES teams (id) ON DELETE SET NULL; -- Fast lookup for "any siblings of this team's run still in flight?". CREATE INDEX topology_runs_team_active_idx ON topology_runs (team_id, status) WHERE team_id IS NOT NULL AND status IN ('queued', 'running');