projectStorage.ts writes project:{id} before updating the projectIds index; if the index write fails it rolls the record back, but if the rollback also fails the orphan persists — never listed, never deleted, pure storage bloat. Add a lazy sweep: when listProjects() runs, optionally reconcile keys against the index (or record failed rollbacks under a pendingCleanup key and retry on next activation). Keep it simple; this is a rare double-failure path.
Size: XS–S
Priority: P3 (opportunistic)
projectStorage.tswritesproject:{id}before updating theprojectIdsindex; if the index write fails it rolls the record back, but if the rollback also fails the orphan persists — never listed, never deleted, pure storage bloat. Add a lazy sweep: whenlistProjects()runs, optionally reconcile keys against the index (or record failed rollbacks under apendingCleanupkey and retry on next activation). Keep it simple; this is a rare double-failure path.Size: XS–S
Priority: P3 (opportunistic)