{"nodes": [{"id": "plan_fase_6", "label": "Fase 6 \u2014 Deploy readiness (PWA + rate-limit + JWT rotation)", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "concept_inject_manifest_pwa", "label": "PWA injectManifest with custom src/sw.ts + workbox-precaching", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "concept_kong_rate_limit_invitations", "label": "Kong rate-limit 20/hour on POST /rest/v1/collective_invitations", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.3", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "concept_jwt_rotation_script", "label": "rotate-jwt.sh \u2014 HS256 signing script for anon + service_role keys", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.4", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "concept_lighthouse_rls_audit", "label": "just lighthouse + rls-audit.sh tooling", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.5", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "rationale_drop_auth_rate_limit", "label": "Why Kong rate-limit on /auth/v1/token was dropped: Keycloak already has native brute-force protection, and Kong can't distinguish PKCE from password auth", "file_type": "document", "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.3", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "plan_fase_6", "target": "plan_fase_4", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "cierra \u00edtems diferidos de Fase 4", "weight": 1.0}, {"source": "plan_fase_6", "target": "concept_inject_manifest_pwa", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.1", "weight": 1.0}, {"source": "plan_fase_6", "target": "concept_kong_rate_limit_invitations", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.3", "weight": 1.0}, {"source": "plan_fase_6", "target": "concept_jwt_rotation_script", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.4", "weight": 1.0}, {"source": "plan_fase_6", "target": "concept_lighthouse_rls_audit", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.5", "weight": 1.0}, {"source": "rationale_drop_auth_rate_limit", "target": "concept_kong_rate_limit_invitations", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "plan/fase-6-deploy-prep.md", "source_location": "\u00a76.3", "weight": 1.0}], "hyperedges": [{"id": "deploy_readiness_bundle", "label": "Deploy readiness bundle (PWA + rate-limit + JWT rotation + Lighthouse + RLS audit)", "nodes": ["concept_inject_manifest_pwa", "concept_kong_rate_limit_invitations", "concept_jwt_rotation_script", "concept_lighthouse_rls_audit"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 0.95, "source_file": "plan/fase-6-deploy-prep.md"}]}