{"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-e6d5b797dc90d241", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/replicate.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/replicate.ts:75"}, "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-2306f40137091193", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/fx-sync.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/fx-sync.ts:110"}, "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-fc8cbd4a653a605b", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/codef-sync.ts:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/codef-sync.ts:112"}, "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-86ee8f4553781f09", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/gowid-sync.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/gowid-sync.ts:86"}, "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-0499e047dc737af6", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/sync.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/sync.ts:81"}, "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-68d16779fbf26623", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/mercury-sync.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/mercury-sync.ts:92"}, "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-ba86eff1c67ea2ae", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/map-shadow.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/map-shadow.ts:67"}, "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-44170dd3e4967fd4", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/due-date-sync.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/due-date-sync.ts:58"}, "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-b52479abadfc47a9", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/enqueue-daily.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/enqueue-daily.ts: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-31331a669070cfa0", "name": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/ssart-sync.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/ssart-sync.ts:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54c1634f78b2c2ce", "name": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/order-number.ts:25", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/order-number.ts:25"}, "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-e3e1d3a6595fc2f0", "name": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/sync-runner.ts:184", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/sync-runner.ts:184"}, "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-15b554c09f5e5f68", "name": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/inventory-calculator.ts:9", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/inventory-calculator.ts:9"}, "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-a145f05982c8cbe9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/approvals-inbox.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/approvals-inbox.tsx:209"}, "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-8f2bcb2e32b37120", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/module-ui.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/module-ui.tsx:171"}, "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-48140da9e4eb6053", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/entity-switcher.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/entity-switcher.tsx:177"}, "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-2c6ed23c4168a7aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app-shell.tsx:475", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app-shell.tsx:475"}, "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-fcce34e62c2b3317", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books-view.tsx:1725", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books-view.tsx:1725"}, "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-e1d97cc3e940c825", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/match-workspace.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/match-workspace.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-00caeef3d588a5a0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/tax-calendar.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/tax-calendar.tsx:166"}, "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-153c2ce5d1977a2d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/upload-ingest.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/upload-ingest.tsx:233"}, "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-84a9f327b31aebcd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/opex-trend.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/opex-trend.tsx:171"}, "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-6bab616830079c79", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/concentration-view.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/concentration-view.tsx:193"}, "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-901b98d72bdae6f9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/expenseone-unmatched-card.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/expenseone-unmatched-card.tsx:112"}, "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-25cb59870bec9777", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/settlement-view.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/settlement-view.tsx:298"}, "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-2bdbc989b667b585", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_mobile_interactive.html:902", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_mobile_interactive.html:902"}, "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-20627037305b8f92", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_desktop.html:1285", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_desktop.html:1285"}, "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-a0b2bf739ad21038", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/text-contrast-review.html:81", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/text-contrast-review.html:81"}, "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-97e88a011eec722f", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/cohort-retention-design.html:218", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/cohort-retention-design.html:218"}, "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-5c5946709a7a18ae", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-chart-layout-options.html:138", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-chart-layout-options.html:138"}, "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-6008eab7029344a2", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/period-picker-highlight-options.html:75", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/period-picker-highlight-options.html: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-e8d6b670ac400301", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_shell_review.html:1760", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_shell_review.html:1760"}, "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-cb515841f78a916a", "name": "Insecure pattern 'insert_adjacent_html' in docs/hanahone_erp_shell_review.html:1763", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in docs/hanahone_erp_shell_review.html:1763"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-794492f6bf1267cb", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/projection-formula-options.html:283", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/projection-formula-options.html:283"}, "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-8fa3c1816034f1a4", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-gmail-flow.html:150", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-gmail-flow.html:150"}, "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-67cbda7854f09861", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/opex-concentration-mockup.html:138", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/opex-concentration-mockup.html:138"}, "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-9d2731f927fc26df", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v03_interactive.html:1257", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v03_interactive.html:1257"}, "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-840927467ad8777c", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-margin-overlap-options.html:135", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-margin-overlap-options.html:135"}, "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-af7c5208990014a7", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-erp-view.html:171", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-erp-view.html:171"}, "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-2f7208b64d237421", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v05_mobile_interactive.html:948", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v05_mobile_interactive.html:948"}, "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-d76c924296cce356", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-drilldown-nodes.html:221", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-drilldown-nodes.html:221"}, "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-383219a491255980", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-onboarding-mockup.html:337", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-onboarding-mockup.html:337"}, "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-88aa8c85d02171e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/shell.html:273", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/shell.html:273"}, "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-85e02a2d1727a56c", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/entity-filter.html:227", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/entity-filter.html:227"}, "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-74b84d5d635cb55a", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/architecture.html:707", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/architecture.html:707"}, "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-beb03501a3992211", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/canon-explainer.html:231", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/canon-explainer.html:231"}, "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-3c2bb8c1494fa6d3", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/subnav.html:132", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/subnav.html:132"}, "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-26a09bc4d5dcc40a", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/ai-model.html:118", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/ai-model.html:118"}, "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-044ab789aff0ae47", "name": "Insecure pattern 'node_child_process' in worker/salesone-sync/src/lib/dispatch-sync.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in worker/salesone-sync/src/lib/dispatch-sync.ts:11"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-323c8959b31cc799", "name": "Very large file: src/components/app-shell.tsx (1596 lines)", "shortDescription": {"text": "Very large file: src/components/app-shell.tsx (1596 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-d5e08d12d42e02c7", "name": "Very large file: src/components/modules/books-view.tsx (2830 lines)", "shortDescription": {"text": "Very large file: src/components/modules/books-view.tsx (2830 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "26 tests / 226 src (ratio 0.12)."}, "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 52 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 42 placeholder/mock markers across 12 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: 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-77238be169698e53", "name": "Commented-code block (5 lines) in worker/salesone-sync/src/fx-sync.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/fx-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb5a0a8a36267a51", "name": "Commented-code block (8 lines) in worker/salesone-sync/src/codef-sync.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/codef-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-feddd2c6eb9ddd59", "name": "Commented-code block (6 lines) in worker/salesone-sync/src/gowid-sync.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/gowid-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cdbd19b8f6dcd316", "name": "Commented-code block (6 lines) in worker/salesone-sync/src/sync.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cffacdd4a7f9294", "name": "Commented-code block (9 lines) in worker/salesone-sync/src/tables-financeone.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in worker/salesone-sync/src/tables-financeone.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da069d12c1d4aa7b", "name": "Commented-code block (7 lines) in worker/salesone-sync/src/tables-expenseone.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/tables-expenseone.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58c69efaa4293f54", "name": "Commented-code block (6 lines) in worker/salesone-sync/src/mercury-sync.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/mercury-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a89fcc37147b7a4", "name": "Commented-code block (6 lines) in worker/salesone-sync/src/map-shadow.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/map-shadow.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99614b0d16286a87", "name": "Commented-code block (7 lines) in worker/salesone-sync/src/due-date-sync.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/due-date-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79ce83dd57e523f2", "name": "Commented-code block (5 lines) in worker/salesone-sync/src/ssart-sync.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/ssart-sync.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8b5e230be35e399", "name": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/mercury-client.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/mercury-client.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-92ebf1a3d7c46d54", "name": "Commented-code block (7 lines) in worker/salesone-sync/src/lib/codef-client.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/lib/codef-client.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-e4189933234ce6d5", "name": "Commented-code block (6 lines) in worker/salesone-sync/src/lib/order-number.ts:28", "shortDescription": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/lib/order-number.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f29c3a907c4668ff", "name": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/gowid-client.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/gowid-client.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-1f6fe37969390bba", "name": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/dispatch-sync.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/dispatch-sync.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-31b5fda3faff5a7c", "name": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/ssart-client.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/ssart-client.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-589763b98c96effb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30"}, "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-4dcd01860bdd4f59", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/pharmacy.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/pharmacy.ts:30"}, "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-71263ea53a0fcbb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20"}, "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-d2e56ea78af87982", "name": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/integrations/connectors/coupang.ts:374", "shortDescription": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/integrations/connectors/coupang.ts:374"}, "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-ddd6121862d80223", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/naver/auth.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/naver/auth.ts:33"}, "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-a418bfc47a08cf08", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/approvals-inbox.tsx:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/approvals-inbox.tsx:65"}, "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-3822c01a57c17869", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books-view.tsx:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books-view.tsx:3"}, "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-69ae2e7111ac2498", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/connect-view.tsx:271", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/connect-view.tsx:271"}, "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-06533dc711e8b1d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/people-view.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/people-view.tsx:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb7ee01511c439ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books/concentration-view.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books/concentration-view.tsx:73"}, "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-a5170b34cc5b9874", "name": "Commented-code block (5 lines) in src/app/api/diag/projection-backtest/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/diag/projection-backtest/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecba0bd43652ab8b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/journal/route.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/journal/route.ts:13"}, "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-bb8cd6ced51493ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/balance-sheet/route.ts:237", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/balance-sheet/route.ts:237"}, "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-35b9cac0e9110933", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/commerce/customers/route.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/commerce/customers/route.ts:17"}, "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-0ad96fd9cf064332", "name": "Commented-code block (6 lines) in src/lib/web-push.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/web-push.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-33ea60ed6066d52c", "name": "Commented-code block (5 lines) in src/lib/gowid-normalize.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/gowid-normalize.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-be3367237620f83a", "name": "Commented-code block (11 lines) in src/lib/mapping-cascade.ts:3", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/mapping-cascade.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-0e3b4307ffc08055", "name": "Commented-code block (5 lines) in src/lib/settlement-join.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/settlement-join.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-289524d02ce585d3", "name": "Commented-code block (6 lines) in src/lib/cashflow-rollforward.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/cashflow-rollforward.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-f5a0831ffcecc7e2", "name": "Commented-code block (5 lines) in src/lib/ssart-normalize.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ssart-normalize.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-1a8671f71750064f", "name": "Commented-code block (5 lines) in src/lib/pnl-accrual-map.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pnl-accrual-map.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-173b9dbeae9db957", "name": "Commented-code block (6 lines) in src/lib/bookkeeping.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/bookkeeping.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-0f8566fc1704742c", "name": "Commented-code block (5 lines) in src/lib/mercury-normalize.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/mercury-normalize.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-5d037ba5f054789e", "name": "Commented-code block (5 lines) in src/lib/confirmed-ledger-2025.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/confirmed-ledger-2025.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b8d7cf04369359a", "name": "Commented-code block (7 lines) in src/lib/extra-balances.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/extra-balances.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-ad6ba2cfe8f55036", "name": "Commented-code block (5 lines) in src/lib/codef-normalize.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/codef-normalize.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-20dd1fb2816dca53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/llm/client.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/llm/client.ts:75"}, "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-ca395a18e146a116", "name": "38 env vars used in code but missing from .env.example", "shortDescription": {"text": "38 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL`, `BUILD_DIST_DIR`, `CLOBE_BASE_URL`, `CLOBE_DOWNLOAD_DIR`, `CLOBE_DOWNLOAD_LABEL`, `CLOBE_DOWNLOAD_MENU_LABEL`, `CLOBE_INVOICE_PATH` + 30 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-b4e8a4d62d0e2429", "name": "Dangling fetch: GET /v1/kr/bank/b/account/account-list (worker/salesone-sync/src/lib/codef-client.ts:97)", "shortDescription": {"text": "Dangling fetch: GET /v1/kr/bank/b/account/account-list (worker/salesone-sync/src/lib/codef-client.ts:97)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/codef-client.ts:97` calls `GET /v1/kr/bank/b/account/account-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/kr/bank/b/account/account-list`\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-de35ef44a7c29dc6", "name": "Dangling fetch: GET /v1/kr/card/b/account/card-list (worker/salesone-sync/src/lib/codef-client.ts:104)", "shortDescription": {"text": "Dangling fetch: GET /v1/kr/card/b/account/card-list (worker/salesone-sync/src/lib/codef-client.ts:104)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/codef-client.ts:104` calls `GET /v1/kr/card/b/account/card-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/kr/card/b/account/card-list`\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-17f8bdbd67c30b86", "name": "Dangling fetch: GET /v1/kr/card/b/account/approval-list (worker/salesone-sync/src/lib/codef-client.ts:120)", "shortDescription": {"text": "Dangling fetch: GET /v1/kr/card/b/account/approval-list (worker/salesone-sync/src/lib/codef-client.ts:120)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/codef-client.ts:120` calls `GET /v1/kr/card/b/account/approval-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/kr/card/b/account/approval-list`\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-8d4cdc4d420b7c64", "name": "Dangling fetch: GET /v1/kr/public/nt/tax-invoice/integrated-check-list (worker/salesone-sync/src/lib/codef-client.ts:132", "shortDescription": {"text": "Dangling fetch: GET /v1/kr/public/nt/tax-invoice/integrated-check-list (worker/salesone-sync/src/lib/codef-client.ts:132)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/codef-client.ts:132` calls `GET /v1/kr/public/nt/tax-invoice/integrated-check-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/kr/public/nt/tax-invoice/integrated-check-list`\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-2f45e8dcdbcd7cb8", "name": "Dangling fetch: GET /v1/kr/bank/b/account/transaction-list (worker/salesone-sync/src/lib/codef-client.ts:149)", "shortDescription": {"text": "Dangling fetch: GET /v1/kr/bank/b/account/transaction-list (worker/salesone-sync/src/lib/codef-client.ts:149)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/codef-client.ts:149` calls `GET /v1/kr/bank/b/account/transaction-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/kr/bank/b/account/transaction-list`\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-6f411a25f5508364", "name": "Dangling fetch: GET /v1/members (worker/salesone-sync/src/lib/gowid-client.ts:37)", "shortDescription": {"text": "Dangling fetch: GET /v1/members (worker/salesone-sync/src/lib/gowid-client.ts:37)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/gowid-client.ts:37` calls `GET /v1/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/members`\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-66018b813396afa9", "name": "Dangling fetch: GET /v1/expenses (worker/salesone-sync/src/lib/gowid-client.ts:43)", "shortDescription": {"text": "Dangling fetch: GET /v1/expenses (worker/salesone-sync/src/lib/gowid-client.ts:43)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/gowid-client.ts:43` calls `GET /v1/expenses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/expenses`\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-0607e2ade1c9c8e8", "name": "Dangling fetch: POST https://${shop}/admin/oauth/access_token (worker/salesone-sync/src/lib/integrations/connectors/shop", "shortDescription": {"text": "Dangling fetch: POST https://${shop}/admin/oauth/access_token (worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30` calls `POST https://${shop}/admin/oauth/access_token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>/admin/oauth/access_token`\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-f554cb74822daf7b", "name": "Dangling fetch: POST https://api.amazon.com/auth/o2/token (worker/salesone-sync/src/lib/integrations/connectors/amazon.t", "shortDescription": {"text": "Dangling fetch: POST https://api.amazon.com/auth/o2/token (worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20)"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20` calls `POST https://api.amazon.com/auth/o2/token` 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.amazon.com/auth/o2/token`\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-a361f76d61515455", "name": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:60)", "shortDescription": {"text": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:60)"}, "fullDescription": {"text": "`src/components/approvals-inbox.tsx:60` calls `GET /api/approvals/pending` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/approvals/pending`\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-2d1f0889c69aa23b", "name": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:65)", "shortDescription": {"text": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:65)"}, "fullDescription": {"text": "`src/components/approvals-inbox.tsx:65` calls `GET /api/approvals/pending` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/approvals/pending`\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-1608ff3199bb5cf8", "name": "Dangling fetch: POST /api/approvals/act (src/components/approvals-inbox.tsx:262)", "shortDescription": {"text": "Dangling fetch: POST /api/approvals/act (src/components/approvals-inbox.tsx:262)"}, "fullDescription": {"text": "`src/components/approvals-inbox.tsx:262` calls `POST /api/approvals/act` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/approvals/act`\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-d79ab58c1d145fcc", "name": "Dangling fetch: GET /api/cash/balances (src/components/entity-switcher.tsx:91)", "shortDescription": {"text": "Dangling fetch: GET /api/cash/balances (src/components/entity-switcher.tsx:91)"}, "fullDescription": {"text": "`src/components/entity-switcher.tsx:91` calls `GET /api/cash/balances` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cash/balances`\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-5ccc0b88726fa909", "name": "Dangling fetch: GET /api/rbac/policy (src/components/app-shell.tsx:205)", "shortDescription": {"text": "Dangling fetch: GET /api/rbac/policy (src/components/app-shell.tsx:205)"}, "fullDescription": {"text": "`src/components/app-shell.tsx:205` calls `GET /api/rbac/policy` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/rbac/policy`\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-80748ad93ac7cc51", "name": "Dangling fetch: POST /api/auth/logout (src/components/app-shell.tsx:217)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (src/components/app-shell.tsx:217)"}, "fullDescription": {"text": "`src/components/app-shell.tsx:217` calls `POST /api/auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/logout`\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-0ab26a4d8869ad60", "name": "Dangling fetch: GET /api/today/summary?month=${month} (src/components/app-shell.tsx:774)", "shortDescription": {"text": "Dangling fetch: GET /api/today/summary?month=${month} (src/components/app-shell.tsx:774)"}, "fullDescription": {"text": "`src/components/app-shell.tsx:774` calls `GET /api/today/summary?month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/today/summary`\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-73e9c356b3803235", "name": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/app-shell.tsx:805)", "shortDescription": {"text": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/app-shell.tsx:805)"}, "fullDescription": {"text": "`src/components/app-shell.tsx:805` calls `GET /api/today/trend?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/today/trend`\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-b09d9eec7a0c5eae", "name": "Dangling fetch: GET /api/fx (src/components/currency-switcher.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/fx (src/components/currency-switcher.tsx:54)"}, "fullDescription": {"text": "`src/components/currency-switcher.tsx:54` calls `GET /api/fx` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/fx`\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-a4acee495f25e6bd", "name": "Dangling fetch: GET /api/insights/projection?month=${currentPeriod} (src/components/charts/revenue-pnl-chart.tsx:305)", "shortDescription": {"text": "Dangling fetch: GET /api/insights/projection?month=${currentPeriod} (src/components/charts/revenue-pnl-chart.tsx:305)"}, "fullDescription": {"text": "`src/components/charts/revenue-pnl-chart.tsx:305` calls `GET /api/insights/projection?month=${currentPeriod}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/insights/projection`\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-dd42f8c665bc4ccd", "name": "Dangling fetch: GET /api/books/transactions?limit=${TX_LIMIT}&entity=${scope}&start=${txRange.start}&end=${txRange.end}$", "shortDescription": {"text": "Dangling fetch: GET /api/books/transactions?limit=${TX_LIMIT}&entity=${scope}&start=${txRange.start}&end=${txRange.end}${typeQ}${qQ} (src/components/modules/books-view.tsx:320)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:320` calls `GET /api/books/transactions?limit=${TX_LIMIT}&entity=${scope}&start=${txRange.start}&end=${txRange.end}${typeQ}${qQ}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/transactions`\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-8e4da2b601234943", "name": "Dangling fetch: GET /api/books/expenseone-outflows (src/components/modules/books-view.tsx:362)", "shortDescription": {"text": "Dangling fetch: GET /api/books/expenseone-outflows (src/components/modules/books-view.tsx:362)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:362` calls `GET /api/books/expenseone-outflows` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/expenseone-outflows`\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-927f3a1b7bf520a6", "name": "Dangling fetch: GET /api/books/contribution?month=${month}&entity=${scope} (src/components/modules/books-view.tsx:426)", "shortDescription": {"text": "Dangling fetch: GET /api/books/contribution?month=${month}&entity=${scope} (src/components/modules/books-view.tsx:426)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:426` calls `GET /api/books/contribution?month=${month}&entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/contribution`\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-758571346cda87ee", "name": "Dangling fetch: GET /api/books/contribution?month=${m}&entity=${scope} (src/components/modules/books-view.tsx:467)", "shortDescription": {"text": "Dangling fetch: GET /api/books/contribution?month=${m}&entity=${scope} (src/components/modules/books-view.tsx:467)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:467` calls `GET /api/books/contribution?month=${m}&entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/contribution`\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-c2b7050403e12b95", "name": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/bo", "shortDescription": {"text": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/books-view.tsx:509)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:509` calls `GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/counterparty-balance`\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-e6e1cea5ba20b8f6", "name": "Dangling fetch: GET /api/books/counterparty-settlement?entity=${scope}&direction=${stlDir}&month=${month} (src/component", "shortDescription": {"text": "Dangling fetch: GET /api/books/counterparty-settlement?entity=${scope}&direction=${stlDir}&month=${month} (src/components/modules/books-view.tsx:548)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:548` calls `GET /api/books/counterparty-settlement?entity=${scope}&direction=${stlDir}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/counterparty-settlement`\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-c5be0a6ac0c71991", "name": "Dangling fetch: GET /api/books/journal?entity=${scope}&start=${start}&end=${end} (src/components/modules/books-view.tsx:", "shortDescription": {"text": "Dangling fetch: GET /api/books/journal?entity=${scope}&start=${start}&end=${end} (src/components/modules/books-view.tsx:598)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:598` calls `GET /api/books/journal?entity=${scope}&start=${start}&end=${end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/journal`\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-eecfb2c23700eab7", "name": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books-view.tsx:634)", "shortDescription": {"text": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books-view.tsx:634)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:634` calls `GET /api/books/ledger?entity=${scope}&month=${month}${q}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/ledger`\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-109018de9ade8c9d", "name": "Dangling fetch: GET /api/books/balance-sheet?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:678)", "shortDescription": {"text": "Dangling fetch: GET /api/books/balance-sheet?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:678)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:678` calls `GET /api/books/balance-sheet?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/balance-sheet`\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-b7384b1fdf82e1f7", "name": "Dangling fetch: GET /api/books/pnl?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:743)", "shortDescription": {"text": "Dangling fetch: GET /api/books/pnl?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:743)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:743` calls `GET /api/books/pnl?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/pnl`\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-b44a0a8a1a7749e1", "name": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:779)", "shortDescription": {"text": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:779)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:779` calls `GET /api/today/trend?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/today/trend`\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-a2283baf201dfbe2", "name": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:806)", "shortDescription": {"text": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:806)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:806` calls `GET /api/books/opex?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/opex`\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-51d4b85d67ea9e9a", "name": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:839)", "shortDescription": {"text": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:839)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:839` calls `GET /api/books/bep?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/bep`\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-a32bee8a08b10c08", "name": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${m} (src/components/modules/books-view.tsx:875)", "shortDescription": {"text": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${m} (src/components/modules/books-view.tsx:875)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:875` calls `GET /api/books/bep?entity=${scope}&month=${m}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/bep`\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-54a2b6f8e8c7f27e", "name": "Dangling fetch: GET /api/books/cashflow?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:919)", "shortDescription": {"text": "Dangling fetch: GET /api/books/cashflow?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:919)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:919` calls `GET /api/books/cashflow?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/cashflow`\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-0771b8314d7fbbc6", "name": "Dangling fetch: GET /api/books/intercompany (src/components/modules/books-view.tsx:960)", "shortDescription": {"text": "Dangling fetch: GET /api/books/intercompany (src/components/modules/books-view.tsx:960)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:960` calls `GET /api/books/intercompany` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/intercompany`\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-7d88eb26efd60b4b", "name": "Dangling fetch: GET /api/books/invoices?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:989)", "shortDescription": {"text": "Dangling fetch: GET /api/books/invoices?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:989)"}, "fullDescription": {"text": "`src/components/modules/books-view.tsx:989` calls `GET /api/books/invoices?entity=${scope}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/invoices`\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-491b45548fc04793", "name": "Dangling fetch: GET /api/books/unmapped?entity=${scope}&limit=300 (src/components/modules/match-workspace.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/books/unmapped?entity=${scope}&limit=300 (src/components/modules/match-workspace.tsx:39)"}, "fullDescription": {"text": "`src/components/modules/match-workspace.tsx:39` calls `GET /api/books/unmapped?entity=${scope}&limit=300` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/unmapped`\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-ff96c01890b50cb2", "name": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txId)} (src/components/modules/match-workspace.tsx:69", "shortDescription": {"text": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txId)} (src/components/modules/match-workspace.tsx:69)"}, "fullDescription": {"text": "`src/components/modules/match-workspace.tsx:69` calls `PATCH /api/books/transactions/${encodeURIComponent(txId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/transactions/<p>`\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-31006dcfa994e233", "name": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/match-", "shortDescription": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/match-workspace.tsx:101)"}, "fullDescription": {"text": "`src/components/modules/match-workspace.tsx:101` calls `GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/internal-accounts`\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-df9cecdd041ba8c3", "name": "Dangling fetch: GET /api/people (src/components/modules/people-directory.tsx:27)", "shortDescription": {"text": "Dangling fetch: GET /api/people (src/components/modules/people-directory.tsx:27)"}, "fullDescription": {"text": "`src/components/modules/people-directory.tsx:27` calls `GET /api/people` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/people`\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-5dbd83b4837c2944", "name": "Dangling fetch: POST /api/people/sync (src/components/modules/people-directory.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/people/sync (src/components/modules/people-directory.tsx:55)"}, "fullDescription": {"text": "`src/components/modules/people-directory.tsx:55` calls `POST /api/people/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/people/sync`\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-3e5c25eef873a8df", "name": "Dangling fetch: PATCH /api/people (src/components/modules/people-directory.tsx:76)", "shortDescription": {"text": "Dangling fetch: PATCH /api/people (src/components/modules/people-directory.tsx:76)"}, "fullDescription": {"text": "`src/components/modules/people-directory.tsx:76` calls `PATCH /api/people` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/people`\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-359c3d11e7d19662", "name": "Dangling fetch: POST /api/people (src/components/modules/people-directory.tsx:100)", "shortDescription": {"text": "Dangling fetch: POST /api/people (src/components/modules/people-directory.tsx:100)"}, "fullDescription": {"text": "`src/components/modules/people-directory.tsx:100` calls `POST /api/people` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/people`\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-fba2b36e56187bbb", "name": "Dangling fetch: GET /api/stock/inventory?limit=200&entity=${scope} (src/components/modules/stock-view.tsx:64)", "shortDescription": {"text": "Dangling fetch: GET /api/stock/inventory?limit=200&entity=${scope} (src/components/modules/stock-view.tsx:64)"}, "fullDescription": {"text": "`src/components/modules/stock-view.tsx:64` calls `GET /api/stock/inventory?limit=200&entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stock/inventory`\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-d7c4b76febb36142", "name": "Dangling fetch: GET /api/stock/products?entity=${scope} (src/components/modules/stock-view.tsx:103)", "shortDescription": {"text": "Dangling fetch: GET /api/stock/products?entity=${scope} (src/components/modules/stock-view.tsx:103)"}, "fullDescription": {"text": "`src/components/modules/stock-view.tsx:103` calls `GET /api/stock/products?entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stock/products`\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-2c9a5547322b935a", "name": "Dangling fetch: GET /api/rbac/policy (src/components/modules/rbac-matrix.tsx:36)", "shortDescription": {"text": "Dangling fetch: GET /api/rbac/policy (src/components/modules/rbac-matrix.tsx:36)"}, "fullDescription": {"text": "`src/components/modules/rbac-matrix.tsx:36` calls `GET /api/rbac/policy` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/rbac/policy`\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-6cf29ad9a48a91d9", "name": "Dangling fetch: GET /api/commerce/orders?entity=${scope}&start=${range.start}&end=${range.end}&limit=${O_LIMIT}&kind=${o", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/orders?entity=${scope}&start=${range.start}&end=${range.end}&limit=${O_LIMIT}&kind=${ordKind} (src/components/modules/commerce-view.tsx:117)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:117` calls `GET /api/commerce/orders?entity=${scope}&start=${range.start}&end=${range.end}&limit=${O_LIMIT}&kind=${ordKind}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/orders`\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-2ce7f2a1c7dd9148", "name": "Dangling fetch: GET /api/commerce/channels?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/channels?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:167)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:167` calls `GET /api/commerce/channels?entity=${scope}&start=${range.start}&end=${range.end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/channels`\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-c07c83f9d9489a96", "name": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${range.start}&end=${range.end} (src/components/module", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:214)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:214` calls `GET /api/commerce/customers?entity=${scope}&start=${range.start}&end=${range.end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/customers`\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-8e30eb274363e917", "name": "Dangling fetch: GET /api/commerce/regions?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/regions?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:260)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:260` calls `GET /api/commerce/regions?entity=${scope}&start=${range.start}&end=${range.end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/regions`\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-bd8c2afbb55b00c8", "name": "Dangling fetch: GET /api/commerce/settlements?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modu", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/settlements?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:634)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:634` calls `GET /api/commerce/settlements?entity=${scope}&start=${range.start}&end=${range.end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/settlements`\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-d58bb7f875c1da9b", "name": "Dangling fetch: GET /api/commerce/payouts?entity=${scope} (src/components/modules/commerce-view.tsx:680)", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/payouts?entity=${scope} (src/components/modules/commerce-view.tsx:680)"}, "fullDescription": {"text": "`src/components/modules/commerce-view.tsx:680` calls `GET /api/commerce/payouts?entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/payouts`\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-c43c2f3a01a7bead", "name": "Dangling fetch: GET /api/connect/status (src/components/modules/connect-view.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/connect/status (src/components/modules/connect-view.tsx:38)"}, "fullDescription": {"text": "`src/components/modules/connect-view.tsx:38` calls `GET /api/connect/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connect/status`\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-f68c88009e6d617b", "name": "Dangling fetch: GET /api/sync/requests (src/components/modules/connect-view.tsx:158)", "shortDescription": {"text": "Dangling fetch: GET /api/sync/requests (src/components/modules/connect-view.tsx:158)"}, "fullDescription": {"text": "`src/components/modules/connect-view.tsx:158` calls `GET /api/sync/requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sync/requests`\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-702aa4c5a19f40ea", "name": "Dangling fetch: POST /api/sync/requests (src/components/modules/connect-view.tsx:180)", "shortDescription": {"text": "Dangling fetch: POST /api/sync/requests (src/components/modules/connect-view.tsx:180)"}, "fullDescription": {"text": "`src/components/modules/connect-view.tsx:180` calls `POST /api/sync/requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sync/requests`\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-749e7465a51f3dd4", "name": "Dangling fetch: GET /api/connect/qbo-recon?month=${month} (src/components/modules/connect-view.tsx:270)", "shortDescription": {"text": "Dangling fetch: GET /api/connect/qbo-recon?month=${month} (src/components/modules/connect-view.tsx:270)"}, "fullDescription": {"text": "`src/components/modules/connect-view.tsx:270` calls `GET /api/connect/qbo-recon?month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/connect/qbo-recon`\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-18bf11cf39637d19", "name": "Dangling fetch: GET /api/books/pnl?entity=HOI&month=${month} (src/components/modules/connect-view.tsx:271)", "shortDescription": {"text": "Dangling fetch: GET /api/books/pnl?entity=HOI&month=${month} (src/components/modules/connect-view.tsx:271)"}, "fullDescription": {"text": "`src/components/modules/connect-view.tsx:271` calls `GET /api/books/pnl?entity=HOI&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/pnl`\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-862a907d2fb96c40", "name": "Dangling fetch: GET /api/accounting/tree?entity=${scope} (src/components/modules/account-tree.tsx:37)", "shortDescription": {"text": "Dangling fetch: GET /api/accounting/tree?entity=${scope} (src/components/modules/account-tree.tsx:37)"}, "fullDescription": {"text": "`src/components/modules/account-tree.tsx:37` calls `GET /api/accounting/tree?entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/accounting/tree`\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-bf679e8c5617b2a0", "name": "Dangling fetch: GET /api/people (src/components/modules/people-view.tsx:15)", "shortDescription": {"text": "Dangling fetch: GET /api/people (src/components/modules/people-view.tsx:15)"}, "fullDescription": {"text": "`src/components/modules/people-view.tsx:15` calls `GET /api/people` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/people`\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-6b0b1eda4378f932", "name": "Dangling fetch: GET /api/fx?history=12 (src/components/modules/workspace-view.tsx:27)", "shortDescription": {"text": "Dangling fetch: GET /api/fx?history=12 (src/components/modules/workspace-view.tsx:27)"}, "fullDescription": {"text": "`src/components/modules/workspace-view.tsx:27` calls `GET /api/fx?history=12` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/fx`\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-8fa3bb8c541b68e8", "name": "Dangling fetch: GET /api/accounting/mapping?entity=${scope} (src/components/modules/account-mapping.tsx:87)", "shortDescription": {"text": "Dangling fetch: GET /api/accounting/mapping?entity=${scope} (src/components/modules/account-mapping.tsx:87)"}, "fullDescription": {"text": "`src/components/modules/account-mapping.tsx:87` calls `GET /api/accounting/mapping?entity=${scope}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/accounting/mapping`\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-97a1027657894a34", "name": "Dangling fetch: GET /api/settings/members (src/components/modules/members-roster.tsx:61)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/members (src/components/modules/members-roster.tsx:61)"}, "fullDescription": {"text": "`src/components/modules/members-roster.tsx:61` calls `GET /api/settings/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/members`\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-82157854add2df23", "name": "Dangling fetch: POST /api/books/classify (src/components/modules/upload-ingest.tsx:131)", "shortDescription": {"text": "Dangling fetch: POST /api/books/classify (src/components/modules/upload-ingest.tsx:131)"}, "fullDescription": {"text": "`src/components/modules/upload-ingest.tsx:131` calls `POST /api/books/classify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/classify`\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-1bc4a4f9e6829203", "name": "Dangling fetch: GET /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:35)"}, "fullDescription": {"text": "`src/components/modules/settings/credentials-panel.tsx:35` calls `GET /api/settings/credentials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/credentials`\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-49654341b37e041b", "name": "Dangling fetch: POST /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:55)"}, "fullDescription": {"text": "`src/components/modules/settings/credentials-panel.tsx:55` calls `POST /api/settings/credentials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/credentials`\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-cf6191124fdc39d0", "name": "Dangling fetch: GET /api/settings/members (src/components/modules/settings/credentials-panel.tsx:192)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/members (src/components/modules/settings/credentials-panel.tsx:192)"}, "fullDescription": {"text": "`src/components/modules/settings/credentials-panel.tsx:192` calls `GET /api/settings/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/members`\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-cace035508690112", "name": "Dangling fetch: POST /api/settings/members (src/components/modules/settings/credentials-panel.tsx:233)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/members (src/components/modules/settings/credentials-panel.tsx:233)"}, "fullDescription": {"text": "`src/components/modules/settings/credentials-panel.tsx:233` calls `POST /api/settings/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/members`\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-463872ae00082036", "name": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${m} (src/components/modules/books/opex-trend.tsx:49)", "shortDescription": {"text": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${m} (src/components/modules/books/opex-trend.tsx:49)"}, "fullDescription": {"text": "`src/components/modules/books/opex-trend.tsx:49` calls `GET /api/books/opex?entity=${scope}&month=${m}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/opex`\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-c1cd27be5de0fba9", "name": "Dangling fetch: GET /api/books/wholesale-share?entity=HOW&month=${mb} (src/components/modules/books/concentration-view.t", "shortDescription": {"text": "Dangling fetch: GET /api/books/wholesale-share?entity=HOW&month=${mb} (src/components/modules/books/concentration-view.tsx:73)"}, "fullDescription": {"text": "`src/components/modules/books/concentration-view.tsx:73` calls `GET /api/books/wholesale-share?entity=HOW&month=${mb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/wholesale-share`\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-81f40b8f9935093d", "name": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${start}&end=${end} (src/components/modules/books/conc", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${start}&end=${end} (src/components/modules/books/concentration-view.tsx:82)"}, "fullDescription": {"text": "`src/components/modules/books/concentration-view.tsx:82` calls `GET /api/commerce/customers?entity=${scope}&start=${start}&end=${end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/customers`\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-16621afcf5839aac", "name": "Dangling fetch: GET /api/commerce/products-share?entity=${scope}&month=${mb} (src/components/modules/books/concentration", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/products-share?entity=${scope}&month=${mb} (src/components/modules/books/concentration-view.tsx:86)"}, "fullDescription": {"text": "`src/components/modules/books/concentration-view.tsx:86` calls `GET /api/commerce/products-share?entity=${scope}&month=${mb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/products-share`\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-9303d8851a60c91a", "name": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/bo", "shortDescription": {"text": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/books/concentration-view.tsx:90)"}, "fullDescription": {"text": "`src/components/modules/books/concentration-view.tsx:90` calls `GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/counterparty-balance`\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-1eb9c35341a74a72", "name": "Dangling fetch: GET /api/books/expenseone-unmatched (src/components/modules/books/expenseone-unmatched-card.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/books/expenseone-unmatched (src/components/modules/books/expenseone-unmatched-card.tsx:38)"}, "fullDescription": {"text": "`src/components/modules/books/expenseone-unmatched-card.tsx:38` calls `GET /api/books/expenseone-unmatched` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/expenseone-unmatched`\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-7b2cd8ecf00232b7", "name": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:38)"}, "fullDescription": {"text": "`src/components/modules/books/projection-view.tsx:38` calls `GET /api/insights/projection?month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/insights/projection`\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-7861104237f7668b", "name": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:54)"}, "fullDescription": {"text": "`src/components/modules/books/projection-view.tsx:54` calls `GET /api/insights/projection?month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/insights/projection`\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-b64f0071c5eaf96f", "name": "Dangling fetch: POST /api/insights/projection (src/components/modules/books/projection-view.tsx:325)", "shortDescription": {"text": "Dangling fetch: POST /api/insights/projection (src/components/modules/books/projection-view.tsx:325)"}, "fullDescription": {"text": "`src/components/modules/books/projection-view.tsx:325` calls `POST /api/insights/projection` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/insights/projection`\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-6ae6bef25d1cbce6", "name": "Dangling fetch: DELETE /api/insights/projection?entity=${row.code}&month=${month} (src/components/modules/books/projecti", "shortDescription": {"text": "Dangling fetch: DELETE /api/insights/projection?entity=${row.code}&month=${month} (src/components/modules/books/projection-view.tsx:346)"}, "fullDescription": {"text": "`src/components/modules/books/projection-view.tsx:346` calls `DELETE /api/insights/projection?entity=${row.code}&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/insights/projection`\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-22ada97d3faf52b9", "name": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/books/", "shortDescription": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/books/transaction-editor.tsx:52)"}, "fullDescription": {"text": "`src/components/modules/books/transaction-editor.tsx:52` calls `GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/internal-accounts`\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-59d63ba856dbe34d", "name": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txnId)} (src/components/modules/books/transaction-edi", "shortDescription": {"text": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txnId)} (src/components/modules/books/transaction-editor.tsx:107)"}, "fullDescription": {"text": "`src/components/modules/books/transaction-editor.tsx:107` calls `PATCH /api/books/transactions/${encodeURIComponent(txnId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/transactions/<p>`\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-d0982ec4f6b45cf7", "name": "Dangling fetch: POST /api/books/counterparty-settlement (src/components/modules/books/settlement-view.tsx:106)", "shortDescription": {"text": "Dangling fetch: POST /api/books/counterparty-settlement (src/components/modules/books/settlement-view.tsx:106)"}, "fullDescription": {"text": "`src/components/modules/books/settlement-view.tsx:106` calls `POST /api/books/counterparty-settlement` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/counterparty-settlement`\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-ad9f83d4c8f88a3c", "name": "Dangling fetch: DELETE /api/books/journal/${encodeURIComponent(String(jeId))} (src/components/modules/books/journal-entr", "shortDescription": {"text": "Dangling fetch: DELETE /api/books/journal/${encodeURIComponent(String(jeId))} (src/components/modules/books/journal-entry-form.tsx:52)"}, "fullDescription": {"text": "`src/components/modules/books/journal-entry-form.tsx:52` calls `DELETE /api/books/journal/${encodeURIComponent(String(jeId))}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/journal/<p>`\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-0697fecff094e191", "name": "Dangling fetch: GET /api/books/standard-accounts (src/components/modules/books/journal-entry-form.tsx:126)", "shortDescription": {"text": "Dangling fetch: GET /api/books/standard-accounts (src/components/modules/books/journal-entry-form.tsx:126)"}, "fullDescription": {"text": "`src/components/modules/books/journal-entry-form.tsx:126` calls `GET /api/books/standard-accounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/standard-accounts`\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-907a50fd66eb3f7d", "name": "Dangling fetch: POST /api/books/journal (src/components/modules/books/journal-entry-form.tsx:192)", "shortDescription": {"text": "Dangling fetch: POST /api/books/journal (src/components/modules/books/journal-entry-form.tsx:192)"}, "fullDescription": {"text": "`src/components/modules/books/journal-entry-form.tsx:192` calls `POST /api/books/journal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/journal`\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-39e6f41e1f7f887f", "name": "Dangling fetch: GET /api/cashflow/forecast?entity=${entity}&from=${from}&to=${to} (src/components/modules/books/forecast", "shortDescription": {"text": "Dangling fetch: GET /api/cashflow/forecast?entity=${entity}&from=${from}&to=${to} (src/components/modules/books/forecast-view.tsx:112)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:112` calls `GET /api/cashflow/forecast?entity=${entity}&from=${from}&to=${to}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cashflow/forecast`\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-7e4f44d978f954e3", "name": "Dangling fetch: GET /api/cash/balances (src/components/modules/books/forecast-view.tsx:131)", "shortDescription": {"text": "Dangling fetch: GET /api/cash/balances (src/components/modules/books/forecast-view.tsx:131)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:131` calls `GET /api/cash/balances` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cash/balances`\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-ae1a79656453f209", "name": "Dangling fetch: GET /api/books/internal-accounts?entity=${draftEntity} (src/components/modules/books/forecast-view.tsx:1", "shortDescription": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${draftEntity} (src/components/modules/books/forecast-view.tsx:153)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:153` calls `GET /api/books/internal-accounts?entity=${draftEntity}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/internal-accounts`\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-72cba8534cdfbdb6", "name": "Dangling fetch: GET /api/cashflow/actuals?entity=${entity}&period=${ym} (src/components/modules/books/forecast-view.tsx:", "shortDescription": {"text": "Dangling fetch: GET /api/cashflow/actuals?entity=${entity}&period=${ym} (src/components/modules/books/forecast-view.tsx:182)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:182` calls `GET /api/cashflow/actuals?entity=${entity}&period=${ym}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cashflow/actuals`\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-6d13c7bb43ddf27b", "name": "Dangling fetch: POST /api/cashflow/forecast (src/components/modules/books/forecast-view.tsx:284)", "shortDescription": {"text": "Dangling fetch: POST /api/cashflow/forecast (src/components/modules/books/forecast-view.tsx:284)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:284` calls `POST /api/cashflow/forecast` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cashflow/forecast`\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-97617af1183d106b", "name": "Dangling fetch: DELETE /api/cashflow/forecast/${id} (src/components/modules/books/forecast-view.tsx:318)", "shortDescription": {"text": "Dangling fetch: DELETE /api/cashflow/forecast/${id} (src/components/modules/books/forecast-view.tsx:318)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:318` calls `DELETE /api/cashflow/forecast/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cashflow/forecast/<p>`\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-aa80eb15dede912a", "name": "Dangling fetch: POST /api/cashflow/forecast/copy (src/components/modules/books/forecast-view.tsx:327)", "shortDescription": {"text": "Dangling fetch: POST /api/cashflow/forecast/copy (src/components/modules/books/forecast-view.tsx:327)"}, "fullDescription": {"text": "`src/components/modules/books/forecast-view.tsx:327` calls `POST /api/cashflow/forecast/copy` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cashflow/forecast/copy`\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-95809713ccc2b98f", "name": "Dangling fetch: GET /api/books/statements/balance?entity=${scope}&year=${year} (src/components/modules/books/statements/", "shortDescription": {"text": "Dangling fetch: GET /api/books/statements/balance?entity=${scope}&year=${year} (src/components/modules/books/statements/balance-sheet-statement.tsx:35)"}, "fullDescription": {"text": "`src/components/modules/books/statements/balance-sheet-statement.tsx:35` calls `GET /api/books/statements/balance?entity=${scope}&year=${year}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/statements/balance`\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-dbc19e81ea75fe6a", "name": "Dangling fetch: GET /api/books/statements/trial-balance?entity=${scope}&year=${year} (src/components/modules/books/state", "shortDescription": {"text": "Dangling fetch: GET /api/books/statements/trial-balance?entity=${scope}&year=${year} (src/components/modules/books/statements/trial-balance.tsx:32)"}, "fullDescription": {"text": "`src/components/modules/books/statements/trial-balance.tsx:32` calls `GET /api/books/statements/trial-balance?entity=${scope}&year=${year}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/statements/trial-balance`\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-42f72f6fba8cfe84", "name": "Dangling fetch: GET /api/books/statements/income?entity=${scope}&year=${year} (src/components/modules/books/statements/i", "shortDescription": {"text": "Dangling fetch: GET /api/books/statements/income?entity=${scope}&year=${year} (src/components/modules/books/statements/income-statement.tsx:33)"}, "fullDescription": {"text": "`src/components/modules/books/statements/income-statement.tsx:33` calls `GET /api/books/statements/income?entity=${scope}&year=${year}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/statements/income`\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-7fcc01a6a3cdee6a", "name": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books/statements/genera", "shortDescription": {"text": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books/statements/general-ledger.tsx:30)"}, "fullDescription": {"text": "`src/components/modules/books/statements/general-ledger.tsx:30` calls `GET /api/books/ledger?entity=${scope}&month=${month}${q}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/books/ledger`\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-3f7cea1c9d9d5526", "name": "Dangling fetch: GET /api/commerce/wholesale-accounts?entity=HOW&month=${month} (src/components/modules/commerce/wholesal", "shortDescription": {"text": "Dangling fetch: GET /api/commerce/wholesale-accounts?entity=HOW&month=${month} (src/components/modules/commerce/wholesale-accounts-panel.tsx:52)"}, "fullDescription": {"text": "`src/components/modules/commerce/wholesale-accounts-panel.tsx:52` calls `GET /api/commerce/wholesale-accounts?entity=HOW&month=${month}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/commerce/wholesale-accounts`\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-f0c119b5e05afffc", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/llm/client.ts:75)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/llm/client.ts:75)"}, "fullDescription": {"text": "`src/lib/llm/client.ts:75` 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-21c7ff7b8ef22c44", "name": "Unused endpoint: GET /accounts", "shortDescription": {"text": "Unused endpoint: GET /accounts"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/mercury-client.ts` declares `GET /accounts` 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-4050c2950d1db9a2", "name": "Unused endpoint: POST /v1/oAuth/", "shortDescription": {"text": "Unused endpoint: POST /v1/oAuth/"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/ssart-client.ts` declares `POST /v1/oAuth/` 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-4b87371125b3269a", "name": "Unused endpoint: POST /v1/oAuth/utk/", "shortDescription": {"text": "Unused endpoint: POST /v1/oAuth/utk/"}, "fullDescription": {"text": "`worker/salesone-sync/src/lib/ssart-client.ts` declares `POST /v1/oAuth/utk/` 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/19424"}, "properties": {"repository": "shawnha/hanahone_erp", "repoUrl": "https://github.com/shawnha/hanahone_erp", "branch": "main"}, "results": [{"ruleId": "scanner-e6d5b797dc90d241", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/replicate.ts:75"}, "properties": {"repobilityId": "c91108abd717621d", "scanner": "scanner-primary", "fingerprint": "e6d5b797dc90d241", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2306f40137091193", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/fx-sync.ts:110"}, "properties": {"repobilityId": "09a27c7830658e68", "scanner": "scanner-primary", "fingerprint": "2306f40137091193", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc8cbd4a653a605b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/codef-sync.ts:112"}, "properties": {"repobilityId": "9716e6824080f72a", "scanner": "scanner-primary", "fingerprint": "fc8cbd4a653a605b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86ee8f4553781f09", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/gowid-sync.ts:86"}, "properties": {"repobilityId": "d34fde53e05d954b", "scanner": "scanner-primary", "fingerprint": "86ee8f4553781f09", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0499e047dc737af6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/sync.ts:81"}, "properties": {"repobilityId": "393319d6e3ad9aff", "scanner": "scanner-primary", "fingerprint": "0499e047dc737af6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68d16779fbf26623", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/mercury-sync.ts:92"}, "properties": {"repobilityId": "992bc29b445ad8aa", "scanner": "scanner-primary", "fingerprint": "68d16779fbf26623", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba86eff1c67ea2ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/map-shadow.ts:67"}, "properties": {"repobilityId": "0e53ce0e03fad962", "scanner": "scanner-primary", "fingerprint": "ba86eff1c67ea2ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44170dd3e4967fd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/due-date-sync.ts:58"}, "properties": {"repobilityId": "e733c35e8602a362", "scanner": "scanner-primary", "fingerprint": "44170dd3e4967fd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b52479abadfc47a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/enqueue-daily.ts:51"}, "properties": {"repobilityId": "b9061440a32c0951", "scanner": "scanner-primary", "fingerprint": "b52479abadfc47a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31331a669070cfa0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker/salesone-sync/src/ssart-sync.ts:102"}, "properties": {"repobilityId": "f4719e1fdfd44a98", "scanner": "scanner-primary", "fingerprint": "31331a669070cfa0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54c1634f78b2c2ce", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/order-number.ts:25"}, "properties": {"repobilityId": "6be6b0eb3fe040ab", "scanner": "scanner-primary", "fingerprint": "54c1634f78b2c2ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e3e1d3a6595fc2f0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/sync-runner.ts:184"}, "properties": {"repobilityId": "48dc5c4b58e0d3e9", "scanner": "scanner-primary", "fingerprint": "e3e1d3a6595fc2f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-15b554c09f5e5f68", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 worker/salesone-sync/src/lib/integrations/inventory-calculator.ts:9"}, "properties": {"repobilityId": "f5914246d2b8f27a", "scanner": "scanner-primary", "fingerprint": "15b554c09f5e5f68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a145f05982c8cbe9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/approvals-inbox.tsx:209"}, "properties": {"repobilityId": "956b49b96ecbaf77", "scanner": "scanner-primary", "fingerprint": "a145f05982c8cbe9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f2bcb2e32b37120", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/module-ui.tsx:171"}, "properties": {"repobilityId": "45db16d5623212da", "scanner": "scanner-primary", "fingerprint": "8f2bcb2e32b37120", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48140da9e4eb6053", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/entity-switcher.tsx:177"}, "properties": {"repobilityId": "d0db71d116383cd5", "scanner": "scanner-primary", "fingerprint": "48140da9e4eb6053", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c6ed23c4168a7aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app-shell.tsx:475"}, "properties": {"repobilityId": "e69092977008be35", "scanner": "scanner-primary", "fingerprint": "2c6ed23c4168a7aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcce34e62c2b3317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books-view.tsx:1725"}, "properties": {"repobilityId": "ba9485777f1f84a7", "scanner": "scanner-primary", "fingerprint": "fcce34e62c2b3317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1d97cc3e940c825", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/match-workspace.tsx:197"}, "properties": {"repobilityId": "959a0f99d796ffd0", "scanner": "scanner-primary", "fingerprint": "e1d97cc3e940c825", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00caeef3d588a5a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/tax-calendar.tsx:166"}, "properties": {"repobilityId": "2c76ee492746fc5d", "scanner": "scanner-primary", "fingerprint": "00caeef3d588a5a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-153c2ce5d1977a2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/upload-ingest.tsx:233"}, "properties": {"repobilityId": "335b8fcd141be7dd", "scanner": "scanner-primary", "fingerprint": "153c2ce5d1977a2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84a9f327b31aebcd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/opex-trend.tsx:171"}, "properties": {"repobilityId": "514483473d240e0d", "scanner": "scanner-primary", "fingerprint": "84a9f327b31aebcd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6bab616830079c79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/concentration-view.tsx:193"}, "properties": {"repobilityId": "0b1333e6e4783afb", "scanner": "scanner-primary", "fingerprint": "6bab616830079c79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-901b98d72bdae6f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/expenseone-unmatched-card.tsx:112"}, "properties": {"repobilityId": "8671d045707d39f2", "scanner": "scanner-primary", "fingerprint": "901b98d72bdae6f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25cb59870bec9777", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/modules/books/settlement-view.tsx:298"}, "properties": {"repobilityId": "598e97421c692ea4", "scanner": "scanner-primary", "fingerprint": "25cb59870bec9777", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bdbc989b667b585", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_mobile_interactive.html:902"}, "properties": {"repobilityId": "a46a712ab73a1b17", "scanner": "scanner-primary", "fingerprint": "2bdbc989b667b585", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_v04_mobile_interactive.html"}, "region": {"startLine": 902}}}]}, {"ruleId": "scanner-20627037305b8f92", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v04_desktop.html:1285"}, "properties": {"repobilityId": "e7e68f96c44c7a8c", "scanner": "scanner-primary", "fingerprint": "20627037305b8f92", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_v04_desktop.html"}, "region": {"startLine": 1285}}}]}, {"ruleId": "scanner-a0b2bf739ad21038", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/text-contrast-review.html:81"}, "properties": {"repobilityId": "bc4baf968c3488f1", "scanner": "scanner-primary", "fingerprint": "a0b2bf739ad21038", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/text-contrast-review.html"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-97e88a011eec722f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/cohort-retention-design.html:218"}, "properties": {"repobilityId": "2b7accdf48233cf8", "scanner": "scanner-primary", "fingerprint": "97e88a011eec722f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/cohort-retention-design.html"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-5c5946709a7a18ae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-chart-layout-options.html:138"}, "properties": {"repobilityId": "7520401232b49211", "scanner": "scanner-primary", "fingerprint": "5c5946709a7a18ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/dashboard-chart-layout-options.html"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-6008eab7029344a2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/period-picker-highlight-options.html:75"}, "properties": {"repobilityId": "4ab37470219146ce", "scanner": "scanner-primary", "fingerprint": "6008eab7029344a2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/period-picker-highlight-options.html"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-e8d6b670ac400301", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_shell_review.html:1760"}, "properties": {"repobilityId": "52f26d65f4027ad8", "scanner": "scanner-primary", "fingerprint": "e8d6b670ac400301", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_shell_review.html"}, "region": {"startLine": 1760}}}]}, {"ruleId": "scanner-cb515841f78a916a", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in docs/hanahone_erp_shell_review.html:1763"}, "properties": {"repobilityId": "c60fc7377f7a0714", "scanner": "scanner-primary", "fingerprint": "cb515841f78a916a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_shell_review.html"}, "region": {"startLine": 1763}}}]}, {"ruleId": "scanner-794492f6bf1267cb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/projection-formula-options.html:283"}, "properties": {"repobilityId": "7fc011fb8b8992cf", "scanner": "scanner-primary", "fingerprint": "794492f6bf1267cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/projection-formula-options.html"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-8fa3c1816034f1a4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-gmail-flow.html:150"}, "properties": {"repobilityId": "a556d777cc6aac5d", "scanner": "scanner-primary", "fingerprint": "8fa3c1816034f1a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hiring-gmail-flow.html"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-67cbda7854f09861", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/opex-concentration-mockup.html:138"}, "properties": {"repobilityId": "929af7f4299efa70", "scanner": "scanner-primary", "fingerprint": "67cbda7854f09861", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/opex-concentration-mockup.html"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-9d2731f927fc26df", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v03_interactive.html:1257"}, "properties": {"repobilityId": "ae646b7203a0b9d7", "scanner": "scanner-primary", "fingerprint": "9d2731f927fc26df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_v03_interactive.html"}, "region": {"startLine": 1257}}}]}, {"ruleId": "scanner-840927467ad8777c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-margin-overlap-options.html:135"}, "properties": {"repobilityId": "631a5e9d483e1321", "scanner": "scanner-primary", "fingerprint": "840927467ad8777c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/dashboard-margin-overlap-options.html"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-af7c5208990014a7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-erp-view.html:171"}, "properties": {"repobilityId": "fd8211c728b0f5ae", "scanner": "scanner-primary", "fingerprint": "af7c5208990014a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hiring-erp-view.html"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-2f7208b64d237421", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hanahone_erp_v05_mobile_interactive.html:948"}, "properties": {"repobilityId": "44560a964039e621", "scanner": "scanner-primary", "fingerprint": "2f7208b64d237421", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hanahone_erp_v05_mobile_interactive.html"}, "region": {"startLine": 948}}}]}, {"ruleId": "scanner-d76c924296cce356", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/dashboard-drilldown-nodes.html:221"}, "properties": {"repobilityId": "f7b7ab3853f51a0f", "scanner": "scanner-primary", "fingerprint": "d76c924296cce356", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/dashboard-drilldown-nodes.html"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-383219a491255980", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/hiring-onboarding-mockup.html:337"}, "properties": {"repobilityId": "d7590a3bce27ccd0", "scanner": "scanner-primary", "fingerprint": "383219a491255980", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/hiring-onboarding-mockup.html"}, "region": {"startLine": 337}}}]}, {"ruleId": "scanner-88aa8c85d02171e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/shell.html:273"}, "properties": {"repobilityId": "23dc8fcd8bc11f2c", "scanner": "scanner-primary", "fingerprint": "88aa8c85d02171e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/shell.html"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-85e02a2d1727a56c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/entity-filter.html:227"}, "properties": {"repobilityId": "13a0e403da613cd7", "scanner": "scanner-primary", "fingerprint": "85e02a2d1727a56c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/entity-filter.html"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-74b84d5d635cb55a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/architecture.html:707"}, "properties": {"repobilityId": "a3edddf7b377b763", "scanner": "scanner-primary", "fingerprint": "74b84d5d635cb55a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/architecture.html"}, "region": {"startLine": 707}}}]}, {"ruleId": "scanner-beb03501a3992211", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/canon-explainer.html:231"}, "properties": {"repobilityId": "9c408ff5661191cb", "scanner": "scanner-primary", "fingerprint": "beb03501a3992211", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/canon-explainer.html"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-3c2bb8c1494fa6d3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/subnav.html:132"}, "properties": {"repobilityId": "ca4ff1fbcf9c1559", "scanner": "scanner-primary", "fingerprint": "3c2bb8c1494fa6d3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/subnav.html"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-26a09bc4d5dcc40a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/mockups/ai-model.html:118"}, "properties": {"repobilityId": "5a8947942eede2d1", "scanner": "scanner-primary", "fingerprint": "26a09bc4d5dcc40a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/mockups/ai-model.html"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-044ab789aff0ae47", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in worker/salesone-sync/src/lib/dispatch-sync.ts:11"}, "properties": {"repobilityId": "5f1fe6000388ca01", "scanner": "scanner-primary", "fingerprint": "044ab789aff0ae47", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker/salesone-sync/src/lib/dispatch-sync.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-323c8959b31cc799", "level": "note", "message": {"text": "Very large file: src/components/app-shell.tsx (1596 lines)"}, "properties": {"repobilityId": "5b29383baa36a2b0", "scanner": "scanner-primary", "fingerprint": "323c8959b31cc799", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d5e08d12d42e02c7", "level": "note", "message": {"text": "Very large file: src/components/modules/books-view.tsx (2830 lines)"}, "properties": {"repobilityId": "785a542139266e84", "scanner": "scanner-primary", "fingerprint": "d5e08d12d42e02c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "281d9c9e6c042bfc", "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": "8ceb5f9d1cde6d6a", "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": "96b95d8ec9b3c46a", "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": "9cd44eb8bc59e358", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "cd76b0c0cfdfea3c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e12dfbd6ccdf0a6f", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5e7413cd69240814", "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": "31465c78174b4b07", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-77238be169698e53", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/fx-sync.ts:1"}, "properties": {"repobilityId": "eada6c20b4d02601", "scanner": "scanner-primary", "fingerprint": "77238be169698e53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb5a0a8a36267a51", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/codef-sync.ts:1"}, "properties": {"repobilityId": "11041d432b8f99d6", "scanner": "scanner-primary", "fingerprint": "cb5a0a8a36267a51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-feddd2c6eb9ddd59", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/gowid-sync.ts:1"}, "properties": {"repobilityId": "12e56086f205cbf8", "scanner": "scanner-primary", "fingerprint": "feddd2c6eb9ddd59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdbd19b8f6dcd316", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/sync.ts:1"}, "properties": {"repobilityId": "1f6b5a7c745e87de", "scanner": "scanner-primary", "fingerprint": "cdbd19b8f6dcd316", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cffacdd4a7f9294", "level": "none", "message": {"text": "Commented-code block (9 lines) in worker/salesone-sync/src/tables-financeone.ts:1"}, "properties": {"repobilityId": "dc5e1d415bd830b0", "scanner": "scanner-primary", "fingerprint": "7cffacdd4a7f9294", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da069d12c1d4aa7b", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/tables-expenseone.ts:1"}, "properties": {"repobilityId": "ff04dd72e2c6c9df", "scanner": "scanner-primary", "fingerprint": "da069d12c1d4aa7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58c69efaa4293f54", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/mercury-sync.ts:1"}, "properties": {"repobilityId": "98759347173fcf1b", "scanner": "scanner-primary", "fingerprint": "58c69efaa4293f54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a89fcc37147b7a4", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/map-shadow.ts:1"}, "properties": {"repobilityId": "6d8fe8619db739d8", "scanner": "scanner-primary", "fingerprint": "1a89fcc37147b7a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99614b0d16286a87", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/due-date-sync.ts:1"}, "properties": {"repobilityId": "f1622528f1f6e27c", "scanner": "scanner-primary", "fingerprint": "99614b0d16286a87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79ce83dd57e523f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/ssart-sync.ts:1"}, "properties": {"repobilityId": "7570b8ba09ce39c4", "scanner": "scanner-primary", "fingerprint": "79ce83dd57e523f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8b5e230be35e399", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/mercury-client.ts:3"}, "properties": {"repobilityId": "16d42e949af6d484", "scanner": "scanner-primary", "fingerprint": "d8b5e230be35e399", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92ebf1a3d7c46d54", "level": "none", "message": {"text": "Commented-code block (7 lines) in worker/salesone-sync/src/lib/codef-client.ts:3"}, "properties": {"repobilityId": "65dff2aeaf9edfd1", "scanner": "scanner-primary", "fingerprint": "92ebf1a3d7c46d54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4189933234ce6d5", "level": "none", "message": {"text": "Commented-code block (6 lines) in worker/salesone-sync/src/lib/order-number.ts:28"}, "properties": {"repobilityId": "b4e6c600eca0e443", "scanner": "scanner-primary", "fingerprint": "e4189933234ce6d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f29c3a907c4668ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker/salesone-sync/src/lib/gowid-client.ts:3"}, "properties": {"repobilityId": "5f95878a0513a87f", "scanner": "scanner-primary", "fingerprint": "f29c3a907c4668ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f6fe37969390bba", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/dispatch-sync.ts:3"}, "properties": {"repobilityId": "89f5f4af948d8c97", "scanner": "scanner-primary", "fingerprint": "1f6fe37969390bba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31b5fda3faff5a7c", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/ssart-client.ts:3"}, "properties": {"repobilityId": "8ddd7d0f8449d47c", "scanner": "scanner-primary", "fingerprint": "31b5fda3faff5a7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-589763b98c96effb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30"}, "properties": {"repobilityId": "99e02ca1335f049c", "scanner": "scanner-primary", "fingerprint": "589763b98c96effb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4dcd01860bdd4f59", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/pharmacy.ts:30"}, "properties": {"repobilityId": "dce27edd9e5210dd", "scanner": "scanner-primary", "fingerprint": "4dcd01860bdd4f59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71263ea53a0fcbb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20"}, "properties": {"repobilityId": "a28d07f5a653a2f8", "scanner": "scanner-primary", "fingerprint": "71263ea53a0fcbb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d2e56ea78af87982", "level": "none", "message": {"text": "Commented-code block (8 lines) in worker/salesone-sync/src/lib/integrations/connectors/coupang.ts:374"}, "properties": {"repobilityId": "ee577af863a1893b", "scanner": "scanner-primary", "fingerprint": "d2e56ea78af87982", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddd6121862d80223", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/salesone-sync/src/lib/integrations/naver/auth.ts:33"}, "properties": {"repobilityId": "1f3a309fe32e63cc", "scanner": "scanner-primary", "fingerprint": "ddd6121862d80223", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a418bfc47a08cf08", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/approvals-inbox.tsx:65"}, "properties": {"repobilityId": "cfe3260a2ddfd37c", "scanner": "scanner-primary", "fingerprint": "a418bfc47a08cf08", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3822c01a57c17869", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books-view.tsx:3"}, "properties": {"repobilityId": "5b0a28867ef73eac", "scanner": "scanner-primary", "fingerprint": "3822c01a57c17869", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69ae2e7111ac2498", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/connect-view.tsx:271"}, "properties": {"repobilityId": "8f479af05b4886c9", "scanner": "scanner-primary", "fingerprint": "69ae2e7111ac2498", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06533dc711e8b1d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/people-view.tsx:15"}, "properties": {"repobilityId": "fbe6a0915a275212", "scanner": "scanner-primary", "fingerprint": "06533dc711e8b1d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb7ee01511c439ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/modules/books/concentration-view.tsx:73"}, "properties": {"repobilityId": "21770bdbdb71d513", "scanner": "scanner-primary", "fingerprint": "cb7ee01511c439ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5170b34cc5b9874", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/diag/projection-backtest/route.ts:1"}, "properties": {"repobilityId": "155f121200d2f267", "scanner": "scanner-primary", "fingerprint": "a5170b34cc5b9874", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecba0bd43652ab8b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/journal/route.ts:13"}, "properties": {"repobilityId": "a1a2fdaba931acd4", "scanner": "scanner-primary", "fingerprint": "ecba0bd43652ab8b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb8cd6ced51493ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/books/balance-sheet/route.ts:237"}, "properties": {"repobilityId": "d1e488e728e1f198", "scanner": "scanner-primary", "fingerprint": "bb8cd6ced51493ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35b9cac0e9110933", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/commerce/customers/route.ts:17"}, "properties": {"repobilityId": "06dff41adec29e36", "scanner": "scanner-primary", "fingerprint": "35b9cac0e9110933", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ad96fd9cf064332", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/web-push.ts:3"}, "properties": {"repobilityId": "a82cf630d454c17c", "scanner": "scanner-primary", "fingerprint": "0ad96fd9cf064332", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33ea60ed6066d52c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/gowid-normalize.ts:3"}, "properties": {"repobilityId": "a222e4e62762c711", "scanner": "scanner-primary", "fingerprint": "33ea60ed6066d52c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be3367237620f83a", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/mapping-cascade.ts:3"}, "properties": {"repobilityId": "7b9570838120c579", "scanner": "scanner-primary", "fingerprint": "be3367237620f83a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e3b4307ffc08055", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/settlement-join.ts:3"}, "properties": {"repobilityId": "d9fb791830d56c81", "scanner": "scanner-primary", "fingerprint": "0e3b4307ffc08055", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-289524d02ce585d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/cashflow-rollforward.ts:3"}, "properties": {"repobilityId": "1b98a7f038098724", "scanner": "scanner-primary", "fingerprint": "289524d02ce585d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5a0831ffcecc7e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ssart-normalize.ts:3"}, "properties": {"repobilityId": "4bb523285f638ac0", "scanner": "scanner-primary", "fingerprint": "f5a0831ffcecc7e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a8671f71750064f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pnl-accrual-map.ts:1"}, "properties": {"repobilityId": "e3b67c88597a1dd7", "scanner": "scanner-primary", "fingerprint": "1a8671f71750064f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-173b9dbeae9db957", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/bookkeeping.ts:3"}, "properties": {"repobilityId": "83df5cf4860059db", "scanner": "scanner-primary", "fingerprint": "173b9dbeae9db957", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f8566fc1704742c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/mercury-normalize.ts:3"}, "properties": {"repobilityId": "cfb519a5221bc118", "scanner": "scanner-primary", "fingerprint": "0f8566fc1704742c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d037ba5f054789e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/confirmed-ledger-2025.ts:1"}, "properties": {"repobilityId": "cada777b3bb5827b", "scanner": "scanner-primary", "fingerprint": "5d037ba5f054789e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b8d7cf04369359a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/extra-balances.ts:3"}, "properties": {"repobilityId": "034aba5df261e2b6", "scanner": "scanner-primary", "fingerprint": "7b8d7cf04369359a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad6ba2cfe8f55036", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/codef-normalize.ts:3"}, "properties": {"repobilityId": "9d933023646c5cf0", "scanner": "scanner-primary", "fingerprint": "ad6ba2cfe8f55036", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20dd1fb2816dca53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/llm/client.ts:75"}, "properties": {"repobilityId": "5c62579e29c5c166", "scanner": "scanner-primary", "fingerprint": "20dd1fb2816dca53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca395a18e146a116", "level": "note", "message": {"text": "38 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "44b4fc87d4005415", "scanner": "scanner-primary", "fingerprint": "ca395a18e146a116", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-b4e8a4d62d0e2429", "level": "error", "message": {"text": "Dangling fetch: GET /v1/kr/bank/b/account/account-list (worker/salesone-sync/src/lib/codef-client.ts:97)"}, "properties": {"repobilityId": "d181edb3b98fb139", "scanner": "scanner-primary", "fingerprint": "b4e8a4d62d0e2429", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-de35ef44a7c29dc6", "level": "error", "message": {"text": "Dangling fetch: GET /v1/kr/card/b/account/card-list (worker/salesone-sync/src/lib/codef-client.ts:104)"}, "properties": {"repobilityId": "10b7a3a8f09ac37b", "scanner": "scanner-primary", "fingerprint": "de35ef44a7c29dc6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-17f8bdbd67c30b86", "level": "error", "message": {"text": "Dangling fetch: GET /v1/kr/card/b/account/approval-list (worker/salesone-sync/src/lib/codef-client.ts:120)"}, "properties": {"repobilityId": "ac8a32530d22aebb", "scanner": "scanner-primary", "fingerprint": "17f8bdbd67c30b86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8d4cdc4d420b7c64", "level": "error", "message": {"text": "Dangling fetch: GET /v1/kr/public/nt/tax-invoice/integrated-check-list (worker/salesone-sync/src/lib/codef-client.ts:132)"}, "properties": {"repobilityId": "be3c0aca1e93be92", "scanner": "scanner-primary", "fingerprint": "8d4cdc4d420b7c64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2f45e8dcdbcd7cb8", "level": "error", "message": {"text": "Dangling fetch: GET /v1/kr/bank/b/account/transaction-list (worker/salesone-sync/src/lib/codef-client.ts:149)"}, "properties": {"repobilityId": "485efb6f7663e74d", "scanner": "scanner-primary", "fingerprint": "2f45e8dcdbcd7cb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6f411a25f5508364", "level": "error", "message": {"text": "Dangling fetch: GET /v1/members (worker/salesone-sync/src/lib/gowid-client.ts:37)"}, "properties": {"repobilityId": "34dcd10742411a8f", "scanner": "scanner-primary", "fingerprint": "6f411a25f5508364", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-66018b813396afa9", "level": "error", "message": {"text": "Dangling fetch: GET /v1/expenses (worker/salesone-sync/src/lib/gowid-client.ts:43)"}, "properties": {"repobilityId": "57705ac169705b9e", "scanner": "scanner-primary", "fingerprint": "66018b813396afa9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0607e2ade1c9c8e8", "level": "error", "message": {"text": "Dangling fetch: POST https://${shop}/admin/oauth/access_token (worker/salesone-sync/src/lib/integrations/connectors/shopify.ts:30)"}, "properties": {"repobilityId": "0760beb0bb4bd88f", "scanner": "scanner-primary", "fingerprint": "0607e2ade1c9c8e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f554cb74822daf7b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.amazon.com/auth/o2/token (worker/salesone-sync/src/lib/integrations/connectors/amazon.ts:20)"}, "properties": {"repobilityId": "b1a99fb4ee07ed97", "scanner": "scanner-primary", "fingerprint": "f554cb74822daf7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a361f76d61515455", "level": "error", "message": {"text": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:60)"}, "properties": {"repobilityId": "adb683244f5e3980", "scanner": "scanner-primary", "fingerprint": "a361f76d61515455", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d1f0889c69aa23b", "level": "error", "message": {"text": "Dangling fetch: GET /api/approvals/pending (src/components/approvals-inbox.tsx:65)"}, "properties": {"repobilityId": "4aac13a12a2b21b2", "scanner": "scanner-primary", "fingerprint": "2d1f0889c69aa23b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1608ff3199bb5cf8", "level": "error", "message": {"text": "Dangling fetch: POST /api/approvals/act (src/components/approvals-inbox.tsx:262)"}, "properties": {"repobilityId": "2dc65225c7d896d2", "scanner": "scanner-primary", "fingerprint": "1608ff3199bb5cf8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d79ab58c1d145fcc", "level": "error", "message": {"text": "Dangling fetch: GET /api/cash/balances (src/components/entity-switcher.tsx:91)"}, "properties": {"repobilityId": "74b448544cfddcad", "scanner": "scanner-primary", "fingerprint": "d79ab58c1d145fcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ccc0b88726fa909", "level": "error", "message": {"text": "Dangling fetch: GET /api/rbac/policy (src/components/app-shell.tsx:205)"}, "properties": {"repobilityId": "a0a068ffab1c9737", "scanner": "scanner-primary", "fingerprint": "5ccc0b88726fa909", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-80748ad93ac7cc51", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (src/components/app-shell.tsx:217)"}, "properties": {"repobilityId": "06e9d6f29ec07279", "scanner": "scanner-primary", "fingerprint": "80748ad93ac7cc51", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ab26a4d8869ad60", "level": "error", "message": {"text": "Dangling fetch: GET /api/today/summary?month=${month} (src/components/app-shell.tsx:774)"}, "properties": {"repobilityId": "174276076771371b", "scanner": "scanner-primary", "fingerprint": "0ab26a4d8869ad60", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-73e9c356b3803235", "level": "error", "message": {"text": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/app-shell.tsx:805)"}, "properties": {"repobilityId": "b059712e95868ee4", "scanner": "scanner-primary", "fingerprint": "73e9c356b3803235", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b09d9eec7a0c5eae", "level": "error", "message": {"text": "Dangling fetch: GET /api/fx (src/components/currency-switcher.tsx:54)"}, "properties": {"repobilityId": "258a4b80f9dda749", "scanner": "scanner-primary", "fingerprint": "b09d9eec7a0c5eae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4acee495f25e6bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/insights/projection?month=${currentPeriod} (src/components/charts/revenue-pnl-chart.tsx:305)"}, "properties": {"repobilityId": "37d8c2f8327f9dca", "scanner": "scanner-primary", "fingerprint": "a4acee495f25e6bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd42f8c665bc4ccd", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/transactions?limit=${TX_LIMIT}&entity=${scope}&start=${txRange.start}&end=${txRange.end}${typeQ}${qQ} (src/components/modules/books-view.tsx:320)"}, "properties": {"repobilityId": "9eb1e003fd3bed2a", "scanner": "scanner-primary", "fingerprint": "dd42f8c665bc4ccd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e4da2b601234943", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/expenseone-outflows (src/components/modules/books-view.tsx:362)"}, "properties": {"repobilityId": "14d8141cc9204b9d", "scanner": "scanner-primary", "fingerprint": "8e4da2b601234943", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-927f3a1b7bf520a6", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/contribution?month=${month}&entity=${scope} (src/components/modules/books-view.tsx:426)"}, "properties": {"repobilityId": "d2378944201aabb1", "scanner": "scanner-primary", "fingerprint": "927f3a1b7bf520a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-758571346cda87ee", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/contribution?month=${m}&entity=${scope} (src/components/modules/books-view.tsx:467)"}, "properties": {"repobilityId": "4a8d1d4ae4ba33da", "scanner": "scanner-primary", "fingerprint": "758571346cda87ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c2b7050403e12b95", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/books-view.tsx:509)"}, "properties": {"repobilityId": "f9f44f50bfc303e5", "scanner": "scanner-primary", "fingerprint": "c2b7050403e12b95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6e1cea5ba20b8f6", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/counterparty-settlement?entity=${scope}&direction=${stlDir}&month=${month} (src/components/modules/books-view.tsx:548)"}, "properties": {"repobilityId": "3761b578c21223e2", "scanner": "scanner-primary", "fingerprint": "e6e1cea5ba20b8f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c5be0a6ac0c71991", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/journal?entity=${scope}&start=${start}&end=${end} (src/components/modules/books-view.tsx:598)"}, "properties": {"repobilityId": "a86ad6c54cb24a3f", "scanner": "scanner-primary", "fingerprint": "c5be0a6ac0c71991", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eecfb2c23700eab7", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books-view.tsx:634)"}, "properties": {"repobilityId": "b142abf641767390", "scanner": "scanner-primary", "fingerprint": "eecfb2c23700eab7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-109018de9ade8c9d", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/balance-sheet?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:678)"}, "properties": {"repobilityId": "d082dc44444e6a90", "scanner": "scanner-primary", "fingerprint": "109018de9ade8c9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7384b1fdf82e1f7", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/pnl?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:743)"}, "properties": {"repobilityId": "b6acfe021de31cc2", "scanner": "scanner-primary", "fingerprint": "b7384b1fdf82e1f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b44a0a8a1a7749e1", "level": "error", "message": {"text": "Dangling fetch: GET /api/today/trend?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:779)"}, "properties": {"repobilityId": "ea63f49a61d36127", "scanner": "scanner-primary", "fingerprint": "b44a0a8a1a7749e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2283baf201dfbe2", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:806)"}, "properties": {"repobilityId": "69f3e9ba7a1d8dd2", "scanner": "scanner-primary", "fingerprint": "a2283baf201dfbe2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51d4b85d67ea9e9a", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:839)"}, "properties": {"repobilityId": "733a1ea187f75be4", "scanner": "scanner-primary", "fingerprint": "51d4b85d67ea9e9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a32bee8a08b10c08", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/bep?entity=${scope}&month=${m} (src/components/modules/books-view.tsx:875)"}, "properties": {"repobilityId": "fe796476b2ac7b17", "scanner": "scanner-primary", "fingerprint": "a32bee8a08b10c08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-54a2b6f8e8c7f27e", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/cashflow?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:919)"}, "properties": {"repobilityId": "821dba02714da491", "scanner": "scanner-primary", "fingerprint": "54a2b6f8e8c7f27e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0771b8314d7fbbc6", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/intercompany (src/components/modules/books-view.tsx:960)"}, "properties": {"repobilityId": "525d666f449c62c1", "scanner": "scanner-primary", "fingerprint": "0771b8314d7fbbc6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d88eb26efd60b4b", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/invoices?entity=${scope}&month=${month} (src/components/modules/books-view.tsx:989)"}, "properties": {"repobilityId": "f51bbe95a8ea7943", "scanner": "scanner-primary", "fingerprint": "7d88eb26efd60b4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-491b45548fc04793", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/unmapped?entity=${scope}&limit=300 (src/components/modules/match-workspace.tsx:39)"}, "properties": {"repobilityId": "9f26dc0581d3a669", "scanner": "scanner-primary", "fingerprint": "491b45548fc04793", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff96c01890b50cb2", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txId)} (src/components/modules/match-workspace.tsx:69)"}, "properties": {"repobilityId": "30d96826fa359730", "scanner": "scanner-primary", "fingerprint": "ff96c01890b50cb2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31006dcfa994e233", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/match-workspace.tsx:101)"}, "properties": {"repobilityId": "ae29df587d7a2848", "scanner": "scanner-primary", "fingerprint": "31006dcfa994e233", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df9cecdd041ba8c3", "level": "error", "message": {"text": "Dangling fetch: GET /api/people (src/components/modules/people-directory.tsx:27)"}, "properties": {"repobilityId": "49053becd8d27ac4", "scanner": "scanner-primary", "fingerprint": "df9cecdd041ba8c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5dbd83b4837c2944", "level": "error", "message": {"text": "Dangling fetch: POST /api/people/sync (src/components/modules/people-directory.tsx:55)"}, "properties": {"repobilityId": "21cbcff638be5421", "scanner": "scanner-primary", "fingerprint": "5dbd83b4837c2944", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e5c25eef873a8df", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/people (src/components/modules/people-directory.tsx:76)"}, "properties": {"repobilityId": "0def9bed40b898d9", "scanner": "scanner-primary", "fingerprint": "3e5c25eef873a8df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-359c3d11e7d19662", "level": "error", "message": {"text": "Dangling fetch: POST /api/people (src/components/modules/people-directory.tsx:100)"}, "properties": {"repobilityId": "ba5320cdb9f40121", "scanner": "scanner-primary", "fingerprint": "359c3d11e7d19662", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fba2b36e56187bbb", "level": "error", "message": {"text": "Dangling fetch: GET /api/stock/inventory?limit=200&entity=${scope} (src/components/modules/stock-view.tsx:64)"}, "properties": {"repobilityId": "4144b9129d7830ef", "scanner": "scanner-primary", "fingerprint": "fba2b36e56187bbb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d7c4b76febb36142", "level": "error", "message": {"text": "Dangling fetch: GET /api/stock/products?entity=${scope} (src/components/modules/stock-view.tsx:103)"}, "properties": {"repobilityId": "10e67deceb4cd5f4", "scanner": "scanner-primary", "fingerprint": "d7c4b76febb36142", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c9a5547322b935a", "level": "error", "message": {"text": "Dangling fetch: GET /api/rbac/policy (src/components/modules/rbac-matrix.tsx:36)"}, "properties": {"repobilityId": "3b04c93f0af47c7e", "scanner": "scanner-primary", "fingerprint": "2c9a5547322b935a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6cf29ad9a48a91d9", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/orders?entity=${scope}&start=${range.start}&end=${range.end}&limit=${O_LIMIT}&kind=${ordKind} (src/components/modules/commerce-view.tsx:117)"}, "properties": {"repobilityId": "4a1bae2c99d4edb8", "scanner": "scanner-primary", "fingerprint": "6cf29ad9a48a91d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ce7f2a1c7dd9148", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/channels?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:167)"}, "properties": {"repobilityId": "530db74f85e8681e", "scanner": "scanner-primary", "fingerprint": "2ce7f2a1c7dd9148", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c07c83f9d9489a96", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:214)"}, "properties": {"repobilityId": "782b69ecda830688", "scanner": "scanner-primary", "fingerprint": "c07c83f9d9489a96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e30eb274363e917", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/regions?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:260)"}, "properties": {"repobilityId": "ec06607b2da895fd", "scanner": "scanner-primary", "fingerprint": "8e30eb274363e917", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd8c2afbb55b00c8", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/settlements?entity=${scope}&start=${range.start}&end=${range.end} (src/components/modules/commerce-view.tsx:634)"}, "properties": {"repobilityId": "6d3563bac8cad20d", "scanner": "scanner-primary", "fingerprint": "bd8c2afbb55b00c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d58bb7f875c1da9b", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/payouts?entity=${scope} (src/components/modules/commerce-view.tsx:680)"}, "properties": {"repobilityId": "eec0a1ca37efed40", "scanner": "scanner-primary", "fingerprint": "d58bb7f875c1da9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c43c2f3a01a7bead", "level": "error", "message": {"text": "Dangling fetch: GET /api/connect/status (src/components/modules/connect-view.tsx:38)"}, "properties": {"repobilityId": "98ee2fa9c9a52612", "scanner": "scanner-primary", "fingerprint": "c43c2f3a01a7bead", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f68c88009e6d617b", "level": "error", "message": {"text": "Dangling fetch: GET /api/sync/requests (src/components/modules/connect-view.tsx:158)"}, "properties": {"repobilityId": "4a783ffb425b2e9f", "scanner": "scanner-primary", "fingerprint": "f68c88009e6d617b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-702aa4c5a19f40ea", "level": "error", "message": {"text": "Dangling fetch: POST /api/sync/requests (src/components/modules/connect-view.tsx:180)"}, "properties": {"repobilityId": "75fbc8ba94693ba9", "scanner": "scanner-primary", "fingerprint": "702aa4c5a19f40ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-749e7465a51f3dd4", "level": "error", "message": {"text": "Dangling fetch: GET /api/connect/qbo-recon?month=${month} (src/components/modules/connect-view.tsx:270)"}, "properties": {"repobilityId": "2bf3ffc9adebcb57", "scanner": "scanner-primary", "fingerprint": "749e7465a51f3dd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18bf11cf39637d19", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/pnl?entity=HOI&month=${month} (src/components/modules/connect-view.tsx:271)"}, "properties": {"repobilityId": "565b06f429cf6eb7", "scanner": "scanner-primary", "fingerprint": "18bf11cf39637d19", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-862a907d2fb96c40", "level": "error", "message": {"text": "Dangling fetch: GET /api/accounting/tree?entity=${scope} (src/components/modules/account-tree.tsx:37)"}, "properties": {"repobilityId": "7ba59a476327f6e8", "scanner": "scanner-primary", "fingerprint": "862a907d2fb96c40", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf679e8c5617b2a0", "level": "error", "message": {"text": "Dangling fetch: GET /api/people (src/components/modules/people-view.tsx:15)"}, "properties": {"repobilityId": "adb44c85206c6a59", "scanner": "scanner-primary", "fingerprint": "bf679e8c5617b2a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b0b1eda4378f932", "level": "error", "message": {"text": "Dangling fetch: GET /api/fx?history=12 (src/components/modules/workspace-view.tsx:27)"}, "properties": {"repobilityId": "1fb8dd83ee8876c2", "scanner": "scanner-primary", "fingerprint": "6b0b1eda4378f932", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8fa3bb8c541b68e8", "level": "error", "message": {"text": "Dangling fetch: GET /api/accounting/mapping?entity=${scope} (src/components/modules/account-mapping.tsx:87)"}, "properties": {"repobilityId": "30f9236bb81dc207", "scanner": "scanner-primary", "fingerprint": "8fa3bb8c541b68e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97a1027657894a34", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/members (src/components/modules/members-roster.tsx:61)"}, "properties": {"repobilityId": "a9deaad61b59c4bf", "scanner": "scanner-primary", "fingerprint": "97a1027657894a34", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-82157854add2df23", "level": "error", "message": {"text": "Dangling fetch: POST /api/books/classify (src/components/modules/upload-ingest.tsx:131)"}, "properties": {"repobilityId": "16d6b2b53b8d3620", "scanner": "scanner-primary", "fingerprint": "82157854add2df23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bc4a4f9e6829203", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:35)"}, "properties": {"repobilityId": "73ba310d9099ed1a", "scanner": "scanner-primary", "fingerprint": "1bc4a4f9e6829203", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-49654341b37e041b", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/credentials (src/components/modules/settings/credentials-panel.tsx:55)"}, "properties": {"repobilityId": "605a5d96f6c99cdc", "scanner": "scanner-primary", "fingerprint": "49654341b37e041b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf6191124fdc39d0", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/members (src/components/modules/settings/credentials-panel.tsx:192)"}, "properties": {"repobilityId": "c8bc3da25ea99694", "scanner": "scanner-primary", "fingerprint": "cf6191124fdc39d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cace035508690112", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/members (src/components/modules/settings/credentials-panel.tsx:233)"}, "properties": {"repobilityId": "ef5cdb991e299c61", "scanner": "scanner-primary", "fingerprint": "cace035508690112", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-463872ae00082036", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/opex?entity=${scope}&month=${m} (src/components/modules/books/opex-trend.tsx:49)"}, "properties": {"repobilityId": "f869d5ac97bab5e5", "scanner": "scanner-primary", "fingerprint": "463872ae00082036", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1cd27be5de0fba9", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/wholesale-share?entity=HOW&month=${mb} (src/components/modules/books/concentration-view.tsx:73)"}, "properties": {"repobilityId": "da8be64600df706f", "scanner": "scanner-primary", "fingerprint": "c1cd27be5de0fba9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81f40b8f9935093d", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/customers?entity=${scope}&start=${start}&end=${end} (src/components/modules/books/concentration-view.tsx:82)"}, "properties": {"repobilityId": "3949e19da32b8e6e", "scanner": "scanner-primary", "fingerprint": "81f40b8f9935093d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16621afcf5839aac", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/products-share?entity=${scope}&month=${mb} (src/components/modules/books/concentration-view.tsx:86)"}, "properties": {"repobilityId": "1a67874af979527b", "scanner": "scanner-primary", "fingerprint": "16621afcf5839aac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9303d8851a60c91a", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/counterparty-balance?entity=${scope}&start=${start}&end=${end} (src/components/modules/books/concentration-view.tsx:90)"}, "properties": {"repobilityId": "ce4bed3d1b6dace1", "scanner": "scanner-primary", "fingerprint": "9303d8851a60c91a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1eb9c35341a74a72", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/expenseone-unmatched (src/components/modules/books/expenseone-unmatched-card.tsx:38)"}, "properties": {"repobilityId": "0bf8c9a4c3694356", "scanner": "scanner-primary", "fingerprint": "1eb9c35341a74a72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b2cd8ecf00232b7", "level": "error", "message": {"text": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:38)"}, "properties": {"repobilityId": "7e9841263231fd39", "scanner": "scanner-primary", "fingerprint": "7b2cd8ecf00232b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7861104237f7668b", "level": "error", "message": {"text": "Dangling fetch: GET /api/insights/projection?month=${month} (src/components/modules/books/projection-view.tsx:54)"}, "properties": {"repobilityId": "7caeeaf247ebac12", "scanner": "scanner-primary", "fingerprint": "7861104237f7668b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b64f0071c5eaf96f", "level": "error", "message": {"text": "Dangling fetch: POST /api/insights/projection (src/components/modules/books/projection-view.tsx:325)"}, "properties": {"repobilityId": "8d605de27b34a888", "scanner": "scanner-primary", "fingerprint": "b64f0071c5eaf96f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ae6bef25d1cbce6", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/insights/projection?entity=${row.code}&month=${month} (src/components/modules/books/projection-view.tsx:346)"}, "properties": {"repobilityId": "03b0423e740f3794", "scanner": "scanner-primary", "fingerprint": "6ae6bef25d1cbce6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-22ada97d3faf52b9", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${encodeURIComponent(entityCode)} (src/components/modules/books/transaction-editor.tsx:52)"}, "properties": {"repobilityId": "7fc6e1df8556a9cc", "scanner": "scanner-primary", "fingerprint": "22ada97d3faf52b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59d63ba856dbe34d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/books/transactions/${encodeURIComponent(txnId)} (src/components/modules/books/transaction-editor.tsx:107)"}, "properties": {"repobilityId": "525a1519dec665e5", "scanner": "scanner-primary", "fingerprint": "59d63ba856dbe34d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0982ec4f6b45cf7", "level": "error", "message": {"text": "Dangling fetch: POST /api/books/counterparty-settlement (src/components/modules/books/settlement-view.tsx:106)"}, "properties": {"repobilityId": "890493bd835becd3", "scanner": "scanner-primary", "fingerprint": "d0982ec4f6b45cf7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad9f83d4c8f88a3c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/books/journal/${encodeURIComponent(String(jeId))} (src/components/modules/books/journal-entry-form.tsx:52)"}, "properties": {"repobilityId": "fb692d39fd830c7c", "scanner": "scanner-primary", "fingerprint": "ad9f83d4c8f88a3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0697fecff094e191", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/standard-accounts (src/components/modules/books/journal-entry-form.tsx:126)"}, "properties": {"repobilityId": "cfcce7d6eb0c56c5", "scanner": "scanner-primary", "fingerprint": "0697fecff094e191", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-907a50fd66eb3f7d", "level": "error", "message": {"text": "Dangling fetch: POST /api/books/journal (src/components/modules/books/journal-entry-form.tsx:192)"}, "properties": {"repobilityId": "a70e95907f470e0b", "scanner": "scanner-primary", "fingerprint": "907a50fd66eb3f7d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39e6f41e1f7f887f", "level": "error", "message": {"text": "Dangling fetch: GET /api/cashflow/forecast?entity=${entity}&from=${from}&to=${to} (src/components/modules/books/forecast-view.tsx:112)"}, "properties": {"repobilityId": "ceed5cb56926d74f", "scanner": "scanner-primary", "fingerprint": "39e6f41e1f7f887f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e4f44d978f954e3", "level": "error", "message": {"text": "Dangling fetch: GET /api/cash/balances (src/components/modules/books/forecast-view.tsx:131)"}, "properties": {"repobilityId": "7c40eda62cc644d6", "scanner": "scanner-primary", "fingerprint": "7e4f44d978f954e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ae1a79656453f209", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/internal-accounts?entity=${draftEntity} (src/components/modules/books/forecast-view.tsx:153)"}, "properties": {"repobilityId": "75f9f892564843a5", "scanner": "scanner-primary", "fingerprint": "ae1a79656453f209", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72cba8534cdfbdb6", "level": "error", "message": {"text": "Dangling fetch: GET /api/cashflow/actuals?entity=${entity}&period=${ym} (src/components/modules/books/forecast-view.tsx:182)"}, "properties": {"repobilityId": "4b7eaad94bacc82e", "scanner": "scanner-primary", "fingerprint": "72cba8534cdfbdb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d13c7bb43ddf27b", "level": "error", "message": {"text": "Dangling fetch: POST /api/cashflow/forecast (src/components/modules/books/forecast-view.tsx:284)"}, "properties": {"repobilityId": "1c6fb2cb6d1fea1a", "scanner": "scanner-primary", "fingerprint": "6d13c7bb43ddf27b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97617af1183d106b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/cashflow/forecast/${id} (src/components/modules/books/forecast-view.tsx:318)"}, "properties": {"repobilityId": "71d1f5ac59c19923", "scanner": "scanner-primary", "fingerprint": "97617af1183d106b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa80eb15dede912a", "level": "error", "message": {"text": "Dangling fetch: POST /api/cashflow/forecast/copy (src/components/modules/books/forecast-view.tsx:327)"}, "properties": {"repobilityId": "3f7b4324e38c1cb4", "scanner": "scanner-primary", "fingerprint": "aa80eb15dede912a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95809713ccc2b98f", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/statements/balance?entity=${scope}&year=${year} (src/components/modules/books/statements/balance-sheet-statement.tsx:35)"}, "properties": {"repobilityId": "1b030472db57face", "scanner": "scanner-primary", "fingerprint": "95809713ccc2b98f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbc19e81ea75fe6a", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/statements/trial-balance?entity=${scope}&year=${year} (src/components/modules/books/statements/trial-balance.tsx:32)"}, "properties": {"repobilityId": "e8cfd2483b9eadde", "scanner": "scanner-primary", "fingerprint": "dbc19e81ea75fe6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42f72f6fba8cfe84", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/statements/income?entity=${scope}&year=${year} (src/components/modules/books/statements/income-statement.tsx:33)"}, "properties": {"repobilityId": "ed16af8f51b4dffa", "scanner": "scanner-primary", "fingerprint": "42f72f6fba8cfe84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7fcc01a6a3cdee6a", "level": "error", "message": {"text": "Dangling fetch: GET /api/books/ledger?entity=${scope}&month=${month}${q} (src/components/modules/books/statements/general-ledger.tsx:30)"}, "properties": {"repobilityId": "5b2e1787aadcee14", "scanner": "scanner-primary", "fingerprint": "7fcc01a6a3cdee6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f7cea1c9d9d5526", "level": "error", "message": {"text": "Dangling fetch: GET /api/commerce/wholesale-accounts?entity=HOW&month=${month} (src/components/modules/commerce/wholesale-accounts-panel.tsx:52)"}, "properties": {"repobilityId": "77fae1b6ba749d26", "scanner": "scanner-primary", "fingerprint": "3f7cea1c9d9d5526", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0c119b5e05afffc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/llm/client.ts:75)"}, "properties": {"repobilityId": "9f3e55ce842bcde8", "scanner": "scanner-primary", "fingerprint": "f0c119b5e05afffc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21c7ff7b8ef22c44", "level": "note", "message": {"text": "Unused endpoint: GET /accounts"}, "properties": {"repobilityId": "c726b800c7dc84a4", "scanner": "scanner-primary", "fingerprint": "21c7ff7b8ef22c44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4050c2950d1db9a2", "level": "note", "message": {"text": "Unused endpoint: POST /v1/oAuth/"}, "properties": {"repobilityId": "fb3b5a83dff09d6a", "scanner": "scanner-primary", "fingerprint": "4050c2950d1db9a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b87371125b3269a", "level": "note", "message": {"text": "Unused endpoint: POST /v1/oAuth/utk/"}, "properties": {"repobilityId": "9a429880e50ea710", "scanner": "scanner-primary", "fingerprint": "4b87371125b3269a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}