{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-0281892df792799a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/apple-iap-webhook/index.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/apple-iap-webhook/index.ts:73"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5f3b13504dec4de", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/leave-family/index.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/leave-family/index.ts:96"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a9bc143acc9ca72", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/mark-iap-paid/index.ts:226", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mark-iap-paid/index.ts:226"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c376466e256d1e3", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-cleanup/index.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-cleanup/index.ts:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e0a4216dbfc196a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/delete-account/index.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/delete-account/index.ts:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1c572dbfd973f81", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-130e831033739449", "name": "TODO/FIXME marker in shipping code \u2014 supabase/functions/buffer-schedule/index.ts:6", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 supabase/functions/buffer-schedule/index.ts:6"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bde39e89b9d4e938", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/medication-reminders/index.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/medication-reminders/index.ts:131"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-842fbaee845fc7b9", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04e31c986268cada", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-chat/index.ts:374", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-chat/index.ts:374"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64b6f4a2b1943546", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/verify-apple-purchase/index.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/verify-apple-purchase/index.ts:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f61c033c9e7d58c8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:83"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-925369bc020d255f", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-ghl-sync/index.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-ghl-sync/index.ts:174"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d512e7a43188f39", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-feedback/index.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-feedback/index.ts:71"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a6968539022ed51", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-sms/index.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-sms/index.ts:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27749668e19d5f56", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/family-message-notify/index.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/family-message-notify/index.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23e561a961fd0d2f", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-downgrade/index.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-downgrade/index.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2615c65270862cb3", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/missed-checkin-alerts/index.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/missed-checkin-alerts/index.ts:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f45c0f93916f8da2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/InstallPrompt.jsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/InstallPrompt.jsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-461af441d8a6ab2f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pushNotifications.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pushNotifications.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b87f2fbd277b933c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/iap.js:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/iap.js:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a7638d437787e7d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/VaultPage.jsx:441", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/VaultPage.jsx:441"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2acb4d218690295f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MaggiePage.jsx:460", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MaggiePage.jsx:460"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-acd4619eace0b903", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AIPage.jsx:895", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AIPage.jsx:895"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e7b814f6636f905", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.jsx:469", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.jsx:469"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc1794599999cfaa", "name": "Stray `console.log` in TS/JS \u2014 src/pages/UpgradePage.jsx:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/UpgradePage.jsx:185"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4f65a4eccfb8e4e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FamilyInvitePage.jsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FamilyInvitePage.jsx:202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e47219b651b8cbe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:952", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:952"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c77ded287990c09", "name": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push-notification/index.ts:49", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push-notification/index.ts:49"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0dc9865080a04cd3", "name": "Possible secret in src/utils/purchases.js", "shortDescription": {"text": "Possible secret in src/utils/purchases.js"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-38050136ab3f76e0", "name": "Insecure pattern 'local_storage_auth_token' in src/pages/SignInPage.jsx:47", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/SignInPage.jsx:47"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dadb2ac5c68e79e7", "name": "Very large file: supabase/functions/maggie-chat/prompts/book_unheard.ts (1084 lines)", "shortDescription": {"text": "Very large file: supabase/functions/maggie-chat/prompts/book_unheard.ts (1084 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58b57b65cacb5a64", "name": "Very large file: supabase/functions/maggie-chat/prompts/system_prompt.ts (1063 lines)", "shortDescription": {"text": "Very large file: supabase/functions/maggie-chat/prompts/system_prompt.ts (1063 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-348143a3861745ad", "name": "Very large file: supabase/functions/maggie-chat/prompts/knowledge_base.ts (1270 lines)", "shortDescription": {"text": "Very large file: supabase/functions/maggie-chat/prompts/knowledge_base.ts (1270 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81a0fafec646cf61", "name": "Very large file: src/pages/DashboardPage.jsx (1233 lines)", "shortDescription": {"text": "Very large file: src/pages/DashboardPage.jsx (1233 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 83 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 77 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 66 placeholder/mock markers across 15 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-adce29caa2879b58", "name": "Commented-code block (5 lines) in supabase/functions/upload-marketing-card/index.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/upload-marketing-card/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d3b47849de6b9bb", "name": "Commented-code block (6 lines) in supabase/functions/newsletter-send/index.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/newsletter-send/index.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8637f373946b4667", "name": "Commented-code block (9 lines) in supabase/functions/meta-capi-trial/index.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/meta-capi-trial/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-983d5f8e8036ce5e", "name": "Commented-code block (5 lines) in supabase/functions/apple-iap-webhook/index.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/apple-iap-webhook/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0eb0ac81326d042", "name": "Commented-code block (12 lines) in supabase/functions/mark-iap-paid/index.ts:8", "shortDescription": {"text": "Commented-code block (12 lines) in supabase/functions/mark-iap-paid/index.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4904354d3067939f", "name": "Legacy-named symbol `system_prompt_v1` in supabase/functions/maggie-chat/index.ts:70", "shortDescription": {"text": "Legacy-named symbol `system_prompt_v1` in supabase/functions/maggie-chat/index.ts:70"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0a11be0512af20d", "name": "Commented-code block (8 lines) in supabase/functions/delete-account/index.ts:227", "shortDescription": {"text": "Commented-code block (8 lines) in supabase/functions/delete-account/index.ts:227"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e385234cfec826b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/delete-account/index.ts:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/delete-account/index.ts:110"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37b8ca327675be38", "name": "Commented-code block (7 lines) in supabase/functions/stripe-webhook/index.ts:36", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/stripe-webhook/index.ts:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc83491a36655794", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts:284", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts:284"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2168af26701c043c", "name": "Commented-code block (5 lines) in supabase/functions/summarize-conversation/index.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/summarize-conversation/index.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc871e9bf9d4c105", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/summarize-conversation/index.ts:174", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/summarize-conversation/index.ts:174"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1aa726fb90c905d1", "name": "Commented-code block (6 lines) in supabase/functions/buffer-schedule/index.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/buffer-schedule/index.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b716771650f5c15f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/medication-reminders/index.ts:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/medication-reminders/index.ts:118"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aaf735286b28b81d", "name": "Commented-code block (7 lines) in supabase/functions/create-checkout/index.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/create-checkout/index.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eecb4f876567b3b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-chat/index.ts:450", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-chat/index.ts:450"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3466fb251f3954c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/verify-apple-purchase/index.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/verify-apple-purchase/index.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a918e7e54bdedcf8", "name": "Commented-code block (6 lines) in supabase/functions/trial-ghl-sync/index.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/trial-ghl-sync/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7924a961f3e6f7b8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-feedback/index.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-feedback/index.ts:155"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d6fa671ed3b8f15", "name": "Commented-code block (6 lines) in supabase/functions/ghl-social-schedule/index.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/ghl-social-schedule/index.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41da640bd350b835", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-sms/index.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-sms/index.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5acf5d174068b9b", "name": "Commented-code block (6 lines) in supabase/functions/family-message-notify/index.ts:74", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/family-message-notify/index.ts:74"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcbfc57b05e306d0", "name": "Commented-code block (5 lines) in supabase/functions/trial-downgrade/index.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/trial-downgrade/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ead77fd824d53e62", "name": "Commented-code block (5 lines) in supabase/functions/missed-checkin-alerts/index.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/missed-checkin-alerts/index.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13ace41a8b25b34b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/missed-checkin-alerts/index.ts:238", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/missed-checkin-alerts/index.ts:238"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21b783a9c6893df4", "name": "Commented-code block (5 lines) in supabase/functions/ghl-proxy/index.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/ghl-proxy/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8d9c1369dcb7afa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push-notification/index.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push-notification/index.ts:190"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f337fd7cc4b0c82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-ads/index.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-ads/index.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d86b77a37a6adebc", "name": "Commented-code block (6 lines) in supabase/functions/_shared/budgets.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/budgets.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4bced875e6cf1f05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d6b27999bee1c24", "name": "Commented-code block (6 lines) in src/utils/purchases.js:33", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/purchases.js:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d44b7d2135df0d70", "name": "Commented-code block (5 lines) in src/components/BottomNav.jsx:96", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/BottomNav.jsx:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff367ae21dd889f0", "name": "Commented-code block (5 lines) in src/lib/attribution.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/attribution.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ebfaa0af4b0ffbf1", "name": "Commented-code block (5 lines) in src/pages/MaggiePage.jsx:85", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/MaggiePage.jsx:85"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9eae3034a620437", "name": "Commented-code block (6 lines) in src/pages/ProfilePage.jsx:138", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/ProfilePage.jsx:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-937b02c83b00ffbe", "name": "Commented-code block (7 lines) in src/pages/UpgradePage.jsx:22", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/UpgradePage.jsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d25796ad7b256197", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/UpgradePage.jsx:285", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/UpgradePage.jsx:285"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7171188e73425d7", "name": "Commented-code block (5 lines) in src/pages/OnboardingPage.jsx:156", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/OnboardingPage.jsx:156"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0db9d10badc0c0d", "name": "Commented-code block (5 lines) in src/pages/DashboardPage.jsx:210", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/DashboardPage.jsx:210"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b9100dd795f4f68", "name": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d3fdd84b07773f0", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18515"}, "properties": {"repository": "rriggins811/SeniorSafe", "repoUrl": "https://github.com/rriggins811/SeniorSafe", "branch": "main"}, "results": [{"ruleId": "scanner-0281892df792799a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/apple-iap-webhook/index.ts:73"}, "properties": {"repobilityId": "66a02bba9565297c", "scanner": "scanner-primary", "fingerprint": "0281892df792799a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5f3b13504dec4de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/leave-family/index.ts:96"}, "properties": {"repobilityId": "1e1003bda7e19225", "scanner": "scanner-primary", "fingerprint": "e5f3b13504dec4de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a9bc143acc9ca72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mark-iap-paid/index.ts:226"}, "properties": {"repobilityId": "2e0a097f0eb095ea", "scanner": "scanner-primary", "fingerprint": "1a9bc143acc9ca72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c376466e256d1e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-cleanup/index.ts:46"}, "properties": {"repobilityId": "4bbed746dbbec3c5", "scanner": "scanner-primary", "fingerprint": "7c376466e256d1e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6e0a4216dbfc196a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/delete-account/index.ts:77"}, "properties": {"repobilityId": "7a129880e764a3df", "scanner": "scanner-primary", "fingerprint": "6e0a4216dbfc196a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1c572dbfd973f81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:102"}, "properties": {"repobilityId": "7c738a141c293866", "scanner": "scanner-primary", "fingerprint": "f1c572dbfd973f81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-130e831033739449", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 supabase/functions/buffer-schedule/index.ts:6"}, "properties": {"repobilityId": "5fcc5174c4ed5022", "scanner": "scanner-primary", "fingerprint": "130e831033739449", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bde39e89b9d4e938", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/medication-reminders/index.ts:131"}, "properties": {"repobilityId": "cfb2bde26ced63c1", "scanner": "scanner-primary", "fingerprint": "bde39e89b9d4e938", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-842fbaee845fc7b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:91"}, "properties": {"repobilityId": "1b4e7a4818b9b3e8", "scanner": "scanner-primary", "fingerprint": "842fbaee845fc7b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04e31c986268cada", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ai-chat/index.ts:374"}, "properties": {"repobilityId": "83d81f53429c359d", "scanner": "scanner-primary", "fingerprint": "04e31c986268cada", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-64b6f4a2b1943546", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/verify-apple-purchase/index.ts:88"}, "properties": {"repobilityId": "3e51c8650c212605", "scanner": "scanner-primary", "fingerprint": "64b6f4a2b1943546", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f61c033c9e7d58c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:83"}, "properties": {"repobilityId": "9a07ccb55d13eac4", "scanner": "scanner-primary", "fingerprint": "f61c033c9e7d58c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-925369bc020d255f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-ghl-sync/index.ts:174"}, "properties": {"repobilityId": "4a0b33def2e9d443", "scanner": "scanner-primary", "fingerprint": "925369bc020d255f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d512e7a43188f39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-feedback/index.ts:71"}, "properties": {"repobilityId": "97f3fe4785148e3a", "scanner": "scanner-primary", "fingerprint": "5d512e7a43188f39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a6968539022ed51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-sms/index.ts:88"}, "properties": {"repobilityId": "81eebdcada02a821", "scanner": "scanner-primary", "fingerprint": "2a6968539022ed51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27749668e19d5f56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/family-message-notify/index.ts:41"}, "properties": {"repobilityId": "7a530d4c8b998acb", "scanner": "scanner-primary", "fingerprint": "27749668e19d5f56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23e561a961fd0d2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-downgrade/index.ts:34"}, "properties": {"repobilityId": "d302484e3b6dc961", "scanner": "scanner-primary", "fingerprint": "23e561a961fd0d2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2615c65270862cb3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/missed-checkin-alerts/index.ts:77"}, "properties": {"repobilityId": "7f69d95e6137eae2", "scanner": "scanner-primary", "fingerprint": "2615c65270862cb3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f45c0f93916f8da2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/InstallPrompt.jsx:79"}, "properties": {"repobilityId": "1a7f55cab5a43cb3", "scanner": "scanner-primary", "fingerprint": "f45c0f93916f8da2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-461af441d8a6ab2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pushNotifications.js:19"}, "properties": {"repobilityId": "7b038029baa9ec85", "scanner": "scanner-primary", "fingerprint": "461af441d8a6ab2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b87f2fbd277b933c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/iap.js:103"}, "properties": {"repobilityId": "cc62795ed6240cc6", "scanner": "scanner-primary", "fingerprint": "b87f2fbd277b933c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a7638d437787e7d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/VaultPage.jsx:441"}, "properties": {"repobilityId": "1d3276176e00370c", "scanner": "scanner-primary", "fingerprint": "9a7638d437787e7d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2acb4d218690295f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MaggiePage.jsx:460"}, "properties": {"repobilityId": "c6298bfbdaf624c1", "scanner": "scanner-primary", "fingerprint": "2acb4d218690295f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-acd4619eace0b903", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AIPage.jsx:895"}, "properties": {"repobilityId": "c858ca719b36850a", "scanner": "scanner-primary", "fingerprint": "acd4619eace0b903", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e7b814f6636f905", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.jsx:469"}, "properties": {"repobilityId": "1b2cd5628ecbc10e", "scanner": "scanner-primary", "fingerprint": "8e7b814f6636f905", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc1794599999cfaa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/UpgradePage.jsx:185"}, "properties": {"repobilityId": "366c906497412826", "scanner": "scanner-primary", "fingerprint": "bc1794599999cfaa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4f65a4eccfb8e4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FamilyInvitePage.jsx:202"}, "properties": {"repobilityId": "347c24c78e3205ea", "scanner": "scanner-primary", "fingerprint": "e4f65a4eccfb8e4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e47219b651b8cbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:952"}, "properties": {"repobilityId": "c1ec453865b8a459", "scanner": "scanner-primary", "fingerprint": "8e47219b651b8cbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c77ded287990c09", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push-notification/index.ts:49"}, "properties": {"repobilityId": "de0e39b22c62f409", "scanner": "scanner-primary", "fingerprint": "8c77ded287990c09", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-push-notification/index.ts"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-0dc9865080a04cd3", "level": "error", "message": {"text": "Possible secret in src/utils/purchases.js"}, "properties": {"repobilityId": "5171a560e216e05f", "scanner": "scanner-primary", "fingerprint": "0dc9865080a04cd3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/purchases.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-0dc9865080a04cd3", "level": "error", "message": {"text": "Possible secret in src/utils/purchases.js"}, "properties": {"repobilityId": "5171a560e216e05f", "scanner": "scanner-primary", "fingerprint": "0dc9865080a04cd3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/purchases.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-38050136ab3f76e0", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/SignInPage.jsx:47"}, "properties": {"repobilityId": "0e50ff1de686b334", "scanner": "scanner-primary", "fingerprint": "38050136ab3f76e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/SignInPage.jsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-dadb2ac5c68e79e7", "level": "note", "message": {"text": "Very large file: supabase/functions/maggie-chat/prompts/book_unheard.ts (1084 lines)"}, "properties": {"repobilityId": "f82839b7886126de", "scanner": "scanner-primary", "fingerprint": "dadb2ac5c68e79e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-58b57b65cacb5a64", "level": "note", "message": {"text": "Very large file: supabase/functions/maggie-chat/prompts/system_prompt.ts (1063 lines)"}, "properties": {"repobilityId": "ec9abfd611bd818a", "scanner": "scanner-primary", "fingerprint": "58b57b65cacb5a64", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-348143a3861745ad", "level": "note", "message": {"text": "Very large file: supabase/functions/maggie-chat/prompts/knowledge_base.ts (1270 lines)"}, "properties": {"repobilityId": "e0183b11af3be771", "scanner": "scanner-primary", "fingerprint": "348143a3861745ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-81a0fafec646cf61", "level": "note", "message": {"text": "Very large file: src/pages/DashboardPage.jsx (1233 lines)"}, "properties": {"repobilityId": "8b5231ac91c8139b", "scanner": "scanner-primary", "fingerprint": "81a0fafec646cf61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "6f5c7b173993601b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f60b2c9b49b2d9dd", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "6a5d02871e5536e3", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "b9475eddaa70b915", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "7560769a292a0288", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "ab1611819f7c0ae6", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "2cd165b7c39c1300", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "432b1c1977fc4e81", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-adce29caa2879b58", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/upload-marketing-card/index.ts:4"}, "properties": {"repobilityId": "a5d3b2149c87b354", "scanner": "scanner-primary", "fingerprint": "adce29caa2879b58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d3b47849de6b9bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/newsletter-send/index.ts:1"}, "properties": {"repobilityId": "4159cd5e4c9ca1a4", "scanner": "scanner-primary", "fingerprint": "5d3b47849de6b9bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8637f373946b4667", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/meta-capi-trial/index.ts:4"}, "properties": {"repobilityId": "37862df7bc62a521", "scanner": "scanner-primary", "fingerprint": "8637f373946b4667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-983d5f8e8036ce5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/apple-iap-webhook/index.ts:4"}, "properties": {"repobilityId": "0974a8a9f90a0a32", "scanner": "scanner-primary", "fingerprint": "983d5f8e8036ce5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0eb0ac81326d042", "level": "none", "message": {"text": "Commented-code block (12 lines) in supabase/functions/mark-iap-paid/index.ts:8"}, "properties": {"repobilityId": "0d8a45f1df24b28a", "scanner": "scanner-primary", "fingerprint": "a0eb0ac81326d042", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4904354d3067939f", "level": "note", "message": {"text": "Legacy-named symbol `system_prompt_v1` in supabase/functions/maggie-chat/index.ts:70"}, "properties": {"repobilityId": "51e284daaf49ea54", "scanner": "scanner-primary", "fingerprint": "4904354d3067939f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c0a11be0512af20d", "level": "none", "message": {"text": "Commented-code block (8 lines) in supabase/functions/delete-account/index.ts:227"}, "properties": {"repobilityId": "da1c395d5f8a511c", "scanner": "scanner-primary", "fingerprint": "c0a11be0512af20d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e385234cfec826b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/delete-account/index.ts:110"}, "properties": {"repobilityId": "c8eb4fc5e5704e47", "scanner": "scanner-primary", "fingerprint": "1e385234cfec826b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37b8ca327675be38", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/stripe-webhook/index.ts:36"}, "properties": {"repobilityId": "cefbabe3d03a80cf", "scanner": "scanner-primary", "fingerprint": "37b8ca327675be38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc83491a36655794", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts:284"}, "properties": {"repobilityId": "0bc96786443e155c", "scanner": "scanner-primary", "fingerprint": "cc83491a36655794", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2168af26701c043c", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/summarize-conversation/index.ts:1"}, "properties": {"repobilityId": "1fff8429eeb0561c", "scanner": "scanner-primary", "fingerprint": "2168af26701c043c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc871e9bf9d4c105", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/summarize-conversation/index.ts:174"}, "properties": {"repobilityId": "952e06d6e89b6cb9", "scanner": "scanner-primary", "fingerprint": "fc871e9bf9d4c105", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1aa726fb90c905d1", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/buffer-schedule/index.ts:1"}, "properties": {"repobilityId": "fe3ab2011b8d7d78", "scanner": "scanner-primary", "fingerprint": "1aa726fb90c905d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b716771650f5c15f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/medication-reminders/index.ts:118"}, "properties": {"repobilityId": "558d8829a0f675ed", "scanner": "scanner-primary", "fingerprint": "b716771650f5c15f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aaf735286b28b81d", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/create-checkout/index.ts:28"}, "properties": {"repobilityId": "3443ed104df06b4a", "scanner": "scanner-primary", "fingerprint": "aaf735286b28b81d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eecb4f876567b3b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-chat/index.ts:450"}, "properties": {"repobilityId": "11221a1b24436813", "scanner": "scanner-primary", "fingerprint": "eecb4f876567b3b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3466fb251f3954c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/verify-apple-purchase/index.ts:48"}, "properties": {"repobilityId": "43bc86c8c4a357aa", "scanner": "scanner-primary", "fingerprint": "3466fb251f3954c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a918e7e54bdedcf8", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/trial-ghl-sync/index.ts:4"}, "properties": {"repobilityId": "1bbae1614a7b2fa7", "scanner": "scanner-primary", "fingerprint": "a918e7e54bdedcf8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7924a961f3e6f7b8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-feedback/index.ts:155"}, "properties": {"repobilityId": "af51637e18347374", "scanner": "scanner-primary", "fingerprint": "7924a961f3e6f7b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d6fa671ed3b8f15", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/ghl-social-schedule/index.ts:8"}, "properties": {"repobilityId": "7628a25756a82a98", "scanner": "scanner-primary", "fingerprint": "5d6fa671ed3b8f15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41da640bd350b835", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-sms/index.ts:44"}, "properties": {"repobilityId": "7c4c3e8a2853954b", "scanner": "scanner-primary", "fingerprint": "41da640bd350b835", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5acf5d174068b9b", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/family-message-notify/index.ts:74"}, "properties": {"repobilityId": "2d6647eed5430f50", "scanner": "scanner-primary", "fingerprint": "d5acf5d174068b9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcbfc57b05e306d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/trial-downgrade/index.ts:4"}, "properties": {"repobilityId": "59f07ce0e8d57748", "scanner": "scanner-primary", "fingerprint": "fcbfc57b05e306d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ead77fd824d53e62", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/missed-checkin-alerts/index.ts:30"}, "properties": {"repobilityId": "750944f8c4d75c47", "scanner": "scanner-primary", "fingerprint": "ead77fd824d53e62", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13ace41a8b25b34b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/missed-checkin-alerts/index.ts:238"}, "properties": {"repobilityId": "cd0378c174d50d8c", "scanner": "scanner-primary", "fingerprint": "13ace41a8b25b34b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-21b783a9c6893df4", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/ghl-proxy/index.ts:3"}, "properties": {"repobilityId": "515301175b4abd32", "scanner": "scanner-primary", "fingerprint": "21b783a9c6893df4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8d9c1369dcb7afa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push-notification/index.ts:190"}, "properties": {"repobilityId": "2904a937dda8779c", "scanner": "scanner-primary", "fingerprint": "f8d9c1369dcb7afa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f337fd7cc4b0c82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-ads/index.ts:15"}, "properties": {"repobilityId": "6036519067a38d38", "scanner": "scanner-primary", "fingerprint": "8f337fd7cc4b0c82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d86b77a37a6adebc", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/budgets.ts:4"}, "properties": {"repobilityId": "571a8cda33b615b8", "scanner": "scanner-primary", "fingerprint": "d86b77a37a6adebc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4bced875e6cf1f05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84"}, "properties": {"repobilityId": "9cc14140e2d64227", "scanner": "scanner-primary", "fingerprint": "4bced875e6cf1f05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d6b27999bee1c24", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/purchases.js:33"}, "properties": {"repobilityId": "91322094249ea1eb", "scanner": "scanner-primary", "fingerprint": "2d6b27999bee1c24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d44b7d2135df0d70", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/BottomNav.jsx:96"}, "properties": {"repobilityId": "21813bbca2b5e4a2", "scanner": "scanner-primary", "fingerprint": "d44b7d2135df0d70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff367ae21dd889f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/attribution.js:1"}, "properties": {"repobilityId": "69a20488daccb8de", "scanner": "scanner-primary", "fingerprint": "ff367ae21dd889f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ebfaa0af4b0ffbf1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/MaggiePage.jsx:85"}, "properties": {"repobilityId": "dbb971034b6d20ac", "scanner": "scanner-primary", "fingerprint": "ebfaa0af4b0ffbf1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9eae3034a620437", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/ProfilePage.jsx:138"}, "properties": {"repobilityId": "1b7282f7b917ee00", "scanner": "scanner-primary", "fingerprint": "b9eae3034a620437", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-937b02c83b00ffbe", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/UpgradePage.jsx:22"}, "properties": {"repobilityId": "4d5d48e9bc5ffbd0", "scanner": "scanner-primary", "fingerprint": "937b02c83b00ffbe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d25796ad7b256197", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/UpgradePage.jsx:285"}, "properties": {"repobilityId": "5da9fd9a7474701e", "scanner": "scanner-primary", "fingerprint": "d25796ad7b256197", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7171188e73425d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/OnboardingPage.jsx:156"}, "properties": {"repobilityId": "905264e4e3e18600", "scanner": "scanner-primary", "fingerprint": "b7171188e73425d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0db9d10badc0c0d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/DashboardPage.jsx:210"}, "properties": {"repobilityId": "07b1fc772ef065e7", "scanner": "scanner-primary", "fingerprint": "b0db9d10badc0c0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b9100dd795f4f68", "level": "warning", "message": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "9107a6dfc004a035", "scanner": "scanner-primary", "fingerprint": "7b9100dd795f4f68", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5d3fdd84b07773f0", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "948b633d8b4e5ac3", "scanner": "scanner-primary", "fingerprint": "5d3fdd84b07773f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}