Cross-tenant exposure and privilege defects โ one tenant's data reachable from another.
None. The p0 and its follow-up census both closed โ see History.
Applied top to bottom; each rung breaks only the ties left above it.
๐ What this deliberately ignores: issue age and filing order; how cheap or well-understood a fix looks; how much of an issue is already merged.
#2938, #2037. A closed issue named as current work is the drift this section exists to surface โ re-derive the prose, or move the reference into History.
Evidence below is generated from the read-only audit of 2026-08-29 and reconciled against the open issues at build time. Every claim cites the issue it came from. Nothing here is a decision โ rulings stay in the prose above, which is written by hand.
Phases 0/1/2 are shipped and reachable (cc827d20a on origin/main; async_execute_query_as_user is called in backend/app/db/pg.py, feed_digest_repository.py (4), feed_intelligence_repository.py (5), needs_you_repository.py, suggested_questions_repository.py (4), services/help/agent/graph_tool.py, and routed conditionally in backend/app/slices/message/repo/search.py:47-54 which returns pg.async_execute_query_as_user when a JWT is present and pg.async_execute_query otherwise). Phase 2d is NOT done: on origin/main the relocated serving repos still call the superuser path โ backend/app/slices/message = 27 plain async_execute_query( calls and 0 as_user; backend/app/slices/edge = 24 plain, 0 as_user; backend/app/slices/node = 3 plain, 0 as_user (git grep over origin/main, test files excluded). The remaining unticked boxes (Phase 2d, eval-harness synthetic JWTs, GET /api/tenants/me/health decision) match that.
8 assessed issues closed since the audit and are not shown โ a closed issue's evidence is history, and printing it as current is how a page starts lying.
None recorded โ track:security carries an empty decided list in track-order.json. The load-bearing open ruling is the default-grant convention decision (#2938); record it in track-order.json when made, so the next session reads it instead of re-asking.
#2968 was found while draining the _v1_substrate_xfail allowlist (batch 4), not caused by that work. The index was recreated verbatim from its pre-tenant form in 20260320163011_rename_groups_to_sources.sql; tenant_id landed three days later (20260323000000_tenant_id_everywhere.sql) and the recreated index was never rescoped. Closed 2026-08-19 by PR #3443, which rescoped the index and added a repository-boundary source_id requirement. A panel lens on that PR filed the follow-up #3446 to check whether the ~5-month exposure window had already lost rows; a read-only prod census across all 9 tenants (2026-08-26) found zero confirmed lost rows on every angle checked, with the two structural blind spots each showing an empty loser-side shadow โ closed measured-no-damage 2026-08-27.
#2037 surfaced during the Regina disclose() + email-spoofing audit (docs/investigations/2026-06-21-regina-email-spoofing-report.md), on the ADR-097 impersonation track.
#2445 surfaced during the ADR-096 read-projection work (#2437). Phases 0โ2 merged 2026-07-16; Phase 2d and the follow-up remain.
#2938 surfaced by the adversarial review on #2936 (ADR-135 stage 4a). tenant_health_snapshot sat world-grantable for three weeks before #2936 revoked it for that one table.
Impersonation (#2037): person node 61b97263-dd6f-484e-aa32-20d361e33b5c ("Kareem") is flagged is_impersonation=true on prod (tenant e9d96b09โฆ). The verdict that flagged it cites a message actually sent from oldenglishsuperstores.com โ a correct phish identification keyed on the forged From and stamped onto the real owner. No evidence or reason is stored on the node (impersonation_evidence/impersonation_reason are null), so the suppression is silent.
Default grants (#2938): measured 2026-08-01 on tenant_health_snapshot โ relacl showed anon=arwdDxtm and authenticated=arwdDxtm (every privilege) with RLS enabled and zero policies.