{"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-b761009c24e65105", "name": "Stray `console.log` in TS/JS \u2014 workers/src/index.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workers/src/index.ts:116"}, "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-4a1c0cc7cd150992", "name": "TODO/FIXME marker in shipping code \u2014 src/components/HydrationTile.tsx:11", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/HydrationTile.tsx:11"}, "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-b3d030927c1566e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/FriendCompare.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/FriendCompare.tsx:95"}, "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-75c52b89cd329efa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/AppPrimitives.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/AppPrimitives.tsx:197"}, "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-db87f804bae01a90", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/ui/AppPrimitives.tsx:175", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/ui/AppPrimitives.tsx:175"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd94bdf4de1e23dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Demo.tsx:488", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Demo.tsx:488"}, "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-ebff3b17a1eea26e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Groups.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Groups.tsx:217"}, "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-d8e71743e670bdff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Mobility.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Mobility.tsx:114"}, "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-ea6347d199baeaf6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/EnginePhysical.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/EnginePhysical.tsx:195"}, "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-ecdebb0d33de672f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FoodLog.tsx:443", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FoodLog.tsx:443"}, "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-ce1b7ee32ba55edf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupLeaderboard.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupLeaderboard.tsx:99"}, "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-ed5178a319797dbe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OpsDemoSessions.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OpsDemoSessions.tsx:114"}, "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-ef4ab4c8c8ed8c71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Progress.tsx:405", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Progress.tsx:405"}, "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-ddb4fdf8a6f86098", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupDetail.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupDetail.tsx:107"}, "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-9832e1d82adfe86b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientReview.tsx:596", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientReview.tsx:596"}, "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-e4763ae30174e6d7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Home.tsx:399", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Home.tsx:399"}, "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-13382aa91deee0db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/scan/ScanHistory.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/scan/ScanHistory.tsx:191"}, "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-b9cac4fafffbf6e1", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/local-badges.ts:345", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/local-badges.ts:345"}, "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-6abe0855ce8f1920", "name": "Insecure pattern 'cors_wildcard' in workers/src/index.ts:31", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in workers/src/index.ts:31"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a8e2a0dac6a81d5", "name": "Insecure pattern 'node_child_process' in scripts/smoke-deploy.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-deploy.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f0f14c241cb8e0ba", "name": "Insecure pattern 'node_child_process' in scripts/smoke-browser.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-browser.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-209c1510d71984be", "name": "Insecure pattern 'local_storage_auth_token' in src/pages/Demo.tsx:1897", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/Demo.tsx:1897"}, "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-2ca610661c5e1021", "name": "Very large file: src/pages/Demo.tsx (1902 lines)", "shortDescription": {"text": "Very large file: src/pages/Demo.tsx (1902 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-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 24 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 123 placeholder/mock markers across 41 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-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. 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-ef9ba40d14cc0f05", "name": "Agent instruction/config may expose a secret: docs/CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: docs/CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61f64af4e1b91986", "name": "Agent authority lacks a verifier contract: docs/CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/CLAUDE.md"}, "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-daf44dbc8d793592", "name": "Commented-code block (5 lines) in tailwind.config.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in tailwind.config.js: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-e99dfb26ee8f9862", "name": "Commented-code block (5 lines) in workers/src/types.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/types.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-d87447bd22acb1ac", "name": "Commented-code block (6 lines) in workers/src/lib/food-comment.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/lib/food-comment.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-0356db8f4e50b6e0", "name": "Commented-code block (5 lines) in workers/src/lib/body-language-filter.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/body-language-filter.ts:37"}, "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-3f4ff215b526d99d", "name": "Commented-code block (9 lines) in workers/src/lib/score-calculator.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in workers/src/lib/score-calculator.ts:6"}, "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-591f172ddf691abc", "name": "Commented-code block (6 lines) in workers/src/lib/patterns-store.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/lib/patterns-store.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-b26f6b194e15979f", "name": "Commented-code block (8 lines) in workers/src/lib/scan-vision.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in workers/src/lib/scan-vision.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-04e99049fb5868e7", "name": "Commented-code block (5 lines) in workers/src/lib/auth.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/auth.ts:50"}, "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-da7af17641a0d4af", "name": "Commented-code block (5 lines) in workers/src/lib/safety.ts:212", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/safety.ts:212"}, "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-c25aa8a60adb71ea", "name": "Commented-code block (6 lines) in workers/src/lib/voice-eligibility.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/lib/voice-eligibility.ts:6"}, "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-bc2d40953a2b53af", "name": "Commented-code block (5 lines) in workers/src/lib/score-store.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/score-store.ts:7"}, "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-fcf1f08b5983f8cd", "name": "Commented-code block (8 lines) in workers/src/lib/voice-prompts.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in workers/src/lib/voice-prompts.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-74028af27c17a30d", "name": "Commented-code block (5 lines) in workers/src/lib/memory.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/memory.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-8130a5c468618597", "name": "Commented-code block (9 lines) in workers/src/lib/agent-router.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in workers/src/lib/agent-router.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-29a32c8cd1955435", "name": "Commented-code block (6 lines) in workers/src/lib/conversations.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/lib/conversations.ts:39"}, "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-134af04d5c86ff85", "name": "Commented-code block (5 lines) in workers/src/lib/claude.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/claude.ts:92"}, "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-610fccdaa647aadf", "name": "Commented-code block (8 lines) in workers/src/lib/workout-comment.ts:6", "shortDescription": {"text": "Commented-code block (8 lines) in workers/src/lib/workout-comment.ts:6"}, "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-4bc889e5c367b04a", "name": "Commented-code block (5 lines) in workers/src/lib/schedule-gen.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/schedule-gen.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-5c2d1126439fd831", "name": "Commented-code block (5 lines) in workers/src/lib/groups.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/lib/groups.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-1d92fc449e3ebbec", "name": "Commented-code block (6 lines) in workers/src/lib/prompts/voice.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/lib/prompts/voice.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-d5d1c27f7563ce0e", "name": "Commented-code block (5 lines) in workers/src/routes/demo.ts:231", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/routes/demo.ts:231"}, "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-df9e681402e3f46d", "name": "Commented-code block (7 lines) in workers/src/routes/voice.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in workers/src/routes/voice.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-af4e9c63ede42057", "name": "`fetch()` without try/.catch or AbortSignal \u2014 workers/src/routes/voice.ts:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/src/routes/voice.ts:102"}, "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-e889a42cfc65608e", "name": "Commented-code block (5 lines) in workers/src/routes/journal.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/routes/journal.ts:5"}, "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-52d283f3ea11efe0", "name": "Commented-code block (7 lines) in workers/src/routes/sleep.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in workers/src/routes/sleep.ts:5"}, "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-c8d7176b8ea3f3a3", "name": "Commented-code block (6 lines) in workers/src/routes/scan.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/routes/scan.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-f8ef077a9d002407", "name": "Commented-code block (5 lines) in workers/src/routes/score.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in workers/src/routes/score.ts: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-63e6edb4bc36884f", "name": "Commented-code block (9 lines) in workers/src/routes/check-in.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in workers/src/routes/check-in.ts:6"}, "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-9ef8f6f187d506f3", "name": "Commented-code block (6 lines) in workers/src/routes/workouts.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in workers/src/routes/workouts.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-878a9e8cf6b3d737", "name": "Commented-code block (9 lines) in workers/test/mental-patterns.test.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in workers/test/mental-patterns.test.ts:7"}, "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-7389df6071217dcf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/auth-routing.test.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/auth-routing.test.ts:6"}, "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-050853db9bedd47f", "name": "Commented-code block (8 lines) in workers/test/scan-vision.test.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in workers/test/scan-vision.test.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-c5fdb86c0b5e5d77", "name": "Commented-code block (5 lines) in workers/test/agent-router.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in workers/test/agent-router.test.ts:5"}, "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-84def5628c3a98e9", "name": "Commented-code block (5 lines) in workers/test/group-activity.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in workers/test/group-activity.test.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-b4404fc00d0b98f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/demo-feedback.test.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/demo-feedback.test.ts:69"}, "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-ed11f08bfb874d0e", "name": "Commented-code block (6 lines) in workers/test/food-comment.test.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in workers/test/food-comment.test.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-f9549916240f4b25", "name": "Commented-code block (9 lines) in workers/test/groups.test.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in workers/test/groups.test.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-a2658cc0cbc4b238", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/smoke-browser.mjs:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/smoke-browser.mjs:56"}, "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-c9af417259e9c0b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/teen-sim.mjs:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/teen-sim.mjs:234"}, "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-c8adb95fa0806a62", "name": "Commented-code block (5 lines) in src/components/FlowerProgressBar.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/FlowerProgressBar.tsx: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-452cf7aa3c83c35f", "name": "Commented-code block (6 lines) in src/components/KaiMessage.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/KaiMessage.tsx:5"}, "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-db44349677a98d31", "name": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/components/HydrationTile.tsx:48", "shortDescription": {"text": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/components/HydrationTile.tsx:48"}, "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-c2c0a0015af727f4", "name": "Commented-code block (7 lines) in src/components/HydrationTile.tsx:19", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/HydrationTile.tsx:19"}, "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-3c28b23f93dc6be9", "name": "Commented-code block (5 lines) in src/components/KaiGreeting.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/KaiGreeting.tsx: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-696feefb2c9acf3f", "name": "Commented-code block (6 lines) in src/components/physical/StretchPlayer.tsx:71", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/physical/StretchPlayer.tsx:71"}, "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-10965588b54f1112", "name": "Commented-code block (6 lines) in src/components/physical/WorkoutPlayer.tsx:55", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/physical/WorkoutPlayer.tsx:55"}, "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-ec1aa21f7097b21f", "name": "Commented-code block (5 lines) in src/components/layout/QuickActionSheet.tsx:24", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/QuickActionSheet.tsx:24"}, "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-90367934d910dd31", "name": "Commented-code block (6 lines) in src/components/layout/AppShell.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/layout/AppShell.tsx: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-847da8c2c0903a7a", "name": "Commented-code block (5 lines) in src/components/layout/Tabbar.test.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/Tabbar.test.tsx: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-6fd636c2c24b72a3", "name": "Commented-code block (6 lines) in src/components/layout/Tabbar.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/layout/Tabbar.tsx: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-855723dde4572edd", "name": "Commented-code block (5 lines) in src/components/scan/SilhouetteOverlay.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/scan/SilhouetteOverlay.tsx: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-153864558b5f674c", "name": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Demo.tsx:82", "shortDescription": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Demo.tsx:82"}, "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-32b03eb7c682f098", "name": "Commented-code block (5 lines) in src/pages/CheckIn.tsx:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/CheckIn.tsx:13"}, "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-67ea1251af952906", "name": "Commented-code block (5 lines) in src/pages/Voice.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/Voice.tsx:10"}, "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-2caa2063af0d6469", "name": "Legacy-named symbol `kai_walkthrough_seen_v1` in src/pages/Welcome.tsx:31", "shortDescription": {"text": "Legacy-named symbol `kai_walkthrough_seen_v1` in src/pages/Welcome.tsx:31"}, "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-7a95168231e658d7", "name": "Commented-code block (11 lines) in src/pages/Welcome.tsx:7", "shortDescription": {"text": "Commented-code block (11 lines) in src/pages/Welcome.tsx:7"}, "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-480cb2733c6ab241", "name": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.tsx:155", "shortDescription": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.tsx:155"}, "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-a94132760f685e75", "name": "Commented-code block (8 lines) in src/pages/Onboarding.tsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/pages/Onboarding.tsx: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-9564ae3792acad04", "name": "Commented-code block (5 lines) in src/pages/WorkoutLog.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/WorkoutLog.tsx: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-5b145e63c622e3b0", "name": "Commented-code block (5 lines) in src/pages/FoodLog.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/FoodLog.tsx: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-319ced7b201681f3", "name": "Legacy-named symbol `kai_strengths_responses_v1` in src/pages/Strengths.tsx:34", "shortDescription": {"text": "Legacy-named symbol `kai_strengths_responses_v1` in src/pages/Strengths.tsx:34"}, "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-582facc73f1a9f48", "name": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.test.tsx:40", "shortDescription": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.test.tsx:40"}, "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-e2beec243ca4b10c", "name": "Commented-code block (7 lines) in src/pages/Progress.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/Progress.tsx: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-cb55233c465b23bf", "name": "Commented-code block (5 lines) in src/pages/EnergyCheckIn.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/EnergyCheckIn.tsx: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-b9c8cc1e44377e1b", "name": "Commented-code block (7 lines) in src/pages/GroupDetail.tsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/GroupDetail.tsx: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-512b4dde89f3ebb8", "name": "Legacy-named symbol `kai_client_review_walkthrough_v1` in src/pages/ClientReview.tsx:46", "shortDescription": {"text": "Legacy-named symbol `kai_client_review_walkthrough_v1` in src/pages/ClientReview.tsx:46"}, "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-9436502c7716f98f", "name": "Commented-code block (5 lines) in src/pages/Home.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/Home.tsx: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-475c8ca9b7a2a417", "name": "Legacy-named symbol `kai_scan_first_view_v1` in src/pages/scan/ScanResult.tsx:34", "shortDescription": {"text": "Legacy-named symbol `kai_scan_first_view_v1` in src/pages/scan/ScanResult.tsx:34"}, "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-39a4273a2ff964e8", "name": "Commented-code block (7 lines) in src/pages/scan/ScanResult.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/scan/ScanResult.tsx: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-d62621744e3af080", "name": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanHistory.tsx:26", "shortDescription": {"text": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanHistory.tsx:26"}, "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-239bf95c10f8fca1", "name": "Commented-code block (6 lines) in src/pages/scan/ScanWelcome.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/scan/ScanWelcome.tsx: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-6aefa6b1c2f00217", "name": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanCapture.tsx:351", "shortDescription": {"text": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanCapture.tsx:351"}, "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-2e5e034c33b0c824", "name": "Commented-code block (5 lines) in src/pages/scan/ScanCapture.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/scan/ScanCapture.tsx: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-4a9bf4e3fe1f9ca7", "name": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.ts:37", "shortDescription": {"text": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.ts:37"}, "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-446c82c38dfce1e5", "name": "Legacy-named symbol `kai_northstar_v1` in src/lib/local-northstar.ts:18", "shortDescription": {"text": "Legacy-named symbol `kai_northstar_v1` in src/lib/local-northstar.ts:18"}, "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-c59a65e210a1b670", "name": "Commented-code block (6 lines) in src/lib/local-northstar.ts:112", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/local-northstar.ts:112"}, "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-d26eebd2b458b5fb", "name": "Legacy-named symbol `kai_vault_credential_v1` in src/lib/local-vault.ts:118", "shortDescription": {"text": "Legacy-named symbol `kai_vault_credential_v1` in src/lib/local-vault.ts:118"}, "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-7bfff57ed1c49f4e", "name": "Commented-code block (7 lines) in src/lib/local-vault.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/local-vault.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-d4f59135c2f59c16", "name": "Commented-code block (5 lines) in src/lib/api.ts:66", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api.ts:66"}, "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-62f52be5eb4e36fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:34"}, "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-4970a8f2fd45f0a3", "name": "Legacy-named symbol `kai_screen_time_v1` in src/lib/screen-time.ts:33", "shortDescription": {"text": "Legacy-named symbol `kai_screen_time_v1` in src/lib/screen-time.ts:33"}, "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-637dba2f59a4ba1a", "name": "Commented-code block (5 lines) in src/lib/screen-time.ts:169", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/screen-time.ts:169"}, "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-0608811a7ffb6ebb", "name": "Legacy-named symbol `kai_hydration_v1` in src/lib/local-hydration.ts:13", "shortDescription": {"text": "Legacy-named symbol `kai_hydration_v1` in src/lib/local-hydration.ts:13"}, "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-da90afbdbef80b29", "name": "Legacy-named symbol `kai_streak_milestones_announced_v1` in src/lib/local-streak-milestones.ts:19", "shortDescription": {"text": "Legacy-named symbol `kai_streak_milestones_announced_v1` in src/lib/local-streak-milestones.ts:19"}, "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-0bd42c1bdee3e783", "name": "Legacy-named symbol `kai_mood_log_v1` in src/lib/local-storage.test.ts:36", "shortDescription": {"text": "Legacy-named symbol `kai_mood_log_v1` in src/lib/local-storage.test.ts:36"}, "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-3f2ce96513a25fc6", "name": "Legacy-named symbol `kai_local_inputs_v1` in src/lib/local-score.ts:9", "shortDescription": {"text": "Legacy-named symbol `kai_local_inputs_v1` in src/lib/local-score.ts:9"}, "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-b0a21299cf87ae8e", "name": "Commented-code block (5 lines) in src/lib/local-score.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/local-score.ts:92"}, "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-48ad655abb922256", "name": "Commented-code block (6 lines) in src/lib/onboarding-followups.test.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/onboarding-followups.test.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-81507924e83755ec", "name": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/lib/local-badges.ts:271", "shortDescription": {"text": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/lib/local-badges.ts:271"}, "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-d504ae11ea7124d6", "name": "Legacy-named symbol `kai_pending_onboarding_intake_v1` in src/lib/pending-onboarding-intake.ts:3", "shortDescription": {"text": "Legacy-named symbol `kai_pending_onboarding_intake_v1` in src/lib/pending-onboarding-intake.ts:3"}, "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-4f2076668ae7de42", "name": "Legacy-named symbol `kai_schedule_v1` in src/lib/local-schedule.ts:9", "shortDescription": {"text": "Legacy-named symbol `kai_schedule_v1` in src/lib/local-schedule.ts:9"}, "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-44f9026134093841", "name": "Commented-code block (5 lines) in src/lib/local-schedule.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/local-schedule.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-ca6cdb163cacd011", "name": "Commented-code block (6 lines) in src/lib/chat-actions.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/chat-actions.ts:9"}, "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-d55caaaed914886a", "name": "Legacy-named symbol `kai_scans_v1` in src/lib/scan-storage.ts:52", "shortDescription": {"text": "Legacy-named symbol `kai_scans_v1` in src/lib/scan-storage.ts:52"}, "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-a8e31da81ab8fce1", "name": "Commented-code block (20 lines) in src/lib/scan-storage.ts:3", "shortDescription": {"text": "Commented-code block (20 lines) in src/lib/scan-storage.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-55feed274ffa8a09", "name": "Commented-code block (5 lines) in src/lib/onboarding-followups.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/onboarding-followups.ts:10"}, "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-50817a56ebe4e4bf", "name": "Commented-code block (5 lines) in src/lib/kai-client-context.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/kai-client-context.ts:5"}, "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-ee929bfe82efc891", "name": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.test.ts:58", "shortDescription": {"text": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.test.ts:58"}, "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-e95ad8de8ac7c69f", "name": "Commented-code block (7 lines) in src/lib/local-missions.test.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/local-missions.test.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-2e8ece0a2c0e97c3", "name": "Legacy-named symbol `kai_cycle_v1` in src/lib/local-storage.ts:4", "shortDescription": {"text": "Legacy-named symbol `kai_cycle_v1` in src/lib/local-storage.ts:4"}, "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-a60d833f0a5e4914", "name": "Legacy-named symbol `kai_last_level_seen_v1` in src/lib/local-xp.ts:170", "shortDescription": {"text": "Legacy-named symbol `kai_last_level_seen_v1` in src/lib/local-xp.ts:170"}, "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-136f868d878c602e", "name": "Commented-code block (6 lines) in src/lib/local-xp.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/local-xp.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-1fbf999a5fc7f55b", "name": "Commented-code block (6 lines) in src/lib/local-energy.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/local-energy.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-9b72b04c13d68cac", "name": "Commented-code block (5 lines) in src/lib/nutrition-primer.test.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/nutrition-primer.test.ts:47"}, "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-528b6a38156e5764", "name": "Commented-code block (7 lines) in src/lib/local-hydration.test.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/local-hydration.test.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-e96b380544eb5c0c", "name": "Commented-code block (5 lines) in src/lib/local-xp.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/local-xp.test.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-7ff2920077314b3e", "name": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.ts:104", "shortDescription": {"text": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.ts:104"}, "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-f084a73c7a137d77", "name": "Commented-code block (6 lines) in src/lib/local-challenges.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/local-challenges.ts:6"}, "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-d0f2c4e691f1386e", "name": "Commented-code block (5 lines) in src/lib/local-badges.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/local-badges.test.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-56c35bbe9960bb7d", "name": "Legacy-named symbol `kai_food_history_v1` in src/lib/food-history.ts:27", "shortDescription": {"text": "Legacy-named symbol `kai_food_history_v1` in src/lib/food-history.ts:27"}, "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-72004799d97db459", "name": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.test.ts:117", "shortDescription": {"text": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.test.ts:117"}, "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-e6c4c7cb3b092021", "name": "Legacy-named symbol `kai_local_goals_v1` in src/lib/local-goals.ts:10", "shortDescription": {"text": "Legacy-named symbol `kai_local_goals_v1` in src/lib/local-goals.ts:10"}, "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-a503810d47889237", "name": "Commented-code block (9 lines) in public/sw.js:9", "shortDescription": {"text": "Commented-code block (9 lines) in public/sw.js:9"}, "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-70fcae2d13c708b6", "name": "17 env vars used in code but missing from .env.example", "shortDescription": {"text": "17 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `CHROME_BIN`, `KAI_API_BASE_URL`, `KAI_AUTH_TOKEN`, `KAI_BROWSER_SMOKE_ALLOW_PROD_WRITES`, `KAI_BROWSER_SMOKE_PORT`, `KAI_BROWSER_SMOKE_URL`, `KAI_CHAT_SIM_ENDPOINT` + 9 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58e28d904e78b250", "name": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 src/App.tsx"}, "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-05f9d584b16db584", "name": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 src/App.tsx"}, "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-12bfb4631d98c09e", "name": "Frontend route `/welcome` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/welcome` has no Link/navigate to it \u2014 src/App.tsx"}, "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-07156944cc19b863", "name": "Frontend route `/sleep` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/sleep` has no Link/navigate to it \u2014 src/App.tsx"}, "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-cc5b674b5473636d", "name": "Frontend route `/workout` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/workout` has no Link/navigate to it \u2014 src/App.tsx"}, "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-62649571f16eb126", "name": "Frontend route `/food` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/food` has no Link/navigate to it \u2014 src/App.tsx"}, "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-b43b3132c650ba78", "name": "Frontend route `/mobility/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/mobility/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "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-b220a7991f9a9df4", "name": "Frontend route `/scan/result/:sessionId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/scan/result/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "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-6ad58784158cafb7", "name": "Frontend route `/engine/potential` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/engine/potential` has no Link/navigate to it \u2014 src/App.tsx"}, "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-987e4d99390e87a3", "name": "Frontend route `/engine/:engineId/guides/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/engine/:engineId/guides/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "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-e1796d589d966c33", "name": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "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-3ec6047f1acc7715", "name": "Frontend route `/groups/:id/leaderboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/groups/:id/leaderboard` has no Link/navigate to it \u2014 src/App.tsx"}, "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-df70862320910e54", "name": "Frontend route `/monday-deck` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/monday-deck` has no Link/navigate to it \u2014 src/App.tsx"}, "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-e11b414a7966a17e", "name": "Frontend route `/walkthrough` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/walkthrough` has no Link/navigate to it \u2014 src/App.tsx"}, "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-a58a4c9d10df56bc", "name": "Frontend route `/preview/flower` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/preview/flower` has no Link/navigate to it \u2014 src/App.tsx"}, "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-5a1e5dfadba7f66f", "name": "Frontend route `/design` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/design` has no Link/navigate to it \u2014 src/App.tsx"}, "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-b4b2adc876a8e5f8", "name": "Frontend route `/_design-tokens` has no Link/navigate to it \u2014 src/components/layout/AppShell.test.tsx", "shortDescription": {"text": "Frontend route `/_design-tokens` has no Link/navigate to it \u2014 src/components/layout/AppShell.test.tsx"}, "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-a5eb579bbad11114", "name": "Frontend route `/ops` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/ops` has no Link/navigate to it \u2014 src/App.tsx"}, "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-aeac5754927d4b4c", "name": "Frontend route `/ops/demo-sessions/:sessionId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/ops/demo-sessions/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "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-cffa1ebb198742a5", "name": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (scripts/smoke-browser.mjs:204)", "shortDescription": {"text": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (scripts/smoke-browser.mjs:204)"}, "fullDescription": {"text": "`scripts/smoke-browser.mjs:204` calls `PUT http://127.0.0.1:${port}/json/new?about:blank` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/json/new`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c76cab84c1030c7", "name": "Dangling fetch: GET http://127.0.0.1:${port}/json/version (scripts/smoke-browser.mjs:251)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/json/version (scripts/smoke-browser.mjs:251)"}, "fullDescription": {"text": "`scripts/smoke-browser.mjs:251` calls `GET http://127.0.0.1:${port}/json/version` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/json/version`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5298aa55fb9c5420", "name": "Dangling fetch: POST /api/engines/physical/entries (scripts/smoke-api.mjs:110)", "shortDescription": {"text": "Dangling fetch: POST /api/engines/physical/entries (scripts/smoke-api.mjs:110)"}, "fullDescription": {"text": "`scripts/smoke-api.mjs:110` calls `POST /api/engines/physical/entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/engines/physical/entries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1155b68f3eb2c932", "name": "Dangling fetch: GET /api/engines/physical/entries (scripts/smoke-api.mjs:142)", "shortDescription": {"text": "Dangling fetch: GET /api/engines/physical/entries (scripts/smoke-api.mjs:142)"}, "fullDescription": {"text": "`scripts/smoke-api.mjs:142` calls `GET /api/engines/physical/entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/engines/physical/entries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c89895bddc7d793c", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/scan-vision.ts:202)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/scan-vision.ts:202)"}, "fullDescription": {"text": "`workers/src/lib/scan-vision.ts:202` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e48de78e1e336219", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/vision.ts:127)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/vision.ts:127)"}, "fullDescription": {"text": "`workers/src/lib/vision.ts:127` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71e67c0fb89d7415", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/claude.ts:119)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/claude.ts:119)"}, "fullDescription": {"text": "`workers/src/lib/claude.ts:119` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc0c88a57e5e6d92", "name": "Dangling fetch: POST https://api.bland.ai/v1/calls (workers/src/routes/voice.ts:102)", "shortDescription": {"text": "Dangling fetch: POST https://api.bland.ai/v1/calls (workers/src/routes/voice.ts:102)"}, "fullDescription": {"text": "`workers/src/routes/voice.ts:102` calls `POST https://api.bland.ai/v1/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.bland.ai/v1/calls`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b8073f7bf758f6d0", "name": "Unused endpoint: USE /api/*", "shortDescription": {"text": "Unused endpoint: USE /api/*"}, "fullDescription": {"text": "`workers/src/index.ts` declares `USE /api/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`workers/src/index.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ea341c30f68c2a2", "name": "Unused endpoint: POST /api/safety/log", "shortDescription": {"text": "Unused endpoint: POST /api/safety/log"}, "fullDescription": {"text": "`workers/src/index.ts` declares `POST /api/safety/log` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11eeaf9ea318c60a", "name": "Unused endpoint: GET /api/parent/consent", "shortDescription": {"text": "Unused endpoint: GET /api/parent/consent"}, "fullDescription": {"text": "`workers/src/index.ts` declares `GET /api/parent/consent` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd8b5e6097c9c43a", "name": "Unused endpoint: POST /demo-food-photo", "shortDescription": {"text": "Unused endpoint: POST /demo-food-photo"}, "fullDescription": {"text": "`workers/src/routes/demo.ts` declares `POST /demo-food-photo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-473b6bfa58016529", "name": "Unused endpoint: POST /engines/:engineId/chat", "shortDescription": {"text": "Unused endpoint: POST /engines/:engineId/chat"}, "fullDescription": {"text": "`workers/src/routes/chat.ts` declares `POST /engines/:engineId/chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6920ecea6442704", "name": "Unused endpoint: GET /ops/demo-feedback", "shortDescription": {"text": "Unused endpoint: GET /ops/demo-feedback"}, "fullDescription": {"text": "`workers/src/routes/ops.ts` declares `GET /ops/demo-feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27e93a7844c91fd5", "name": "Unused endpoint: GET /ops/scope-feedback", "shortDescription": {"text": "Unused endpoint: GET /ops/scope-feedback"}, "fullDescription": {"text": "`workers/src/routes/ops.ts` declares `GET /ops/scope-feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d253cee76599414", "name": "Unused endpoint: GET /ops/demo-sessions", "shortDescription": {"text": "Unused endpoint: GET /ops/demo-sessions"}, "fullDescription": {"text": "`workers/src/routes/ops.ts` declares `GET /ops/demo-sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e113230b642031b", "name": "Unused endpoint: GET /ops/demo-sessions/:sessionId", "shortDescription": {"text": "Unused endpoint: GET /ops/demo-sessions/:sessionId"}, "fullDescription": {"text": "`workers/src/routes/ops.ts` declares `GET /ops/demo-sessions/:sessionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-856fef44f141217e", "name": "Unused endpoint: POST /voice/webhook", "shortDescription": {"text": "Unused endpoint: POST /voice/webhook"}, "fullDescription": {"text": "`workers/src/routes/voice.ts` declares `POST /voice/webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd9cf6dc812030e9", "name": "Unused endpoint: GET /voice/recent", "shortDescription": {"text": "Unused endpoint: GET /voice/recent"}, "fullDescription": {"text": "`workers/src/routes/voice.ts` declares `GET /voice/recent` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0738b654bef344d4", "name": "Unused endpoint: POST /scan/analyze", "shortDescription": {"text": "Unused endpoint: POST /scan/analyze"}, "fullDescription": {"text": "`workers/src/routes/scan.ts` declares `POST /scan/analyze` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a33aaf091237744", "name": "Unused endpoint: GET /scan/observations/:sessionId", "shortDescription": {"text": "Unused endpoint: GET /scan/observations/:sessionId"}, "fullDescription": {"text": "`workers/src/routes/scan.ts` declares `GET /scan/observations/:sessionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31d5d4fe7e6e2c4f", "name": "Unused endpoint: GET /scan/observations", "shortDescription": {"text": "Unused endpoint: GET /scan/observations"}, "fullDescription": {"text": "`workers/src/routes/scan.ts` declares `GET /scan/observations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f53c3e8086ff69d6", "name": "Unused endpoint: GET /score/today", "shortDescription": {"text": "Unused endpoint: GET /score/today"}, "fullDescription": {"text": "`workers/src/routes/score.ts` declares `GET /score/today` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fa25eaed4db5a3f", "name": "Unused endpoint: POST /schedule/generate", "shortDescription": {"text": "Unused endpoint: POST /schedule/generate"}, "fullDescription": {"text": "`workers/src/routes/schedule.ts` declares `POST /schedule/generate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e22969641db15ee9", "name": "Unused endpoint: GET /workouts/recent", "shortDescription": {"text": "Unused endpoint: GET /workouts/recent"}, "fullDescription": {"text": "`workers/src/routes/workouts.ts` declares `GET /workouts/recent` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcb688f4fa06c5e9", "name": "Unused endpoint: PATCH /meals/:mealId", "shortDescription": {"text": "Unused endpoint: PATCH /meals/:mealId"}, "fullDescription": {"text": "`workers/src/routes/food.ts` declares `PATCH /meals/:mealId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fb9176583af48cd", "name": "Unused endpoint: GET /friends/compare", "shortDescription": {"text": "Unused endpoint: GET /friends/compare"}, "fullDescription": {"text": "`workers/src/routes/friends.ts` declares `GET /friends/compare` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cd1c70fddde9384", "name": "Unused endpoint: GET /friends", "shortDescription": {"text": "Unused endpoint: GET /friends"}, "fullDescription": {"text": "`workers/src/routes/friends.ts` declares `GET /friends` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1452305cdc80d5d8", "name": "Unused endpoint: POST /friends/request", "shortDescription": {"text": "Unused endpoint: POST /friends/request"}, "fullDescription": {"text": "`workers/src/routes/friends.ts` declares `POST /friends/request` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37218ea98b666509", "name": "Unused endpoint: POST /friends/:friendshipId/accept", "shortDescription": {"text": "Unused endpoint: POST /friends/:friendshipId/accept"}, "fullDescription": {"text": "`workers/src/routes/friends.ts` declares `POST /friends/:friendshipId/accept` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3e7e5fea4199d0c", "name": "Unused endpoint: GET /groups", "shortDescription": {"text": "Unused endpoint: GET /groups"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86f4ce9131125e3a", "name": "Unused endpoint: GET /groups/:id", "shortDescription": {"text": "Unused endpoint: GET /groups/:id"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f05f8890d9a08de8", "name": "Unused endpoint: PATCH /groups/:id/me", "shortDescription": {"text": "Unused endpoint: PATCH /groups/:id/me"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `PATCH /groups/:id/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-281deddb2460ab4f", "name": "Unused endpoint: GET /groups/templates", "shortDescription": {"text": "Unused endpoint: GET /groups/templates"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups/templates` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-520ba31d7ddb50ff", "name": "Unused endpoint: GET /groups/inbox", "shortDescription": {"text": "Unused endpoint: GET /groups/inbox"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups/inbox` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d42d267e060257ea", "name": "Unused endpoint: POST /groups/messages/:id/ack", "shortDescription": {"text": "Unused endpoint: POST /groups/messages/:id/ack"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `POST /groups/messages/:id/ack` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f83c41b0426766c", "name": "Unused endpoint: GET /groups/:id/activity", "shortDescription": {"text": "Unused endpoint: GET /groups/:id/activity"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups/:id/activity` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a0aeafe0fd6ba59b", "name": "Unused endpoint: GET /groups/:id/leaderboard", "shortDescription": {"text": "Unused endpoint: GET /groups/:id/leaderboard"}, "fullDescription": {"text": "`workers/src/routes/groups.ts` declares `GET /groups/:id/leaderboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24790"}, "properties": {"repository": "cafecito-ai/kai", "repoUrl": "https://github.com/cafecito-ai/kai", "branch": "main"}, "results": [{"ruleId": "scanner-b761009c24e65105", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workers/src/index.ts:116"}, "properties": {"repobilityId": "8cb9177600bb9f73", "scanner": "scanner-primary", "fingerprint": "b761009c24e65105", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a1c0cc7cd150992", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/HydrationTile.tsx:11"}, "properties": {"repobilityId": "cb630a6de122e209", "scanner": "scanner-primary", "fingerprint": "4a1c0cc7cd150992", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b3d030927c1566e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tracker/FriendCompare.tsx:95"}, "properties": {"repobilityId": "bb045ddee019efe5", "scanner": "scanner-primary", "fingerprint": "b3d030927c1566e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75c52b89cd329efa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/AppPrimitives.tsx:197"}, "properties": {"repobilityId": "1150baab6560aa28", "scanner": "scanner-primary", "fingerprint": "75c52b89cd329efa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db87f804bae01a90", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/ui/AppPrimitives.tsx:175"}, "properties": {"repobilityId": "aec505d4a7a72b66", "scanner": "scanner-primary", "fingerprint": "db87f804bae01a90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-bd94bdf4de1e23dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Demo.tsx:488"}, "properties": {"repobilityId": "8ff231a9c94bf1a9", "scanner": "scanner-primary", "fingerprint": "bd94bdf4de1e23dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebff3b17a1eea26e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Groups.tsx:217"}, "properties": {"repobilityId": "57cce2b42a520030", "scanner": "scanner-primary", "fingerprint": "ebff3b17a1eea26e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8e71743e670bdff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Mobility.tsx:114"}, "properties": {"repobilityId": "ab31c7731c74d708", "scanner": "scanner-primary", "fingerprint": "d8e71743e670bdff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea6347d199baeaf6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/EnginePhysical.tsx:195"}, "properties": {"repobilityId": "37e2158ad8b53c9a", "scanner": "scanner-primary", "fingerprint": "ea6347d199baeaf6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecdebb0d33de672f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FoodLog.tsx:443"}, "properties": {"repobilityId": "e1aaff58db9d10e5", "scanner": "scanner-primary", "fingerprint": "ecdebb0d33de672f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce1b7ee32ba55edf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupLeaderboard.tsx:99"}, "properties": {"repobilityId": "faef7be501bf395e", "scanner": "scanner-primary", "fingerprint": "ce1b7ee32ba55edf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed5178a319797dbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OpsDemoSessions.tsx:114"}, "properties": {"repobilityId": "b99b5c007c0d1241", "scanner": "scanner-primary", "fingerprint": "ed5178a319797dbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef4ab4c8c8ed8c71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Progress.tsx:405"}, "properties": {"repobilityId": "a4fdaa435173ecfb", "scanner": "scanner-primary", "fingerprint": "ef4ab4c8c8ed8c71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ddb4fdf8a6f86098", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/GroupDetail.tsx:107"}, "properties": {"repobilityId": "8676b370fa89591d", "scanner": "scanner-primary", "fingerprint": "ddb4fdf8a6f86098", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9832e1d82adfe86b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientReview.tsx:596"}, "properties": {"repobilityId": "c14b741a63c0842a", "scanner": "scanner-primary", "fingerprint": "9832e1d82adfe86b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4763ae30174e6d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Home.tsx:399"}, "properties": {"repobilityId": "a939f1527511e497", "scanner": "scanner-primary", "fingerprint": "e4763ae30174e6d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13382aa91deee0db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/scan/ScanHistory.tsx:191"}, "properties": {"repobilityId": "786c348e3dc2fc9c", "scanner": "scanner-primary", "fingerprint": "13382aa91deee0db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9cac4fafffbf6e1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/local-badges.ts:345"}, "properties": {"repobilityId": "0f013355ce0596e1", "scanner": "scanner-primary", "fingerprint": "b9cac4fafffbf6e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6abe0855ce8f1920", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in workers/src/index.ts:31"}, "properties": {"repobilityId": "ede99c9b5b6f7d74", "scanner": "scanner-primary", "fingerprint": "6abe0855ce8f1920", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "workers/src/index.ts"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-8a8e2a0dac6a81d5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-deploy.mjs:1"}, "properties": {"repobilityId": "a3aa0c79f58a34e3", "scanner": "scanner-primary", "fingerprint": "8a8e2a0dac6a81d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke-deploy.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f0f14c241cb8e0ba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-browser.mjs:2"}, "properties": {"repobilityId": "4dfd0e2133716695", "scanner": "scanner-primary", "fingerprint": "f0f14c241cb8e0ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke-browser.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-209c1510d71984be", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/Demo.tsx:1897"}, "properties": {"repobilityId": "b38fe9f3b809c411", "scanner": "scanner-primary", "fingerprint": "209c1510d71984be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/Demo.tsx"}, "region": {"startLine": 1897}}}]}, {"ruleId": "scanner-2ca610661c5e1021", "level": "note", "message": {"text": "Very large file: src/pages/Demo.tsx (1902 lines)"}, "properties": {"repobilityId": "1a570844fc0a9e86", "scanner": "scanner-primary", "fingerprint": "2ca610661c5e1021", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "71d82d2327757565", "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": "9a1e2c716aed4222", "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": "a53ee0bcf700d70b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "452cd381109e68a2", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "64a65efa4b810c17", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4e601c93e65558b9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ef9ba40d14cc0f05", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: docs/CLAUDE.md"}, "properties": {"repobilityId": "154eb496bf2c21db", "scanner": "scanner-primary", "fingerprint": "ef9ba40d14cc0f05", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/CLAUDE.md"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-61f64af4e1b91986", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/CLAUDE.md"}, "properties": {"repobilityId": "d2df5b4e51df9232", "scanner": "scanner-primary", "fingerprint": "61f64af4e1b91986", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-daf44dbc8d793592", "level": "none", "message": {"text": "Commented-code block (5 lines) in tailwind.config.js:4"}, "properties": {"repobilityId": "e0c481e1e1820335", "scanner": "scanner-primary", "fingerprint": "daf44dbc8d793592", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e99dfb26ee8f9862", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/types.ts:30"}, "properties": {"repobilityId": "1bbe71f58373c693", "scanner": "scanner-primary", "fingerprint": "e99dfb26ee8f9862", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d87447bd22acb1ac", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/lib/food-comment.ts:8"}, "properties": {"repobilityId": "7fcaaa093c2ce429", "scanner": "scanner-primary", "fingerprint": "d87447bd22acb1ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0356db8f4e50b6e0", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/body-language-filter.ts:37"}, "properties": {"repobilityId": "6c6245016186b927", "scanner": "scanner-primary", "fingerprint": "0356db8f4e50b6e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f4ff215b526d99d", "level": "none", "message": {"text": "Commented-code block (9 lines) in workers/src/lib/score-calculator.ts:6"}, "properties": {"repobilityId": "f1b678c2d71fd3cd", "scanner": "scanner-primary", "fingerprint": "3f4ff215b526d99d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-591f172ddf691abc", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/lib/patterns-store.ts:3"}, "properties": {"repobilityId": "6ec742dc0a372e12", "scanner": "scanner-primary", "fingerprint": "591f172ddf691abc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b26f6b194e15979f", "level": "none", "message": {"text": "Commented-code block (8 lines) in workers/src/lib/scan-vision.ts:3"}, "properties": {"repobilityId": "e7e81f88a459d996", "scanner": "scanner-primary", "fingerprint": "b26f6b194e15979f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04e99049fb5868e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/auth.ts:50"}, "properties": {"repobilityId": "4da9ccaf8d050150", "scanner": "scanner-primary", "fingerprint": "04e99049fb5868e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da7af17641a0d4af", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/safety.ts:212"}, "properties": {"repobilityId": "2e3a95dfdce4b10f", "scanner": "scanner-primary", "fingerprint": "da7af17641a0d4af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c25aa8a60adb71ea", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/lib/voice-eligibility.ts:6"}, "properties": {"repobilityId": "8d2d7203862c4f57", "scanner": "scanner-primary", "fingerprint": "c25aa8a60adb71ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc2d40953a2b53af", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/score-store.ts:7"}, "properties": {"repobilityId": "fb3ec2db8fe7096a", "scanner": "scanner-primary", "fingerprint": "bc2d40953a2b53af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcf1f08b5983f8cd", "level": "none", "message": {"text": "Commented-code block (8 lines) in workers/src/lib/voice-prompts.ts:3"}, "properties": {"repobilityId": "f47aca5da933cc04", "scanner": "scanner-primary", "fingerprint": "fcf1f08b5983f8cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74028af27c17a30d", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/memory.ts:3"}, "properties": {"repobilityId": "5834c8612bef6136", "scanner": "scanner-primary", "fingerprint": "74028af27c17a30d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8130a5c468618597", "level": "none", "message": {"text": "Commented-code block (9 lines) in workers/src/lib/agent-router.ts:4"}, "properties": {"repobilityId": "c0009d9eb238dd3d", "scanner": "scanner-primary", "fingerprint": "8130a5c468618597", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29a32c8cd1955435", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/lib/conversations.ts:39"}, "properties": {"repobilityId": "e9afd5f70a5090e4", "scanner": "scanner-primary", "fingerprint": "29a32c8cd1955435", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-134af04d5c86ff85", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/claude.ts:92"}, "properties": {"repobilityId": "ad8f49d2fbde75a6", "scanner": "scanner-primary", "fingerprint": "134af04d5c86ff85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-610fccdaa647aadf", "level": "none", "message": {"text": "Commented-code block (8 lines) in workers/src/lib/workout-comment.ts:6"}, "properties": {"repobilityId": "d10ecab4a98337d3", "scanner": "scanner-primary", "fingerprint": "610fccdaa647aadf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4bc889e5c367b04a", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/schedule-gen.ts:4"}, "properties": {"repobilityId": "ce9caeeb237adf76", "scanner": "scanner-primary", "fingerprint": "4bc889e5c367b04a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c2d1126439fd831", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/lib/groups.ts:3"}, "properties": {"repobilityId": "0b3cbed1e9ecb603", "scanner": "scanner-primary", "fingerprint": "5c2d1126439fd831", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d92fc449e3ebbec", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/lib/prompts/voice.ts:3"}, "properties": {"repobilityId": "199c97f728154707", "scanner": "scanner-primary", "fingerprint": "1d92fc449e3ebbec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5d1c27f7563ce0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/routes/demo.ts:231"}, "properties": {"repobilityId": "778d144d07c983c1", "scanner": "scanner-primary", "fingerprint": "d5d1c27f7563ce0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df9e681402e3f46d", "level": "none", "message": {"text": "Commented-code block (7 lines) in workers/src/routes/voice.ts:3"}, "properties": {"repobilityId": "20b24e0b5c1a8a9f", "scanner": "scanner-primary", "fingerprint": "df9e681402e3f46d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af4e9c63ede42057", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/src/routes/voice.ts:102"}, "properties": {"repobilityId": "480dc0030ad0c749", "scanner": "scanner-primary", "fingerprint": "af4e9c63ede42057", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e889a42cfc65608e", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/routes/journal.ts:5"}, "properties": {"repobilityId": "3610af981c150c1c", "scanner": "scanner-primary", "fingerprint": "e889a42cfc65608e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52d283f3ea11efe0", "level": "none", "message": {"text": "Commented-code block (7 lines) in workers/src/routes/sleep.ts:5"}, "properties": {"repobilityId": "fc72f0fe9bc21b72", "scanner": "scanner-primary", "fingerprint": "52d283f3ea11efe0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8d7176b8ea3f3a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/routes/scan.ts:3"}, "properties": {"repobilityId": "e02bbbecd5c405e0", "scanner": "scanner-primary", "fingerprint": "c8d7176b8ea3f3a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8ef077a9d002407", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/src/routes/score.ts:96"}, "properties": {"repobilityId": "a713e1680aa74569", "scanner": "scanner-primary", "fingerprint": "f8ef077a9d002407", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63e6edb4bc36884f", "level": "none", "message": {"text": "Commented-code block (9 lines) in workers/src/routes/check-in.ts:6"}, "properties": {"repobilityId": "b78a593c64cb6df6", "scanner": "scanner-primary", "fingerprint": "63e6edb4bc36884f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ef8f6f187d506f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/src/routes/workouts.ts:3"}, "properties": {"repobilityId": "8a144e5de1b40d30", "scanner": "scanner-primary", "fingerprint": "9ef8f6f187d506f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-878a9e8cf6b3d737", "level": "none", "message": {"text": "Commented-code block (9 lines) in workers/test/mental-patterns.test.ts:7"}, "properties": {"repobilityId": "0e5c86d06629bb5b", "scanner": "scanner-primary", "fingerprint": "878a9e8cf6b3d737", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7389df6071217dcf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/auth-routing.test.ts:6"}, "properties": {"repobilityId": "c4a7f117d79172eb", "scanner": "scanner-primary", "fingerprint": "7389df6071217dcf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-050853db9bedd47f", "level": "none", "message": {"text": "Commented-code block (8 lines) in workers/test/scan-vision.test.ts:3"}, "properties": {"repobilityId": "1b40fdf4e7cfd15d", "scanner": "scanner-primary", "fingerprint": "050853db9bedd47f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5fdb86c0b5e5d77", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/test/agent-router.test.ts:5"}, "properties": {"repobilityId": "bea954a9aaf1344f", "scanner": "scanner-primary", "fingerprint": "c5fdb86c0b5e5d77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84def5628c3a98e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/test/group-activity.test.ts:3"}, "properties": {"repobilityId": "2716e53a8cef834e", "scanner": "scanner-primary", "fingerprint": "84def5628c3a98e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4404fc00d0b98f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 workers/test/demo-feedback.test.ts:69"}, "properties": {"repobilityId": "fa409ebdd8d736d6", "scanner": "scanner-primary", "fingerprint": "b4404fc00d0b98f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ed11f08bfb874d0e", "level": "none", "message": {"text": "Commented-code block (6 lines) in workers/test/food-comment.test.ts:3"}, "properties": {"repobilityId": "424dcfa6b7a74824", "scanner": "scanner-primary", "fingerprint": "ed11f08bfb874d0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9549916240f4b25", "level": "none", "message": {"text": "Commented-code block (9 lines) in workers/test/groups.test.ts:3"}, "properties": {"repobilityId": "74ec268a026e41f6", "scanner": "scanner-primary", "fingerprint": "f9549916240f4b25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2658cc0cbc4b238", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/smoke-browser.mjs:56"}, "properties": {"repobilityId": "66b5b55c844d231c", "scanner": "scanner-primary", "fingerprint": "a2658cc0cbc4b238", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9af417259e9c0b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/teen-sim.mjs:234"}, "properties": {"repobilityId": "7a5763bb038da8e4", "scanner": "scanner-primary", "fingerprint": "c9af417259e9c0b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c8adb95fa0806a62", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/FlowerProgressBar.tsx:8"}, "properties": {"repobilityId": "a8bb9d03908abb38", "scanner": "scanner-primary", "fingerprint": "c8adb95fa0806a62", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-452cf7aa3c83c35f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/KaiMessage.tsx:5"}, "properties": {"repobilityId": "7efff5fa91a5de8f", "scanner": "scanner-primary", "fingerprint": "452cf7aa3c83c35f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db44349677a98d31", "level": "note", "message": {"text": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/components/HydrationTile.tsx:48"}, "properties": {"repobilityId": "615c238f407cd83a", "scanner": "scanner-primary", "fingerprint": "db44349677a98d31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c2c0a0015af727f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/HydrationTile.tsx:19"}, "properties": {"repobilityId": "b346acd0b23e2ff2", "scanner": "scanner-primary", "fingerprint": "c2c0a0015af727f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c28b23f93dc6be9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/KaiGreeting.tsx:3"}, "properties": {"repobilityId": "7c3a7bf08bbc21eb", "scanner": "scanner-primary", "fingerprint": "3c28b23f93dc6be9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-696feefb2c9acf3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/physical/StretchPlayer.tsx:71"}, "properties": {"repobilityId": "de8505ef97aee09e", "scanner": "scanner-primary", "fingerprint": "696feefb2c9acf3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10965588b54f1112", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/physical/WorkoutPlayer.tsx:55"}, "properties": {"repobilityId": "25acd89b3a760a62", "scanner": "scanner-primary", "fingerprint": "10965588b54f1112", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec1aa21f7097b21f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/QuickActionSheet.tsx:24"}, "properties": {"repobilityId": "1ba2a59c4deca383", "scanner": "scanner-primary", "fingerprint": "ec1aa21f7097b21f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90367934d910dd31", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/layout/AppShell.tsx:3"}, "properties": {"repobilityId": "272dcb57063efa78", "scanner": "scanner-primary", "fingerprint": "90367934d910dd31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-847da8c2c0903a7a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/Tabbar.test.tsx:1"}, "properties": {"repobilityId": "8e112760b75bad1b", "scanner": "scanner-primary", "fingerprint": "847da8c2c0903a7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fd636c2c24b72a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/layout/Tabbar.tsx:3"}, "properties": {"repobilityId": "cd1820e026bc9dc7", "scanner": "scanner-primary", "fingerprint": "6fd636c2c24b72a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-855723dde4572edd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/scan/SilhouetteOverlay.tsx:3"}, "properties": {"repobilityId": "93c18998a70fa13f", "scanner": "scanner-primary", "fingerprint": "855723dde4572edd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-153864558b5f674c", "level": "note", "message": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Demo.tsx:82"}, "properties": {"repobilityId": "5ce4370dbf89bb50", "scanner": "scanner-primary", "fingerprint": "153864558b5f674c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-32b03eb7c682f098", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/CheckIn.tsx:13"}, "properties": {"repobilityId": "81fd7a469570b607", "scanner": "scanner-primary", "fingerprint": "32b03eb7c682f098", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67ea1251af952906", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/Voice.tsx:10"}, "properties": {"repobilityId": "b6ff57e7e426f7e2", "scanner": "scanner-primary", "fingerprint": "67ea1251af952906", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2caa2063af0d6469", "level": "note", "message": {"text": "Legacy-named symbol `kai_walkthrough_seen_v1` in src/pages/Welcome.tsx:31"}, "properties": {"repobilityId": "9a5dfa9f30e85358", "scanner": "scanner-primary", "fingerprint": "2caa2063af0d6469", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7a95168231e658d7", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/pages/Welcome.tsx:7"}, "properties": {"repobilityId": "9708574e453ca0fc", "scanner": "scanner-primary", "fingerprint": "7a95168231e658d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-480cb2733c6ab241", "level": "note", "message": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.tsx:155"}, "properties": {"repobilityId": "1d2b28e5e0f485a9", "scanner": "scanner-primary", "fingerprint": "480cb2733c6ab241", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a94132760f685e75", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/pages/Onboarding.tsx:3"}, "properties": {"repobilityId": "c3a866744279ebe3", "scanner": "scanner-primary", "fingerprint": "a94132760f685e75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9564ae3792acad04", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/WorkoutLog.tsx:3"}, "properties": {"repobilityId": "31b54ebc13d29a73", "scanner": "scanner-primary", "fingerprint": "9564ae3792acad04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b145e63c622e3b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/FoodLog.tsx:8"}, "properties": {"repobilityId": "c26abe54155c88ec", "scanner": "scanner-primary", "fingerprint": "5b145e63c622e3b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319ced7b201681f3", "level": "note", "message": {"text": "Legacy-named symbol `kai_strengths_responses_v1` in src/pages/Strengths.tsx:34"}, "properties": {"repobilityId": "942eea2f862dc413", "scanner": "scanner-primary", "fingerprint": "319ced7b201681f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-582facc73f1a9f48", "level": "note", "message": {"text": "Legacy-named symbol `kai_demo_build_v1` in src/pages/Onboarding.test.tsx:40"}, "properties": {"repobilityId": "0c0671e90ab3475d", "scanner": "scanner-primary", "fingerprint": "582facc73f1a9f48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e2beec243ca4b10c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/Progress.tsx:3"}, "properties": {"repobilityId": "80ca08a95db8e06a", "scanner": "scanner-primary", "fingerprint": "e2beec243ca4b10c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb55233c465b23bf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/EnergyCheckIn.tsx:3"}, "properties": {"repobilityId": "bb9a34d23a4676b7", "scanner": "scanner-primary", "fingerprint": "cb55233c465b23bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9c8cc1e44377e1b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/GroupDetail.tsx:4"}, "properties": {"repobilityId": "16b436cee15d062c", "scanner": "scanner-primary", "fingerprint": "b9c8cc1e44377e1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-512b4dde89f3ebb8", "level": "note", "message": {"text": "Legacy-named symbol `kai_client_review_walkthrough_v1` in src/pages/ClientReview.tsx:46"}, "properties": {"repobilityId": "e67f63d4a237a264", "scanner": "scanner-primary", "fingerprint": "512b4dde89f3ebb8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9436502c7716f98f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/Home.tsx:8"}, "properties": {"repobilityId": "25fa178fc480f7fe", "scanner": "scanner-primary", "fingerprint": "9436502c7716f98f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-475c8ca9b7a2a417", "level": "note", "message": {"text": "Legacy-named symbol `kai_scan_first_view_v1` in src/pages/scan/ScanResult.tsx:34"}, "properties": {"repobilityId": "80e86759adc2ba58", "scanner": "scanner-primary", "fingerprint": "475c8ca9b7a2a417", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-39a4273a2ff964e8", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/scan/ScanResult.tsx:3"}, "properties": {"repobilityId": "60417bbb379d4ea6", "scanner": "scanner-primary", "fingerprint": "39a4273a2ff964e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d62621744e3af080", "level": "note", "message": {"text": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanHistory.tsx:26"}, "properties": {"repobilityId": "63f2dea299900daa", "scanner": "scanner-primary", "fingerprint": "d62621744e3af080", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-239bf95c10f8fca1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/scan/ScanWelcome.tsx:3"}, "properties": {"repobilityId": "7e7501d45b1ef939", "scanner": "scanner-primary", "fingerprint": "239bf95c10f8fca1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aefa6b1c2f00217", "level": "note", "message": {"text": "Legacy-named symbol `kai_scan_device_secret_v1` in src/pages/scan/ScanCapture.tsx:351"}, "properties": {"repobilityId": "6e6c9380a3bea216", "scanner": "scanner-primary", "fingerprint": "6aefa6b1c2f00217", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2e5e034c33b0c824", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/scan/ScanCapture.tsx:3"}, "properties": {"repobilityId": "af316d85100eff55", "scanner": "scanner-primary", "fingerprint": "2e5e034c33b0c824", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a9bf4e3fe1f9ca7", "level": "note", "message": {"text": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.ts:37"}, "properties": {"repobilityId": "184f9fa3d0543d3a", "scanner": "scanner-primary", "fingerprint": "4a9bf4e3fe1f9ca7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-446c82c38dfce1e5", "level": "note", "message": {"text": "Legacy-named symbol `kai_northstar_v1` in src/lib/local-northstar.ts:18"}, "properties": {"repobilityId": "37abc3b7897f8cea", "scanner": "scanner-primary", "fingerprint": "446c82c38dfce1e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c59a65e210a1b670", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/local-northstar.ts:112"}, "properties": {"repobilityId": "1aae4e538aebd9da", "scanner": "scanner-primary", "fingerprint": "c59a65e210a1b670", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d26eebd2b458b5fb", "level": "note", "message": {"text": "Legacy-named symbol `kai_vault_credential_v1` in src/lib/local-vault.ts:118"}, "properties": {"repobilityId": "28a523a919aa6f0d", "scanner": "scanner-primary", "fingerprint": "d26eebd2b458b5fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7bfff57ed1c49f4e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/local-vault.ts:3"}, "properties": {"repobilityId": "6291be9f10640c10", "scanner": "scanner-primary", "fingerprint": "7bfff57ed1c49f4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4f59135c2f59c16", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api.ts:66"}, "properties": {"repobilityId": "6f1c09ca054abf33", "scanner": "scanner-primary", "fingerprint": "d4f59135c2f59c16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62f52be5eb4e36fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:34"}, "properties": {"repobilityId": "02adebf67f03e462", "scanner": "scanner-primary", "fingerprint": "62f52be5eb4e36fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4970a8f2fd45f0a3", "level": "note", "message": {"text": "Legacy-named symbol `kai_screen_time_v1` in src/lib/screen-time.ts:33"}, "properties": {"repobilityId": "d3002cbce996bf6d", "scanner": "scanner-primary", "fingerprint": "4970a8f2fd45f0a3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-637dba2f59a4ba1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/screen-time.ts:169"}, "properties": {"repobilityId": "834f9dd1dc6da720", "scanner": "scanner-primary", "fingerprint": "637dba2f59a4ba1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0608811a7ffb6ebb", "level": "note", "message": {"text": "Legacy-named symbol `kai_hydration_v1` in src/lib/local-hydration.ts:13"}, "properties": {"repobilityId": "495353aa61885d7a", "scanner": "scanner-primary", "fingerprint": "0608811a7ffb6ebb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da90afbdbef80b29", "level": "note", "message": {"text": "Legacy-named symbol `kai_streak_milestones_announced_v1` in src/lib/local-streak-milestones.ts:19"}, "properties": {"repobilityId": "318a4cddf0d5726b", "scanner": "scanner-primary", "fingerprint": "da90afbdbef80b29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0bd42c1bdee3e783", "level": "note", "message": {"text": "Legacy-named symbol `kai_mood_log_v1` in src/lib/local-storage.test.ts:36"}, "properties": {"repobilityId": "cbe3f6c20fc705c9", "scanner": "scanner-primary", "fingerprint": "0bd42c1bdee3e783", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3f2ce96513a25fc6", "level": "note", "message": {"text": "Legacy-named symbol `kai_local_inputs_v1` in src/lib/local-score.ts:9"}, "properties": {"repobilityId": "0172d1d12e6dfa51", "scanner": "scanner-primary", "fingerprint": "3f2ce96513a25fc6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b0a21299cf87ae8e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/local-score.ts:92"}, "properties": {"repobilityId": "a63bfe5fad1774e9", "scanner": "scanner-primary", "fingerprint": "b0a21299cf87ae8e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48ad655abb922256", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/onboarding-followups.test.ts:3"}, "properties": {"repobilityId": "9df3c2ed6f0bdcab", "scanner": "scanner-primary", "fingerprint": "48ad655abb922256", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81507924e83755ec", "level": "note", "message": {"text": "Legacy-named symbol `kai_hydration_celebrated_v1` in src/lib/local-badges.ts:271"}, "properties": {"repobilityId": "b62f0f5be0a6bc76", "scanner": "scanner-primary", "fingerprint": "81507924e83755ec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d504ae11ea7124d6", "level": "note", "message": {"text": "Legacy-named symbol `kai_pending_onboarding_intake_v1` in src/lib/pending-onboarding-intake.ts:3"}, "properties": {"repobilityId": "41f724d118a5bacf", "scanner": "scanner-primary", "fingerprint": "d504ae11ea7124d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4f2076668ae7de42", "level": "note", "message": {"text": "Legacy-named symbol `kai_schedule_v1` in src/lib/local-schedule.ts:9"}, "properties": {"repobilityId": "5beacd85f74486fb", "scanner": "scanner-primary", "fingerprint": "4f2076668ae7de42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-44f9026134093841", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/local-schedule.ts:3"}, "properties": {"repobilityId": "309e3cc50a905c62", "scanner": "scanner-primary", "fingerprint": "44f9026134093841", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca6cdb163cacd011", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/chat-actions.ts:9"}, "properties": {"repobilityId": "c81498161ea510e8", "scanner": "scanner-primary", "fingerprint": "ca6cdb163cacd011", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d55caaaed914886a", "level": "note", "message": {"text": "Legacy-named symbol `kai_scans_v1` in src/lib/scan-storage.ts:52"}, "properties": {"repobilityId": "c6413d698a07db35", "scanner": "scanner-primary", "fingerprint": "d55caaaed914886a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8e31da81ab8fce1", "level": "none", "message": {"text": "Commented-code block (20 lines) in src/lib/scan-storage.ts:3"}, "properties": {"repobilityId": "81b2b33b6110730d", "scanner": "scanner-primary", "fingerprint": "a8e31da81ab8fce1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55feed274ffa8a09", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/onboarding-followups.ts:10"}, "properties": {"repobilityId": "5e3bde286ec25612", "scanner": "scanner-primary", "fingerprint": "55feed274ffa8a09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50817a56ebe4e4bf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/kai-client-context.ts:5"}, "properties": {"repobilityId": "b2a36b883a6696f5", "scanner": "scanner-primary", "fingerprint": "50817a56ebe4e4bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee929bfe82efc891", "level": "note", "message": {"text": "Legacy-named symbol `kai_missions_v1` in src/lib/local-missions.test.ts:58"}, "properties": {"repobilityId": "94f74f6f28dc82b7", "scanner": "scanner-primary", "fingerprint": "ee929bfe82efc891", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e95ad8de8ac7c69f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/local-missions.test.ts:3"}, "properties": {"repobilityId": "36cc303a5c1718f5", "scanner": "scanner-primary", "fingerprint": "e95ad8de8ac7c69f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e8ece0a2c0e97c3", "level": "note", "message": {"text": "Legacy-named symbol `kai_cycle_v1` in src/lib/local-storage.ts:4"}, "properties": {"repobilityId": "68b0c2c54971eee5", "scanner": "scanner-primary", "fingerprint": "2e8ece0a2c0e97c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a60d833f0a5e4914", "level": "note", "message": {"text": "Legacy-named symbol `kai_last_level_seen_v1` in src/lib/local-xp.ts:170"}, "properties": {"repobilityId": "347c70d2884dc80a", "scanner": "scanner-primary", "fingerprint": "a60d833f0a5e4914", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-136f868d878c602e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/local-xp.ts:3"}, "properties": {"repobilityId": "e393f1b79ecf7bff", "scanner": "scanner-primary", "fingerprint": "136f868d878c602e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fbf999a5fc7f55b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/local-energy.ts:3"}, "properties": {"repobilityId": "dae24b9e5520e678", "scanner": "scanner-primary", "fingerprint": "1fbf999a5fc7f55b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b72b04c13d68cac", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/nutrition-primer.test.ts:47"}, "properties": {"repobilityId": "c57b21523096a72a", "scanner": "scanner-primary", "fingerprint": "9b72b04c13d68cac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-528b6a38156e5764", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/local-hydration.test.ts:3"}, "properties": {"repobilityId": "7d6578e7551000ad", "scanner": "scanner-primary", "fingerprint": "528b6a38156e5764", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e96b380544eb5c0c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/local-xp.test.ts:3"}, "properties": {"repobilityId": "4a897c3b3f73a665", "scanner": "scanner-primary", "fingerprint": "e96b380544eb5c0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ff2920077314b3e", "level": "note", "message": {"text": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.ts:104"}, "properties": {"repobilityId": "751d6ffabab9c469", "scanner": "scanner-primary", "fingerprint": "7ff2920077314b3e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f084a73c7a137d77", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/local-challenges.ts:6"}, "properties": {"repobilityId": "9e1c93025f826eec", "scanner": "scanner-primary", "fingerprint": "f084a73c7a137d77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0f2c4e691f1386e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/local-badges.test.ts:3"}, "properties": {"repobilityId": "703bcdff58574db5", "scanner": "scanner-primary", "fingerprint": "d0f2c4e691f1386e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56c35bbe9960bb7d", "level": "note", "message": {"text": "Legacy-named symbol `kai_food_history_v1` in src/lib/food-history.ts:27"}, "properties": {"repobilityId": "5da42a8081b31887", "scanner": "scanner-primary", "fingerprint": "56c35bbe9960bb7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-72004799d97db459", "level": "note", "message": {"text": "Legacy-named symbol `kai_challenges_v1` in src/lib/local-challenges.test.ts:117"}, "properties": {"repobilityId": "72e5e132f83a23f6", "scanner": "scanner-primary", "fingerprint": "72004799d97db459", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e6c4c7cb3b092021", "level": "note", "message": {"text": "Legacy-named symbol `kai_local_goals_v1` in src/lib/local-goals.ts:10"}, "properties": {"repobilityId": "52ebc530fa0a68a1", "scanner": "scanner-primary", "fingerprint": "e6c4c7cb3b092021", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a503810d47889237", "level": "none", "message": {"text": "Commented-code block (9 lines) in public/sw.js:9"}, "properties": {"repobilityId": "a4746cba7f264e13", "scanner": "scanner-primary", "fingerprint": "a503810d47889237", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70fcae2d13c708b6", "level": "note", "message": {"text": "17 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f21675bed249619c", "scanner": "scanner-primary", "fingerprint": "70fcae2d13c708b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-58e28d904e78b250", "level": "warning", "message": {"text": "Frontend route `/sign-in/*` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "609d45d98189fb50", "scanner": "scanner-primary", "fingerprint": "58e28d904e78b250", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-05f9d584b16db584", "level": "warning", "message": {"text": "Frontend route `/sign-up/*` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1eb47e65dd09eda2", "scanner": "scanner-primary", "fingerprint": "05f9d584b16db584", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-12bfb4631d98c09e", "level": "warning", "message": {"text": "Frontend route `/welcome` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a443ecf06ee5f3d3", "scanner": "scanner-primary", "fingerprint": "12bfb4631d98c09e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-07156944cc19b863", "level": "warning", "message": {"text": "Frontend route `/sleep` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "940e48ce5b9ef418", "scanner": "scanner-primary", "fingerprint": "07156944cc19b863", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cc5b674b5473636d", "level": "warning", "message": {"text": "Frontend route `/workout` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c8cd1676d6174fa6", "scanner": "scanner-primary", "fingerprint": "cc5b674b5473636d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-62649571f16eb126", "level": "warning", "message": {"text": "Frontend route `/food` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4d6a9fd984c5d9eb", "scanner": "scanner-primary", "fingerprint": "62649571f16eb126", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b43b3132c650ba78", "level": "warning", "message": {"text": "Frontend route `/mobility/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "96f12d5788e3c9e3", "scanner": "scanner-primary", "fingerprint": "b43b3132c650ba78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b220a7991f9a9df4", "level": "warning", "message": {"text": "Frontend route `/scan/result/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "247f579affe31c74", "scanner": "scanner-primary", "fingerprint": "b220a7991f9a9df4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6ad58784158cafb7", "level": "warning", "message": {"text": "Frontend route `/engine/potential` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "628d5d703fb0b9a3", "scanner": "scanner-primary", "fingerprint": "6ad58784158cafb7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-987e4d99390e87a3", "level": "warning", "message": {"text": "Frontend route `/engine/:engineId/guides/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "974234a128f9cfc5", "scanner": "scanner-primary", "fingerprint": "987e4d99390e87a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e1796d589d966c33", "level": "warning", "message": {"text": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d7ab1a1b157e83af", "scanner": "scanner-primary", "fingerprint": "e1796d589d966c33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3ec6047f1acc7715", "level": "warning", "message": {"text": "Frontend route `/groups/:id/leaderboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "608004380771ccec", "scanner": "scanner-primary", "fingerprint": "3ec6047f1acc7715", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-df70862320910e54", "level": "warning", "message": {"text": "Frontend route `/monday-deck` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "51888cf28a0f43e7", "scanner": "scanner-primary", "fingerprint": "df70862320910e54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e11b414a7966a17e", "level": "warning", "message": {"text": "Frontend route `/walkthrough` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a7e35921eacf9324", "scanner": "scanner-primary", "fingerprint": "e11b414a7966a17e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a58a4c9d10df56bc", "level": "warning", "message": {"text": "Frontend route `/preview/flower` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d972c97b3343a879", "scanner": "scanner-primary", "fingerprint": "a58a4c9d10df56bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5a1e5dfadba7f66f", "level": "warning", "message": {"text": "Frontend route `/design` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b0e63fa35f243a4f", "scanner": "scanner-primary", "fingerprint": "5a1e5dfadba7f66f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b4b2adc876a8e5f8", "level": "warning", "message": {"text": "Frontend route `/_design-tokens` has no Link/navigate to it \u2014 src/components/layout/AppShell.test.tsx"}, "properties": {"repobilityId": "b1994fed8509f1f5", "scanner": "scanner-primary", "fingerprint": "b4b2adc876a8e5f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a5eb579bbad11114", "level": "warning", "message": {"text": "Frontend route `/ops` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7d372b9967864555", "scanner": "scanner-primary", "fingerprint": "a5eb579bbad11114", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aeac5754927d4b4c", "level": "warning", "message": {"text": "Frontend route `/ops/demo-sessions/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7dcc144160b68964", "scanner": "scanner-primary", "fingerprint": "aeac5754927d4b4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cffa1ebb198742a5", "level": "error", "message": {"text": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (scripts/smoke-browser.mjs:204)"}, "properties": {"repobilityId": "10f67903e88558d2", "scanner": "scanner-primary", "fingerprint": "cffa1ebb198742a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c76cab84c1030c7", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/json/version (scripts/smoke-browser.mjs:251)"}, "properties": {"repobilityId": "3d18fb2d00523e99", "scanner": "scanner-primary", "fingerprint": "5c76cab84c1030c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5298aa55fb9c5420", "level": "error", "message": {"text": "Dangling fetch: POST /api/engines/physical/entries (scripts/smoke-api.mjs:110)"}, "properties": {"repobilityId": "6842ba54ee93e423", "scanner": "scanner-primary", "fingerprint": "5298aa55fb9c5420", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1155b68f3eb2c932", "level": "error", "message": {"text": "Dangling fetch: GET /api/engines/physical/entries (scripts/smoke-api.mjs:142)"}, "properties": {"repobilityId": "90ac29b995c4c854", "scanner": "scanner-primary", "fingerprint": "1155b68f3eb2c932", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c89895bddc7d793c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/scan-vision.ts:202)"}, "properties": {"repobilityId": "4b6d70224c7fae5e", "scanner": "scanner-primary", "fingerprint": "c89895bddc7d793c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e48de78e1e336219", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/vision.ts:127)"}, "properties": {"repobilityId": "e69a1204a9d928fd", "scanner": "scanner-primary", "fingerprint": "e48de78e1e336219", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71e67c0fb89d7415", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (workers/src/lib/claude.ts:119)"}, "properties": {"repobilityId": "1f714f0c6fb2bf16", "scanner": "scanner-primary", "fingerprint": "71e67c0fb89d7415", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc0c88a57e5e6d92", "level": "error", "message": {"text": "Dangling fetch: POST https://api.bland.ai/v1/calls (workers/src/routes/voice.ts:102)"}, "properties": {"repobilityId": "bb9926b8fcb8db5e", "scanner": "scanner-primary", "fingerprint": "dc0c88a57e5e6d92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8073f7bf758f6d0", "level": "note", "message": {"text": "Unused endpoint: USE /api/*"}, "properties": {"repobilityId": "ea9fc90fe89c2d30", "scanner": "scanner-primary", "fingerprint": "b8073f7bf758f6d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "00e78bdb0a1d46f4", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ea341c30f68c2a2", "level": "note", "message": {"text": "Unused endpoint: POST /api/safety/log"}, "properties": {"repobilityId": "23e55e6b561ac878", "scanner": "scanner-primary", "fingerprint": "9ea341c30f68c2a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11eeaf9ea318c60a", "level": "note", "message": {"text": "Unused endpoint: GET /api/parent/consent"}, "properties": {"repobilityId": "ef286614defe6ace", "scanner": "scanner-primary", "fingerprint": "11eeaf9ea318c60a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd8b5e6097c9c43a", "level": "note", "message": {"text": "Unused endpoint: POST /demo-food-photo"}, "properties": {"repobilityId": "7bf4bf4b7e680c40", "scanner": "scanner-primary", "fingerprint": "bd8b5e6097c9c43a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-473b6bfa58016529", "level": "note", "message": {"text": "Unused endpoint: POST /engines/:engineId/chat"}, "properties": {"repobilityId": "6ac786d825feb429", "scanner": "scanner-primary", "fingerprint": "473b6bfa58016529", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6920ecea6442704", "level": "note", "message": {"text": "Unused endpoint: GET /ops/demo-feedback"}, "properties": {"repobilityId": "dcf5dc4a0a04361b", "scanner": "scanner-primary", "fingerprint": "a6920ecea6442704", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27e93a7844c91fd5", "level": "note", "message": {"text": "Unused endpoint: GET /ops/scope-feedback"}, "properties": {"repobilityId": "e21898cf109ddb92", "scanner": "scanner-primary", "fingerprint": "27e93a7844c91fd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d253cee76599414", "level": "note", "message": {"text": "Unused endpoint: GET /ops/demo-sessions"}, "properties": {"repobilityId": "f7ea0ff785b426f7", "scanner": "scanner-primary", "fingerprint": "8d253cee76599414", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e113230b642031b", "level": "note", "message": {"text": "Unused endpoint: GET /ops/demo-sessions/:sessionId"}, "properties": {"repobilityId": "53ae11114e35d17e", "scanner": "scanner-primary", "fingerprint": "4e113230b642031b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-856fef44f141217e", "level": "note", "message": {"text": "Unused endpoint: POST /voice/webhook"}, "properties": {"repobilityId": "d0c9cdaf3b002ffb", "scanner": "scanner-primary", "fingerprint": "856fef44f141217e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd9cf6dc812030e9", "level": "note", "message": {"text": "Unused endpoint: GET /voice/recent"}, "properties": {"repobilityId": "4d1c576e44bb309d", "scanner": "scanner-primary", "fingerprint": "bd9cf6dc812030e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0738b654bef344d4", "level": "note", "message": {"text": "Unused endpoint: POST /scan/analyze"}, "properties": {"repobilityId": "689e51fc1abc55fc", "scanner": "scanner-primary", "fingerprint": "0738b654bef344d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a33aaf091237744", "level": "note", "message": {"text": "Unused endpoint: GET /scan/observations/:sessionId"}, "properties": {"repobilityId": "b47df8982324ef0f", "scanner": "scanner-primary", "fingerprint": "1a33aaf091237744", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31d5d4fe7e6e2c4f", "level": "note", "message": {"text": "Unused endpoint: GET /scan/observations"}, "properties": {"repobilityId": "539226d6e8af3aff", "scanner": "scanner-primary", "fingerprint": "31d5d4fe7e6e2c4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f53c3e8086ff69d6", "level": "note", "message": {"text": "Unused endpoint: GET /score/today"}, "properties": {"repobilityId": "10712cc6daa55a65", "scanner": "scanner-primary", "fingerprint": "f53c3e8086ff69d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fa25eaed4db5a3f", "level": "note", "message": {"text": "Unused endpoint: POST /schedule/generate"}, "properties": {"repobilityId": "ef475e399b258a20", "scanner": "scanner-primary", "fingerprint": "5fa25eaed4db5a3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e22969641db15ee9", "level": "note", "message": {"text": "Unused endpoint: GET /workouts/recent"}, "properties": {"repobilityId": "f28310183a542607", "scanner": "scanner-primary", "fingerprint": "e22969641db15ee9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcb688f4fa06c5e9", "level": "note", "message": {"text": "Unused endpoint: PATCH /meals/:mealId"}, "properties": {"repobilityId": "498a9a937e4d0f9b", "scanner": "scanner-primary", "fingerprint": "bcb688f4fa06c5e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fb9176583af48cd", "level": "note", "message": {"text": "Unused endpoint: GET /friends/compare"}, "properties": {"repobilityId": "19e607e51569484d", "scanner": "scanner-primary", "fingerprint": "1fb9176583af48cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0cd1c70fddde9384", "level": "note", "message": {"text": "Unused endpoint: GET /friends"}, "properties": {"repobilityId": "766902c3f1c3b560", "scanner": "scanner-primary", "fingerprint": "0cd1c70fddde9384", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1452305cdc80d5d8", "level": "note", "message": {"text": "Unused endpoint: POST /friends/request"}, "properties": {"repobilityId": "229072508f59ed93", "scanner": "scanner-primary", "fingerprint": "1452305cdc80d5d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37218ea98b666509", "level": "note", "message": {"text": "Unused endpoint: POST /friends/:friendshipId/accept"}, "properties": {"repobilityId": "033556217d878fbe", "scanner": "scanner-primary", "fingerprint": "37218ea98b666509", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3e7e5fea4199d0c", "level": "note", "message": {"text": "Unused endpoint: GET /groups"}, "properties": {"repobilityId": "34c1d2ffcbacec22", "scanner": "scanner-primary", "fingerprint": "e3e7e5fea4199d0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86f4ce9131125e3a", "level": "note", "message": {"text": "Unused endpoint: GET /groups/:id"}, "properties": {"repobilityId": "b2df338c153ce5c0", "scanner": "scanner-primary", "fingerprint": "86f4ce9131125e3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f05f8890d9a08de8", "level": "note", "message": {"text": "Unused endpoint: PATCH /groups/:id/me"}, "properties": {"repobilityId": "0a6fad38060e2386", "scanner": "scanner-primary", "fingerprint": "f05f8890d9a08de8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-281deddb2460ab4f", "level": "note", "message": {"text": "Unused endpoint: GET /groups/templates"}, "properties": {"repobilityId": "0b2aa417db77b090", "scanner": "scanner-primary", "fingerprint": "281deddb2460ab4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-520ba31d7ddb50ff", "level": "note", "message": {"text": "Unused endpoint: GET /groups/inbox"}, "properties": {"repobilityId": "5d7b32af626cbc48", "scanner": "scanner-primary", "fingerprint": "520ba31d7ddb50ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d42d267e060257ea", "level": "note", "message": {"text": "Unused endpoint: POST /groups/messages/:id/ack"}, "properties": {"repobilityId": "d0474841e402d812", "scanner": "scanner-primary", "fingerprint": "d42d267e060257ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f83c41b0426766c", "level": "note", "message": {"text": "Unused endpoint: GET /groups/:id/activity"}, "properties": {"repobilityId": "64a10664134f1147", "scanner": "scanner-primary", "fingerprint": "9f83c41b0426766c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0aeafe0fd6ba59b", "level": "note", "message": {"text": "Unused endpoint: GET /groups/:id/leaderboard"}, "properties": {"repobilityId": "36692ac5b2749b35", "scanner": "scanner-primary", "fingerprint": "a0aeafe0fd6ba59b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}