Lanes
One lane at a time — the goal, the critical path, and the current wave of blockers.
NFC/QR Core Pipeline
The core of the product — encoding tags and resolving scans. Everything else is a surface on top of this.
API: make the visibility gate's fail-closed 404 carry a machine-readable reason, so /d /n /v /a and /t can say "unavailable" for a Supabase failure
Open half of draft PR #711 (and the same limit #681 records for /t). enforceVisibility (apps/api/tactile-api/src/middleware/visibility-gate.ts, run in index.ts BEFORE the route handler) covers documents/notes/videos/audio under the default destinations policy, and its first act is a Supabase read of the destinations row. A non-2xx or a throw lands in the catch at visibility-gate.ts ~310-334, which returns a bare notFound(). The route handler never runs, so it never sends its own 500, and the web pages cannot tell that 404 from an unknown hash: a Supabase failure behind a running API Worker still renders "not found" at /d /n /v /a (and /t). #711 only collapses the failures around the gate (Worker/edge 5xx, the 5s timeout, 429, a thrown fetch, a route-level 500, a non-JSON 200) into an "unavailable" card.
No dependencies in this wave — nothing gates it, and nothing waits on it.