{"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-493032da9fcbb91a", "name": "Stray `console.log` in TS/JS \u2014 src/App.jsx:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/App.jsx:163"}, "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-2752736dd7e14e75", "name": "Icon-only button without accessible name \u2014 src/pages/NotesPage.jsx:433", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/pages/NotesPage.jsx:433"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03f8ea497c121b34", "name": "Stray `console.log` in TS/JS \u2014 src/services/syncLog.js:184", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/syncLog.js:184"}, "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-059e309f0e17a1cf", "name": "Stray `console.log` in TS/JS \u2014 src/services/journalMigration.js:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/journalMigration.js:69"}, "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-f867d867e58b85ab", "name": "Stray `console.log` in TS/JS \u2014 src/services/sync.js:651", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/sync.js:651"}, "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-8ae45bfa7959b635", "name": "Stray `console.log` in TS/JS \u2014 src/services/audioInlineMigration.js:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/audioInlineMigration.js:241"}, "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-8b0ddbb415566761", "name": "Stray `console.log` in TS/JS \u2014 src/services/notesAutomergeMigration.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notesAutomergeMigration.js:51"}, "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-bde5fb96c96e9eb1", "name": "Stray `console.log` in TS/JS \u2014 src/services/drive.js:250", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/drive.js:250"}, "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-06826f61e36decb5", "name": "Stray `console.log` in TS/JS \u2014 src/services/journalsAutomergeMigration.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/journalsAutomergeMigration.js:51"}, "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-d47d3d4eebb3bc84", "name": "Stray `console.log` in TS/JS \u2014 src/services/audio.js:332", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/audio.js:332"}, "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-2f10431ac900ab65", "name": "Stray `console.log` in TS/JS \u2014 src/services/entitiesMigration.js:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/entitiesMigration.js:70"}, "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-a66761a98597faa4", "name": "Stray `console.log` in TS/JS \u2014 src/services/configAutomergeMigration.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/configAutomergeMigration.js:35"}, "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-793ba2779348d7ef", "name": "Stray `console.log` in TS/JS \u2014 src/services/tasksAutomergeMigration.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/tasksAutomergeMigration.js:55"}, "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-6ed5c47197a5e6f4", "name": "Insecure pattern 'node_child_process' in vite.config.js:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in vite.config.js:5"}, "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-289fe01c1bbcc828", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/AudioNode.jsx:178", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/AudioNode.jsx:178"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-038c2cc142557ae5", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/HashtagSuggest.js:92", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/HashtagSuggest.js:92"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-283eafa68663457c", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/blocks.js:113", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/blocks.js:113"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-351c8b248c5af6b8", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/services/audio.js:408", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/services/audio.js:408"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f2f1f66859bad99", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/store/useAppStore.js:75", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/store/useAppStore.js:75"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-895b85ad00964984", "name": "Very large file: src/services/sync.js (1318 lines)", "shortDescription": {"text": "Very large file: src/services/sync.js (1318 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-528f147478e079cc", "name": "Very large file: src/store/useAppStore.js (1216 lines)", "shortDescription": {"text": "Very large file: src/store/useAppStore.js (1216 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 76 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8671f5150c6f0b1", "name": "Node manifest has dependencies but no lockfile: worker/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: worker/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 80 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 27 placeholder/mock markers across 10 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bce57cb5a481dfc3", "name": "Commented-code block (5 lines) in vite.config.js:44", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.js:44"}, "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-3b749303d194afbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.js:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.js:9"}, "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-303655c4bf210911", "name": "Commented-code block (5 lines) in src/App.jsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.jsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b45808ae289fb46e", "name": "Commented-code block (9 lines) in src/components/today/JournalPanel.jsx:24", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/today/JournalPanel.jsx: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-41c2f93189cfe24c", "name": "Commented-code block (5 lines) in src/components/voice/RecordFab.jsx:22", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/voice/RecordFab.jsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75de0278cea4687f", "name": "Commented-code block (16 lines) in src/components/editor/BlockIdExtension.js:52", "shortDescription": {"text": "Commented-code block (16 lines) in src/components/editor/BlockIdExtension.js:52"}, "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-975bbea1425afbca", "name": "Commented-code block (5 lines) in src/components/editor/AudioNode.jsx:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/editor/AudioNode.jsx: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-5beb1f1eb47ced5d", "name": "Commented-code block (8 lines) in src/lib/blocks.js:116", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/blocks.js:116"}, "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-3aede753ab37096e", "name": "Commented-code block (5 lines) in src/lib/review.js:64", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/review.js:64"}, "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-5a0dc9d7deef7555", "name": "Commented-code block (5 lines) in src/pages/TodayPage.jsx:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/TodayPage.jsx: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-d63919f868f1bd6d", "name": "Commented-code block (6 lines) in src/pages/ReviewPage.jsx:375", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/ReviewPage.jsx:375"}, "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-ca8f7676f8f81e8b", "name": "Commented-code block (5 lines) in src/pages/SearchPage.jsx:260", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/SearchPage.jsx:260"}, "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-b024048b62134bc7", "name": "Commented-code block (5 lines) in src/pages/NotesPage.jsx:55", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/NotesPage.jsx: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-837a86bb9c3f7f02", "name": "Commented-code block (6 lines) in src/services/syncLog.js:51", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/syncLog.js:51"}, "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-cc9ab7315e457a28", "name": "Legacy-named symbol `journals_split_v1` in src/services/journalMigration.js:11", "shortDescription": {"text": "Legacy-named symbol `journals_split_v1` in src/services/journalMigration.js:11"}, "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-043dfd6929ade06a", "name": "Commented-code block (5 lines) in src/services/sync.js:290", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/sync.js:290"}, "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-52e08702af505f3c", "name": "Commented-code block (5 lines) in src/services/db.js:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/db.js:98"}, "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-ae9e9c4711298695", "name": "Legacy-named symbol `audio_inline_v1` in src/services/audioInlineMigration.js:19", "shortDescription": {"text": "Legacy-named symbol `audio_inline_v1` in src/services/audioInlineMigration.js: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-d61d7a49def38735", "name": "Legacy-named symbol `automerge_notes_v1` in src/services/notesAutomergeMigration.js:8", "shortDescription": {"text": "Legacy-named symbol `automerge_notes_v1` in src/services/notesAutomergeMigration.js:8"}, "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-3b0dbf375241d9fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/auth.js:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/auth.js:112"}, "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-eb399f52e2f8ba2c", "name": "Legacy-named symbol `entities_split_v1` in src/services/drive.js:292", "shortDescription": {"text": "Legacy-named symbol `entities_split_v1` in src/services/drive.js:292"}, "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-8eb0c8b8a09230a4", "name": "Commented-code block (5 lines) in src/services/drive.js:287", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/drive.js:287"}, "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-78699d4e30f80d04", "name": "Legacy-named symbol `automerge_journals_v1` in src/services/journalsAutomergeMigration.js:8", "shortDescription": {"text": "Legacy-named symbol `automerge_journals_v1` in src/services/journalsAutomergeMigration.js:8"}, "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-1699153b4bc9dc1d", "name": "Commented-code block (7 lines) in src/services/syncEngine.js:46", "shortDescription": {"text": "Commented-code block (7 lines) in src/services/syncEngine.js:46"}, "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-9aa8a615acacc8b0", "name": "Commented-code block (5 lines) in src/services/audio.js:138", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/audio.js:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e8531e1bc0473d28", "name": "Legacy-named symbol `entities_split_v1` in src/services/entitiesMigration.js:19", "shortDescription": {"text": "Legacy-named symbol `entities_split_v1` in src/services/entitiesMigration.js: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-67bb63803239c322", "name": "Commented-code block (5 lines) in src/services/automergeDoc.js:33", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/automergeDoc.js:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-379d4fe5cd18dcfb", "name": "Legacy-named symbol `automerge_config_v1` in src/services/configAutomergeMigration.js:9", "shortDescription": {"text": "Legacy-named symbol `automerge_config_v1` in src/services/configAutomergeMigration.js: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-f3f015847764d648", "name": "Legacy-named symbol `automerge_tasks_v1` in src/services/tasksAutomergeMigration.js:8", "shortDescription": {"text": "Legacy-named symbol `automerge_tasks_v1` in src/services/tasksAutomergeMigration.js:8"}, "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-5f6ab931678c36af", "name": "Commented-code block (8 lines) in src/store/useAppStore.js:31", "shortDescription": {"text": "Commented-code block (8 lines) in src/store/useAppStore.js:31"}, "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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `VITE_AUTH_WORKER_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21108"}, "properties": {"repository": "theitush/yajna", "repoUrl": "https://github.com/theitush/yajna", "branch": "main"}, "results": [{"ruleId": "scanner-493032da9fcbb91a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/App.jsx:163"}, "properties": {"repobilityId": "04de5bf5c80ff75c", "scanner": "scanner-primary", "fingerprint": "493032da9fcbb91a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2752736dd7e14e75", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/pages/NotesPage.jsx:433"}, "properties": {"repobilityId": "721ce48be4f2f297", "scanner": "scanner-primary", "fingerprint": "2752736dd7e14e75", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-03f8ea497c121b34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/syncLog.js:184"}, "properties": {"repobilityId": "9318e23d423ce127", "scanner": "scanner-primary", "fingerprint": "03f8ea497c121b34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-059e309f0e17a1cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/journalMigration.js:69"}, "properties": {"repobilityId": "e32c5926d83f3f64", "scanner": "scanner-primary", "fingerprint": "059e309f0e17a1cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f867d867e58b85ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/sync.js:651"}, "properties": {"repobilityId": "47b25c59052c2f31", "scanner": "scanner-primary", "fingerprint": "f867d867e58b85ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ae45bfa7959b635", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/audioInlineMigration.js:241"}, "properties": {"repobilityId": "cca1d35ddf9a6a12", "scanner": "scanner-primary", "fingerprint": "8ae45bfa7959b635", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b0ddbb415566761", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notesAutomergeMigration.js:51"}, "properties": {"repobilityId": "4263fcad7a7fc083", "scanner": "scanner-primary", "fingerprint": "8b0ddbb415566761", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bde5fb96c96e9eb1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/drive.js:250"}, "properties": {"repobilityId": "538ec21606d74cb5", "scanner": "scanner-primary", "fingerprint": "bde5fb96c96e9eb1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06826f61e36decb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/journalsAutomergeMigration.js:51"}, "properties": {"repobilityId": "f8dda9652f6db487", "scanner": "scanner-primary", "fingerprint": "06826f61e36decb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d47d3d4eebb3bc84", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/audio.js:332"}, "properties": {"repobilityId": "4883df0ee8a4e7a2", "scanner": "scanner-primary", "fingerprint": "d47d3d4eebb3bc84", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f10431ac900ab65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/entitiesMigration.js:70"}, "properties": {"repobilityId": "057f943e5a9b24bf", "scanner": "scanner-primary", "fingerprint": "2f10431ac900ab65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a66761a98597faa4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/configAutomergeMigration.js:35"}, "properties": {"repobilityId": "a3224cc2e3d96a79", "scanner": "scanner-primary", "fingerprint": "a66761a98597faa4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-793ba2779348d7ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/tasksAutomergeMigration.js:55"}, "properties": {"repobilityId": "487949e809ba05d7", "scanner": "scanner-primary", "fingerprint": "793ba2779348d7ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ed5c47197a5e6f4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in vite.config.js:5"}, "properties": {"repobilityId": "fb99635354426984", "scanner": "scanner-primary", "fingerprint": "6ed5c47197a5e6f4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vite.config.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-289fe01c1bbcc828", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/AudioNode.jsx:178"}, "properties": {"repobilityId": "ca5e6a38da45e5f2", "scanner": "scanner-primary", "fingerprint": "289fe01c1bbcc828", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/editor/AudioNode.jsx"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-038c2cc142557ae5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/editor/HashtagSuggest.js:92"}, "properties": {"repobilityId": "efb898fa5e391a93", "scanner": "scanner-primary", "fingerprint": "038c2cc142557ae5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/editor/HashtagSuggest.js"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-283eafa68663457c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/blocks.js:113"}, "properties": {"repobilityId": "fd4faa57375e9e63", "scanner": "scanner-primary", "fingerprint": "283eafa68663457c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/blocks.js"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-351c8b248c5af6b8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/services/audio.js:408"}, "properties": {"repobilityId": "86aa7530d8d8d3b3", "scanner": "scanner-primary", "fingerprint": "351c8b248c5af6b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/services/audio.js"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-8f2f1f66859bad99", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/store/useAppStore.js:75"}, "properties": {"repobilityId": "f2c177d3dfffef93", "scanner": "scanner-primary", "fingerprint": "8f2f1f66859bad99", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/store/useAppStore.js"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-895b85ad00964984", "level": "note", "message": {"text": "Very large file: src/services/sync.js (1318 lines)"}, "properties": {"repobilityId": "e60601f3c412cf4c", "scanner": "scanner-primary", "fingerprint": "895b85ad00964984", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-528f147478e079cc", "level": "note", "message": {"text": "Very large file: src/store/useAppStore.js (1216 lines)"}, "properties": {"repobilityId": "4fb07ac0f10abd4d", "scanner": "scanner-primary", "fingerprint": "528f147478e079cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a82f45b2475b61d2", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-a8671f5150c6f0b1", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: worker/package.json"}, "properties": {"repobilityId": "6b6e5cd436057d48", "scanner": "scanner-primary", "fingerprint": "a8671f5150c6f0b1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "c0ef318e60f51e39", "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": "65d45bd03c13a849", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "88874bb21ba03e27", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "2c70a4f374e58a41", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "96c273f3604285c5", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "9e4c5f714f7dfbe5", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "6ea6e2a05ba1afaa", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bce57cb5a481dfc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.js:44"}, "properties": {"repobilityId": "2eaee97997231d62", "scanner": "scanner-primary", "fingerprint": "bce57cb5a481dfc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b749303d194afbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/src/index.js:9"}, "properties": {"repobilityId": "dd8403b65167e95c", "scanner": "scanner-primary", "fingerprint": "3b749303d194afbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-303655c4bf210911", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.jsx:36"}, "properties": {"repobilityId": "4e173b9c96cd659d", "scanner": "scanner-primary", "fingerprint": "303655c4bf210911", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b45808ae289fb46e", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/today/JournalPanel.jsx:24"}, "properties": {"repobilityId": "47992d26ed6eab95", "scanner": "scanner-primary", "fingerprint": "b45808ae289fb46e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41c2f93189cfe24c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/voice/RecordFab.jsx:22"}, "properties": {"repobilityId": "684a926dfa0a5234", "scanner": "scanner-primary", "fingerprint": "41c2f93189cfe24c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75de0278cea4687f", "level": "none", "message": {"text": "Commented-code block (16 lines) in src/components/editor/BlockIdExtension.js:52"}, "properties": {"repobilityId": "e6e0a10832443129", "scanner": "scanner-primary", "fingerprint": "75de0278cea4687f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-975bbea1425afbca", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/editor/AudioNode.jsx:9"}, "properties": {"repobilityId": "5a3b47e2a433eec2", "scanner": "scanner-primary", "fingerprint": "975bbea1425afbca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5beb1f1eb47ced5d", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/blocks.js:116"}, "properties": {"repobilityId": "cb5dc28a91b9efa1", "scanner": "scanner-primary", "fingerprint": "5beb1f1eb47ced5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3aede753ab37096e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/review.js:64"}, "properties": {"repobilityId": "25c81ed29ae79785", "scanner": "scanner-primary", "fingerprint": "3aede753ab37096e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a0dc9d7deef7555", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/TodayPage.jsx:13"}, "properties": {"repobilityId": "e151ea60d73d52de", "scanner": "scanner-primary", "fingerprint": "5a0dc9d7deef7555", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d63919f868f1bd6d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/ReviewPage.jsx:375"}, "properties": {"repobilityId": "44d958f20bd12ec2", "scanner": "scanner-primary", "fingerprint": "d63919f868f1bd6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca8f7676f8f81e8b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/SearchPage.jsx:260"}, "properties": {"repobilityId": "61c7db9ce375fb6c", "scanner": "scanner-primary", "fingerprint": "ca8f7676f8f81e8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b024048b62134bc7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/NotesPage.jsx:55"}, "properties": {"repobilityId": "694ad7f5861e4f73", "scanner": "scanner-primary", "fingerprint": "b024048b62134bc7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-837a86bb9c3f7f02", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/syncLog.js:51"}, "properties": {"repobilityId": "22a6f1e870bb75a8", "scanner": "scanner-primary", "fingerprint": "837a86bb9c3f7f02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc9ab7315e457a28", "level": "note", "message": {"text": "Legacy-named symbol `journals_split_v1` in src/services/journalMigration.js:11"}, "properties": {"repobilityId": "0770b7c28b1862d8", "scanner": "scanner-primary", "fingerprint": "cc9ab7315e457a28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-043dfd6929ade06a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/sync.js:290"}, "properties": {"repobilityId": "230f11db76aabdf8", "scanner": "scanner-primary", "fingerprint": "043dfd6929ade06a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52e08702af505f3c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/db.js:98"}, "properties": {"repobilityId": "de1adcd187808666", "scanner": "scanner-primary", "fingerprint": "52e08702af505f3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae9e9c4711298695", "level": "note", "message": {"text": "Legacy-named symbol `audio_inline_v1` in src/services/audioInlineMigration.js:19"}, "properties": {"repobilityId": "a454187c257726ac", "scanner": "scanner-primary", "fingerprint": "ae9e9c4711298695", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d61d7a49def38735", "level": "note", "message": {"text": "Legacy-named symbol `automerge_notes_v1` in src/services/notesAutomergeMigration.js:8"}, "properties": {"repobilityId": "407fc51d26face7b", "scanner": "scanner-primary", "fingerprint": "d61d7a49def38735", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3b0dbf375241d9fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/auth.js:112"}, "properties": {"repobilityId": "1a8fe9a5996f6110", "scanner": "scanner-primary", "fingerprint": "3b0dbf375241d9fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb399f52e2f8ba2c", "level": "note", "message": {"text": "Legacy-named symbol `entities_split_v1` in src/services/drive.js:292"}, "properties": {"repobilityId": "a7da6e7a65316af7", "scanner": "scanner-primary", "fingerprint": "eb399f52e2f8ba2c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8eb0c8b8a09230a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/drive.js:287"}, "properties": {"repobilityId": "06b80f9dca00f54f", "scanner": "scanner-primary", "fingerprint": "8eb0c8b8a09230a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78699d4e30f80d04", "level": "note", "message": {"text": "Legacy-named symbol `automerge_journals_v1` in src/services/journalsAutomergeMigration.js:8"}, "properties": {"repobilityId": "fa540b8cabccefe7", "scanner": "scanner-primary", "fingerprint": "78699d4e30f80d04", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1699153b4bc9dc1d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/services/syncEngine.js:46"}, "properties": {"repobilityId": "3f6b4c64144b5d59", "scanner": "scanner-primary", "fingerprint": "1699153b4bc9dc1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9aa8a615acacc8b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/audio.js:138"}, "properties": {"repobilityId": "3b354c457a2c384f", "scanner": "scanner-primary", "fingerprint": "9aa8a615acacc8b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8531e1bc0473d28", "level": "note", "message": {"text": "Legacy-named symbol `entities_split_v1` in src/services/entitiesMigration.js:19"}, "properties": {"repobilityId": "fcdc3021c58817cb", "scanner": "scanner-primary", "fingerprint": "e8531e1bc0473d28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-67bb63803239c322", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/automergeDoc.js:33"}, "properties": {"repobilityId": "14ea467bae6c3bf9", "scanner": "scanner-primary", "fingerprint": "67bb63803239c322", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-379d4fe5cd18dcfb", "level": "note", "message": {"text": "Legacy-named symbol `automerge_config_v1` in src/services/configAutomergeMigration.js:9"}, "properties": {"repobilityId": "37c301f324975b5a", "scanner": "scanner-primary", "fingerprint": "379d4fe5cd18dcfb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f3f015847764d648", "level": "note", "message": {"text": "Legacy-named symbol `automerge_tasks_v1` in src/services/tasksAutomergeMigration.js:8"}, "properties": {"repobilityId": "fea4b9069320758e", "scanner": "scanner-primary", "fingerprint": "f3f015847764d648", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5f6ab931678c36af", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/store/useAppStore.js:31"}, "properties": {"repobilityId": "81d0c135ef914699", "scanner": "scanner-primary", "fingerprint": "5f6ab931678c36af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}