Tenant worktree surfaces after Slots went operator-only
Follow-ups found while making the worktree pool's doors operator-only (Task 9013):
- Tenants have no console button to release a stuck slot, though `POST /api/worktrees/{project}/{n}/release` is open to them; offer Release where a tenant sees the holder (node page **Held**, task detail) or close the door to match.
- The static-slots plan cap on `POST /api/worktrees` is now reachable only by the operator acting on their own org; confirm project placement (`routes/projects.py`) enforces the same cap for tenants, with an HTTP-level test.
- `App.test.tsx` "RequirePlanSwitch route guards" lacks a `/org/billing/jaah-ai` row (the Jaah AI page gate is tested only via a copied wiring in `JaahAiPage.test.tsx`).
- The tutorial video in `apps/docs/content/tutorials/nodes-and-capacity.md` still shows the operator-only "Add slots" step; re-record against the project Slots tab.
Out of scope: reopening the Slots page to tenants; plan/billing changes.
Done means: each item fixed or explicitly declined with a reason; api + vitest for any code change; quick gate green.
Outcome
Tenant Release beside node Held slots (shared lib/slotRelease.ts); HTTP test that tenant placement→static slots is capped; App.test Jaah AI row. Video re-record declined → draft #9095. Quick gate green; visual check done; PR #6657 queued.
Artifacts
Activity
- Created
- Run
- Runner started
- Runner ended (done)