{"nodes": [{"id": "fase8_doc", "label": "Fase 8 prod auth hardening", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_bug1_empty_role", "label": "Bug 1: empty auth.users.role on self-registration", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L6-L19", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_migration_014", "label": "Migration 014 auth_users_role_update_trigger", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L13-L19", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_ensure_user_role_default_fn", "label": "auth.ensure_user_role_default() function", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L17", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_pgtap_008", "label": "pgTAP 008_auth_user_role_default.sql (11 assertions)", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L19,L61", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_bug2_logout_pkce", "label": "Bug 2: logout doesn't log out + PKCE verifier race", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L21-L57", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_rp_initiated_fix", "label": "Fix: RP-initiated OIDC logout", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L46-L50", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_keycloak_confirm_caveat", "label": "Accepted UX caveat: Keycloak confirmation page", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L52-L57", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_auth_ts", "label": "apps/web/src/lib/auth.ts logout()", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L47", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_app_layout_svelte", "label": "apps/web/src/routes/(app)/+layout.svelte $effect", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L48", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_logged_out_page", "label": "apps/web/src/routes/logged-out/+page.svelte", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L49", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_e2e_auth_tests", "label": "apps/web/tests/e2e/auth.test.ts A-05 + A-07", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L57,L62", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "fase8_deploy_erosi_script", "label": "infra/scripts/deploy-erosi.sh", "file_type": "document", "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L69", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "fase8_bug1_empty_role", "target": "fase8_migration_014", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L13", "weight": 1.0}, {"source": "fase8_migration_014", "target": "fase8_ensure_user_role_default_fn", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L17", "weight": 1.0}, {"source": "fase8_migration_014", "target": "fase8_pgtap_008", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L19", "weight": 1.0}, {"source": "fase8_bug2_logout_pkce", "target": "fase8_rp_initiated_fix", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L46", "weight": 1.0}, {"source": "fase8_rp_initiated_fix", "target": "fase8_auth_ts", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L47", "weight": 1.0}, {"source": "fase8_rp_initiated_fix", "target": "fase8_app_layout_svelte", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L48", "weight": 1.0}, {"source": "fase8_rp_initiated_fix", "target": "fase8_logged_out_page", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L49", "weight": 1.0}, {"source": "fase8_rp_initiated_fix", "target": "fase8_e2e_auth_tests", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L62", "weight": 1.0}, {"source": "fase8_rp_initiated_fix", "target": "fase8_keycloak_confirm_caveat", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L52", "weight": 1.0}, {"source": "fase8_doc", "target": "fase8_bug1_empty_role", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L6", "weight": 1.0}, {"source": "fase8_doc", "target": "fase8_bug2_logout_pkce", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L21", "weight": 1.0}, {"source": "fase8_doc", "target": "fase8_deploy_erosi_script", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "docs/history/fase-8-auth-logout.md", "source_location": "L69", "weight": 1.0}], "hyperedges": [{"id": "logout_race_resolution", "label": "RP-initiated logout + PKCE race mitigation", "nodes": ["fase8_auth_ts", "fase8_app_layout_svelte", "fase8_logged_out_page", "claudemd_islogging_out_flag", "claudemd_gotcha_logout_pkce_race"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 0.95, "source_file": "docs/history/fase-8-auth-logout.md"}, {"id": "auth_users_role_backfill_chain", "label": "auth.users role/aud default trigger chain (migrations 013+014 + function + pgTAP)", "nodes": ["fase8_migration_014", "fase8_ensure_user_role_default_fn", "fase8_pgtap_008", "claudemd_gotcha_gotrue_empty_role", "fase8_bug1_empty_role"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 0.95, "source_file": "docs/history/fase-8-auth-logout.md"}]}