Files
pad/internal
xarmian cbc2cced9e feat(workspaces): a per-user open set of workspace tabs, stored server-side and filtered on read to the workspaces the caller can see (TASK-3256) (#1619)
PLAN-3002 U1. A new user_workspace_tabs table (migration 098 / pg 073)
holds each user's open tabs: position, an ephemeral flag (at most one per
user) and a same-workspace last_route. The migration seeds each user's
first six live member workspaces in today's bar order (Dave's Q8).

/api/v1/me/workspace-tabs lists, opens, reorders, patches (pin,
last_route) and closes. Every response re-reads the caller's visible set
after the write and serves only tabs in it, so a tab never names a
workspace the caller cannot open, even for a loss path that left its row.
Member removal, grant revoke, soft delete, purge and owner account
deletion also delete rows, as hygiene.

last_route is refused unless it sits under the workspace's own
/{owner}/{ws} prefix, checked on the raw and the percent-decoded path
(codex rounds 1-2: %2e%2e and %252e%252e), and gets a NUL trigger (099).

Web client only; U2 builds the store on top of it.

Claude-Session: https://claude.ai/code/session_01NidgPePY7UvHcEJCMkD2Qz
2026-09-27 14:52:26 -04:00
..
2026-03-26 01:52:36 +00:00