{"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-3a3b5596f28c4b9e", "name": "TODO/FIXME marker in shipping code \u2014 src/server.ts:714", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/server.ts:714"}, "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-9ba0e2f3942d8760", "name": "Stray `console.log` in TS/JS \u2014 src/server.ts:179", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server.ts:179"}, "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-6292d678d73d686f", "name": "Stray `console.log` in TS/JS \u2014 src/morning-builder.ts:521", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/morning-builder.ts:521"}, "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-c92a61fc09e70afc", "name": "Stray `console.log` in TS/JS \u2014 src/auth.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/auth.ts:38"}, "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-7f18b5f129e8acdc", "name": "Stray `console.log` in TS/JS \u2014 src/generate-ics-headless.ts:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/generate-ics-headless.ts:106"}, "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-71d924a9f80f7cf9", "name": "Icon-only button without accessible name \u2014 src/morning.ts:2059", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/morning.ts:2059"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6fab8045c82ccd23", "name": "Stray `console.log` in TS/JS \u2014 src/morning.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/morning.ts:96"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f26013f8954d7479", "name": "Stray `console.log` in TS/JS \u2014 src/upload-ics.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/upload-ics.ts:20"}, "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-bf54811154ca0caf", "name": "Stray `console.log` in TS/JS \u2014 src/pilot-log/schema.ts:293", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pilot-log/schema.ts:293"}, "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-7cf2916770135e84", "name": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/import-roster.ts:4", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/import-roster.ts:4"}, "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-cc9a34d1b118bb71", "name": "Icon-only button without accessible name \u2014 src/pilot-log/routes.ts:319", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/pilot-log/routes.ts:319"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de2810b53850441e", "name": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/routes.ts:2261", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/routes.ts:2261"}, "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-3e481a02b4f290c9", "name": "TODO/FIXME marker in shipping code \u2014 src/spa/js-weather.ts:365", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/spa/js-weather.ts:365"}, "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-088420c35dfb614f", "name": "Icon-only button without accessible name \u2014 src/spa/roster-grid.js:432", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/spa/roster-grid.js:432"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-689eb7f28eec239f", "name": "Stray `console.log` in TS/JS \u2014 src/spa/pa-scripts.js:730", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/spa/pa-scripts.js:730"}, "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-59ec62b67ee4bec2", "name": "Icon-only button without accessible name \u2014 src/spa/briefing-card.js:921", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/spa/briefing-card.js:921"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a124e3802904ffa6", "name": "Icon-only button without accessible name \u2014 src/spa/pilot-log.js:2756", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/spa/pilot-log.js:2756"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bdc24fb7b29a1f5", "name": "Icon-only button without accessible name \u2014 src/spa/html-body.ts:343", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/spa/html-body.ts:343"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60885341915f7f01", "name": "Stray `console.log` in TS/JS \u2014 src/portfolio/schema.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/schema.ts:89"}, "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-30ab7d7544700880", "name": "Stray `console.log` in TS/JS \u2014 src/portfolio/backfill.ts:178", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/backfill.ts:178"}, "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-41cd7d2d25bb3b50", "name": "Stray `console.log` in TS/JS \u2014 src/portfolio/snapshot.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/snapshot.ts:122"}, "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-d16ac386bf820385", "name": "Stray `console.log` in TS/JS \u2014 src/portfolio/migration.ts:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/migration.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-9ffc756f24aee16b", "name": "Stray `console.log` in TS/JS \u2014 test/smoke-browser.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-browser.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-95f51ce54e44cd5d", "name": "Stray `console.log` in TS/JS \u2014 test/parsetab.test.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/parsetab.test.ts:18"}, "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-fffb2ff44b8b869e", "name": "Stray `console.log` in TS/JS \u2014 test/import-addressbook.test.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/import-addressbook.test.ts:22"}, "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-f14c3cabdd31283f", "name": "Stray `console.log` in TS/JS \u2014 test/smoke-pl.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-pl.ts:48"}, "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-b10815e3bc7bd719", "name": "Stray `console.log` in TS/JS \u2014 test/smoke-m.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-m.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-d408de653e9f3a57", "name": "Stray `console.log` in TS/JS \u2014 test/smoke.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke.ts:60"}, "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-f5710b9aa9ea8622", "name": "Insecure pattern 'direct_innerhtml_assignment' in tmp_check.cjs:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_check.cjs:59"}, "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-aded695c10eece88", "name": "Insecure pattern 'direct_innerhtml_assignment' in tmp_page.html:2136", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_page.html:2136"}, "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-d4b3a19049244247", "name": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh2.html:2120", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh2.html:2120"}, "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-b9ce7d97e8167d19", "name": "Insecure pattern 'direct_innerhtml_assignment' in tmp_test.html:2133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_test.html:2133"}, "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-50b56e7a4fd0f32a", "name": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh.html:2120", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh.html:2120"}, "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-52f9c129b4ee6e32", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/morning.ts:3189", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/morning.ts:3189"}, "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-a3c4d34a796edcae", "name": "Insecure pattern 'insert_adjacent_html' in src/morning.ts:4162", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in src/morning.ts:4162"}, "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-00cb6de8dbe4121f", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/pilot-log/routes.ts:2651", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pilot-log/routes.ts:2651"}, "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-778878ba15d21673", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/gate-info.js:249", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/gate-info.js:249"}, "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-9048f1b87f4f534c", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-weather.ts:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-weather.ts:31"}, "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-5f2fbcbbf9a5d60f", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-calendar.js:208", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-calendar.js:208"}, "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-1623d0249eeb02ee", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-core.ts:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-core.ts:59"}, "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-e81badc534d3faac", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/roster-grid.js:16", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/roster-grid.js:16"}, "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-a8f486985df6e97e", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/crew-rest.js:97", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/crew-rest.js:97"}, "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-231a8a471d103008", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/friends.js:37", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/friends.js:37"}, "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-3b04b2ad2be048c6", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/groups.js:67", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/groups.js:67"}, "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-64865619c62c10f1", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/overtime.js:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/overtime.js:44"}, "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-f42e1ee0416680d5", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/runway-map.js:162", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/runway-map.js:162"}, "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-0316e229d8c5481c", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pa-scripts.js:123", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pa-scripts.js:123"}, "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-e8201045755ab232", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/live-radar.js:228", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/live-radar.js:228"}, "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-f9f1cd2417fbd8f6", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/briefing-card.js:489", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/briefing-card.js:489"}, "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-0bf877c9e3955e9d", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-duty-time-logic.js:89", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-duty-time-logic.js:89"}, "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-088f77a3a5e7be4d", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/atfm.js:108", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/atfm.js:108"}, "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-355d8c80ce911470", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/fr24-radar.js:220", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/fr24-radar.js:220"}, "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-68ccfffa361218c8", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pilot-log.js:396", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pilot-log.js:396"}, "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-1892e888793a645b", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/portfolio/frontend.ts:815", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/portfolio/frontend.ts:815"}, "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-8a943d979d67f176", "name": "Very large file: tmp_check.cjs (7381 lines)", "shortDescription": {"text": "Very large file: tmp_check.cjs (7381 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-de2df0689b2f6415", "name": "Very large file: src/server.ts (3731 lines)", "shortDescription": {"text": "Very large file: src/server.ts (3731 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-eec02c848d72bed2", "name": "Very large file: src/morning.ts (5567 lines)", "shortDescription": {"text": "Very large file: src/morning.ts (5567 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-aaac9e019c699585", "name": "Very large file: src/pilot-log/import-roster.ts (922 lines)", "shortDescription": {"text": "Very large file: src/pilot-log/import-roster.ts (922 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-50e29ff2615b37c2", "name": "Very large file: src/pilot-log/routes.ts (3566 lines)", "shortDescription": {"text": "Very large file: src/pilot-log/routes.ts (3566 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-c5293d2f9b2832d5", "name": "Very large file: src/spa/styles.ts (978 lines)", "shortDescription": {"text": "Very large file: src/spa/styles.ts (978 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-057930f57bd21a79", "name": "Very large file: src/spa/pa-scripts.js (1229 lines)", "shortDescription": {"text": "Very large file: src/spa/pa-scripts.js (1229 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-da50d0e0e9727467", "name": "Very large file: src/spa/briefing-card.js (1233 lines)", "shortDescription": {"text": "Very large file: src/spa/briefing-card.js (1233 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb8077e9d34c3df4", "name": "Very large file: src/spa/pilot-log.js (7816 lines)", "shortDescription": {"text": "Very large file: src/spa/pilot-log.js (7816 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-ab3126d454c3db33", "name": "Very large file: src/spa/airport-db.js (4182 lines)", "shortDescription": {"text": "Very large file: src/spa/airport-db.js (4182 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-513f3ca5d3e87f6a", "name": "Very large file: src/spa/html-body.ts (2175 lines)", "shortDescription": {"text": "Very large file: src/spa/html-body.ts (2175 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-b32722a9be5d44fa", "name": "Very large file: src/portfolio/frontend.ts (1964 lines)", "shortDescription": {"text": "Very large file: src/portfolio/frontend.ts (1964 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "8 test file(s) for 82 source file(s) (ratio 0.10). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 120 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 235 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, operator-readme. 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, operator-readme. 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-ae1a46f1eb5512e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 tmp_check.cjs:802", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tmp_check.cjs:802"}, "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-9aa73f080e4e56ae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/nop-mint.mjs:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/nop-mint.mjs:32"}, "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-fc220c6b3a28df03", "name": "Commented-code block (7 lines) in scripts/health-check.mjs:2", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/health-check.mjs:2"}, "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-ed34a8c308267311", "name": "Commented-code block (10 lines) in src/server.ts:709", "shortDescription": {"text": "Commented-code block (10 lines) in src/server.ts:709"}, "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-ccb5d26e9358c12a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.ts:1067", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.ts:1067"}, "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-69f4901aec3780ac", "name": "Commented-code block (7 lines) in src/morning-builder.ts:379", "shortDescription": {"text": "Commented-code block (7 lines) in src/morning-builder.ts:379"}, "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-d0cfba56113bb2e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning-builder.ts:201", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning-builder.ts:201"}, "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-a2c4ad37d5bab89a", "name": "Commented-code block (5 lines) in src/atfm-nop.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/atfm-nop.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-69e14d8e668dae26", "name": "Legacy-named symbol `__legacy` in src/morning.ts:61", "shortDescription": {"text": "Legacy-named symbol `__legacy` in src/morning.ts:61"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9c4116cca6dbe4fd", "name": "Commented-code block (5 lines) in src/morning.ts:4955", "shortDescription": {"text": "Commented-code block (5 lines) in src/morning.ts:4955"}, "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-83264200dce532e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning.ts:723", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning.ts:723"}, "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-3d85305088ef3476", "name": "Commented-code block (5 lines) in src/pilot-log/crew-slots.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/pilot-log/crew-slots.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-9ee2f2f0e32a0e08", "name": "Commented-code block (6 lines) in src/pilot-log/tsv-parser.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/pilot-log/tsv-parser.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-55564b2cde2e52f6", "name": "Commented-code block (5 lines) in src/pilot-log/schema.ts:234", "shortDescription": {"text": "Commented-code block (5 lines) in src/pilot-log/schema.ts:234"}, "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-4619b0fb389443dc", "name": "Commented-code block (11 lines) in src/pilot-log/import-addressbook.ts:9", "shortDescription": {"text": "Commented-code block (11 lines) in src/pilot-log/import-addressbook.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44b5a7aab8b5bf41", "name": "Commented-code block (6 lines) in src/pilot-log/import-roster.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/pilot-log/import-roster.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b9992c23d4c7d71", "name": "Commented-code block (10 lines) in src/pilot-log/import-logatp.ts:3", "shortDescription": {"text": "Commented-code block (10 lines) in src/pilot-log/import-logatp.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-3d14eaa6db362fea", "name": "Legacy-named symbol `link_copy` in src/pilot-log/routes.ts:3015", "shortDescription": {"text": "Legacy-named symbol `link_copy` in src/pilot-log/routes.ts:3015"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35f1060a83645dcf", "name": "Commented-code block (5 lines) in src/pilot-log/routes.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/pilot-log/routes.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f581eddaa2b2febb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pilot-log/routes.ts:2402", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pilot-log/routes.ts:2402"}, "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-bead8a4bc15f5f44", "name": "Commented-code block (6 lines) in src/pilot-log/import-logten.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/pilot-log/import-logten.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-170684dfaa7bef5c", "name": "Commented-code block (5 lines) in src/pilot-log/import-wader.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pilot-log/import-wader.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-d8e492de736eed1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/gate-info.js:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/gate-info.js:99"}, "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-f137c480e2d7f167", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-weather.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-weather.ts:8"}, "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-1fde3c57679356e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-calendar.js:145", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-calendar.js:145"}, "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-52747b33efe66e73", "name": "Legacy-named symbol `_copyLegacy` in src/spa/js-core.ts:859", "shortDescription": {"text": "Legacy-named symbol `_copyLegacy` in src/spa/js-core.ts:859"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3119572a37e714f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/roster-grid.js:628", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/roster-grid.js:628"}, "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-dff3f03aa2c7ac80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/friends.js:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/friends.js:188"}, "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-69da7eeef251eade", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/groups.js:225", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/groups.js:225"}, "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-69c63a6adf5ee9c6", "name": "Commented-code block (8 lines) in src/spa/runway-map.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/spa/runway-map.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13cd5c3a558cd499", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pa-scripts.js:467", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pa-scripts.js:467"}, "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-5f0ba2cb775c6832", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/live-radar.js:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/live-radar.js:160"}, "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-1977964533f04fca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/briefing-card.js:359", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/briefing-card.js:359"}, "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-434f385e5e2b2f95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/fr24-radar.js:156", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/fr24-radar.js:156"}, "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-7f2e1f6b4ab2b866", "name": "Legacy-named symbol `hasOld` in src/spa/pilot-log.js:1662", "shortDescription": {"text": "Legacy-named symbol `hasOld` in src/spa/pilot-log.js:1662"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcb4d27c3ac56840", "name": "Commented-code block (6 lines) in src/spa/pilot-log.js:169", "shortDescription": {"text": "Commented-code block (6 lines) in src/spa/pilot-log.js:169"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85b4ff3cc270609f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pilot-log.js:569", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pilot-log.js:569"}, "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-ec11afa85c15e2ff", "name": "Legacy-named symbol `portfolio_cache_v1` in src/portfolio/frontend.ts:688", "shortDescription": {"text": "Legacy-named symbol `portfolio_cache_v1` in src/portfolio/frontend.ts:688"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3af27fcb1b451735", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/portfolio/frontend.ts:897", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/portfolio/frontend.ts:897"}, "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-24ae7b9e00156920", "name": "Legacy-named symbol `hasOld` in src/portfolio/routes.ts:207", "shortDescription": {"text": "Legacy-named symbol `hasOld` in src/portfolio/routes.ts:207"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8b2006483a2c2f0e", "name": "Commented-code block (20 lines) in src/portfolio/routes.ts:3", "shortDescription": {"text": "Commented-code block (20 lines) in src/portfolio/routes.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-e816474686a5dcfd", "name": "Commented-code block (8 lines) in src/portfolio/dividend.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/portfolio/dividend.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-252ecd7fe0939b8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-pl.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-pl.ts:70"}, "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-84d8a138cffe5ef1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-m.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-m.ts: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-a3679392dead20a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke.ts: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-897251dac0338a8a", "name": "Dangling fetch: GET https://radio.arinc.net/pacific/ (src/server.ts:1593)", "shortDescription": {"text": "Dangling fetch: GET https://radio.arinc.net/pacific/ (src/server.ts:1593)"}, "fullDescription": {"text": "`src/server.ts:1593` calls `GET https://radio.arinc.net/pacific/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/radio.arinc.net/pacific`\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-5501c9b579c1d232", "name": "Dangling fetch: GET https://www.changiairport.com/en/flights/departures.html (src/server.ts:1781)", "shortDescription": {"text": "Dangling fetch: GET https://www.changiairport.com/en/flights/departures.html (src/server.ts:1781)"}, "fullDescription": {"text": "`src/server.ts:1781` calls `GET https://www.changiairport.com/en/flights/departures.html` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.changiairport.com/en/flights/departures.html`\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-f625a55cdcc21557", "name": "Dangling fetch: POST https://ca-appsync.lz.changiairport.com/graphql (src/server.ts:1817)", "shortDescription": {"text": "Dangling fetch: POST https://ca-appsync.lz.changiairport.com/graphql (src/server.ts:1817)"}, "fullDescription": {"text": "`src/server.ts:1817` calls `POST https://ca-appsync.lz.changiairport.com/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ca-appsync.lz.changiairport.com/graphql`\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-2583f7822a7dc86e", "name": "Dangling fetch: GET https://www.flysfo.com/flysfo/api/flight-status (src/server.ts:1863)", "shortDescription": {"text": "Dangling fetch: GET https://www.flysfo.com/flysfo/api/flight-status (src/server.ts:1863)"}, "fullDescription": {"text": "`src/server.ts:1863` calls `GET https://www.flysfo.com/flysfo/api/flight-status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.flysfo.com/flysfo/api/flight-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-f9037e062f6aa8f7", "name": "Dangling fetch: GET https://www.atfmc.gov.hk/public/map?refresh=1 (src/server.ts:2019)", "shortDescription": {"text": "Dangling fetch: GET https://www.atfmc.gov.hk/public/map?refresh=1 (src/server.ts:2019)"}, "fullDescription": {"text": "`src/server.ts:2019` calls `GET https://www.atfmc.gov.hk/public/map?refresh=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.atfmc.gov.hk/public/map`\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-6a79a32da4daa66e", "name": "Dangling fetch: POST https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token (src/ser", "shortDescription": {"text": "Dangling fetch: POST https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token (src/server.ts:2335)"}, "fullDescription": {"text": "`src/server.ts:2335` calls `POST https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/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:/auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/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-00dbe9c4335721a1", "name": "Dangling fetch: GET https://rate.bot.com.tw/xrt?Lang=zh-TW (src/morning-builder.ts:488)", "shortDescription": {"text": "Dangling fetch: GET https://rate.bot.com.tw/xrt?Lang=zh-TW (src/morning-builder.ts:488)"}, "fullDescription": {"text": "`src/morning-builder.ts:488` calls `GET https://rate.bot.com.tw/xrt?Lang=zh-TW` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/rate.bot.com.tw/xrt`\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-c6cf506c21ebfb96", "name": "Dangling fetch: GET https://openapi.twse.com.tw/v1/exchangeReport/TWT48U_ALL (src/portfolio/dividend.ts:67)", "shortDescription": {"text": "Dangling fetch: GET https://openapi.twse.com.tw/v1/exchangeReport/TWT48U_ALL (src/portfolio/dividend.ts:67)"}, "fullDescription": {"text": "`src/portfolio/dividend.ts:67` calls `GET https://openapi.twse.com.tw/v1/exchangeReport/TWT48U_ALL` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openapi.twse.com.tw/v1/exchangereport/twt48u_all`\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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`src/server.ts` declares `GET /` 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-342ecde52501305a", "name": "Unused endpoint: GET /main", "shortDescription": {"text": "Unused endpoint: GET /main"}, "fullDescription": {"text": "`src/server.ts` declares `GET /main` 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-311cd49f33c5ec33", "name": "Unused endpoint: GET /share", "shortDescription": {"text": "Unused endpoint: GET /share"}, "fullDescription": {"text": "`src/server.ts` declares `GET /share` 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-9f0c1251a3e19f3c", "name": "Unused endpoint: GET /apps", "shortDescription": {"text": "Unused endpoint: GET /apps"}, "fullDescription": {"text": "`src/server.ts` declares `GET /apps` 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-e912e2e4dd5f97b0", "name": "Unused endpoint: GET /apps/icon.svg", "shortDescription": {"text": "Unused endpoint: GET /apps/icon.svg"}, "fullDescription": {"text": "`src/server.ts` declares `GET /apps/icon.svg` 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-9ffb82807ad76dc5", "name": "Unused endpoint: GET /apps/manifest.json", "shortDescription": {"text": "Unused endpoint: GET /apps/manifest.json"}, "fullDescription": {"text": "`src/server.ts` declares `GET /apps/manifest.json` 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-8a20b9d3b25fdd20", "name": "Unused endpoint: GET /faq", "shortDescription": {"text": "Unused endpoint: GET /faq"}, "fullDescription": {"text": "`src/server.ts` declares `GET /faq` 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-9daee89b78e9ceac", "name": "Unused endpoint: GET /privacy", "shortDescription": {"text": "Unused endpoint: GET /privacy"}, "fullDescription": {"text": "`src/server.ts` declares `GET /privacy` 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-ebe3481a27b770a5", "name": "Unused endpoint: GET /terms", "shortDescription": {"text": "Unused endpoint: GET /terms"}, "fullDescription": {"text": "`src/server.ts` declares `GET /terms` 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-4c1219a716537775", "name": "Unused endpoint: GET /icon.svg", "shortDescription": {"text": "Unused endpoint: GET /icon.svg"}, "fullDescription": {"text": "`src/server.ts` declares `GET /icon.svg` 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-5881fad21d09723d", "name": "Unused endpoint: GET /manifest.json", "shortDescription": {"text": "Unused endpoint: GET /manifest.json"}, "fullDescription": {"text": "`src/server.ts` declares `GET /manifest.json` 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-dfc6d31b3f4f1759", "name": "Unused endpoint: GET /api/oauth2callback", "shortDescription": {"text": "Unused endpoint: GET /api/oauth2callback"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/oauth2callback` 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-86f2c0d75d0f63d5", "name": "Unused endpoint: GET /oauth/callback", "shortDescription": {"text": "Unused endpoint: GET /oauth/callback"}, "fullDescription": {"text": "`src/server.ts` declares `GET /oauth/callback` 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-b2f097e3bd2e16ea", "name": "Unused endpoint: GET /briefing-room", "shortDescription": {"text": "Unused endpoint: GET /briefing-room"}, "fullDescription": {"text": "`src/server.ts` declares `GET /briefing-room` 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-15d0c835fe9f3243", "name": "Unused endpoint: GET /api/metar", "shortDescription": {"text": "Unused endpoint: GET /api/metar"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/metar` 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-3f36f403cee70baa", "name": "Unused endpoint: GET /api/taf", "shortDescription": {"text": "Unused endpoint: GET /api/taf"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/taf` 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-8d64d9671ffc673f", "name": "Unused endpoint: GET /api/atis", "shortDescription": {"text": "Unused endpoint: GET /api/atis"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/atis` 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-133ec11585d35ba7", "name": "Unused endpoint: GET /api/atis-usage", "shortDescription": {"text": "Unused endpoint: GET /api/atis-usage"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/atis-usage` 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-f22cf013c13a7f0c", "name": "Unused endpoint: GET /sw.js", "shortDescription": {"text": "Unused endpoint: GET /sw.js"}, "fullDescription": {"text": "`src/server.ts` declares `GET /sw.js` 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-385144830ea5a258", "name": "Unused endpoint: GET /api/pacific-hf", "shortDescription": {"text": "Unused endpoint: GET /api/pacific-hf"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/pacific-hf` 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-d4114acc3e551b6f", "name": "Unused endpoint: POST /api/nop-refresh", "shortDescription": {"text": "Unused endpoint: POST /api/nop-refresh"}, "fullDescription": {"text": "`src/server.ts` declares `POST /api/nop-refresh` 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-ffd0c4993aae395e", "name": "Unused endpoint: GET /api/fr24", "shortDescription": {"text": "Unused endpoint: GET /api/fr24"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/fr24` 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-be24fdfd76446e22", "name": "Unused endpoint: GET /api/fr24/detail", "shortDescription": {"text": "Unused endpoint: GET /api/fr24/detail"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/fr24/detail` 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-fb54ef899d980215", "name": "Unused endpoint: GET /api/fr24-schedule", "shortDescription": {"text": "Unused endpoint: GET /api/fr24-schedule"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/fr24-schedule` 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-0c9d45956f3ce7b9", "name": "Unused endpoint: GET /debug/screenshot", "shortDescription": {"text": "Unused endpoint: GET /debug/screenshot"}, "fullDescription": {"text": "`src/server.ts` declares `GET /debug/screenshot` 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-7b1d4dfede4ed35b", "name": "Unused endpoint: GET /debug/sync", "shortDescription": {"text": "Unused endpoint: GET /debug/sync"}, "fullDescription": {"text": "`src/server.ts` declares `GET /debug/sync` 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-3a3c45156489b020", "name": "Unused endpoint: GET /api/users", "shortDescription": {"text": "Unused endpoint: GET /api/users"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/users` 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-bc542d91e6667d26", "name": "Unused endpoint: GET /api/roster-data", "shortDescription": {"text": "Unused endpoint: GET /api/roster-data"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/roster-data` 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-12935228ff804a6f", "name": "Unused endpoint: GET /api/roster-friends", "shortDescription": {"text": "Unused endpoint: GET /api/roster-friends"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/roster-friends` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66053fa1d9abfbf2", "name": "Unused endpoint: GET /api/groups", "shortDescription": {"text": "Unused endpoint: GET /api/groups"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/groups` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-453e5bd6bf56f916", "name": "Unused endpoint: DELETE /api/groups/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/groups/:id"}, "fullDescription": {"text": "`src/server.ts` declares `DELETE /api/groups/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcbfe97242c23df1", "name": "Unused endpoint: POST /api/groups/join", "shortDescription": {"text": "Unused endpoint: POST /api/groups/join"}, "fullDescription": {"text": "`src/server.ts` declares `POST /api/groups/join` 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-a87ae9fe8119f9b9", "name": "Unused endpoint: GET /api/groups/invites", "shortDescription": {"text": "Unused endpoint: GET /api/groups/invites"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/groups/invites` 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-efa2809f28eeba8d", "name": "Unused endpoint: POST /api/groups/invites/:id/accept", "shortDescription": {"text": "Unused endpoint: POST /api/groups/invites/:id/accept"}, "fullDescription": {"text": "`src/server.ts` declares `POST /api/groups/invites/:id/accept` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4be8b7b5cb4e95c", "name": "Unused endpoint: POST /api/groups/invites/:id/decline", "shortDescription": {"text": "Unused endpoint: POST /api/groups/invites/:id/decline"}, "fullDescription": {"text": "`src/server.ts` declares `POST /api/groups/invites/:id/decline` 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-8deb0e577cd75314", "name": "Unused endpoint: GET /api/groups/:id/members", "shortDescription": {"text": "Unused endpoint: GET /api/groups/:id/members"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/groups/:id/members` 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-6484089590c25f47", "name": "Unused endpoint: GET /api/db-test", "shortDescription": {"text": "Unused endpoint: GET /api/db-test"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/db-test` 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-a521997af4884762", "name": "Unused endpoint: GET /api/calendar-events", "shortDescription": {"text": "Unused endpoint: GET /api/calendar-events"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/calendar-events` 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-188cd98261d63cda", "name": "Unused endpoint: GET /api/sync-debug/:syncId/:file", "shortDescription": {"text": "Unused endpoint: GET /api/sync-debug/:syncId/:file"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/sync-debug/:syncId/:file` 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-84df4fcf2cbe5117", "name": "Unused endpoint: GET /api/briefing", "shortDescription": {"text": "Unused endpoint: GET /api/briefing"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/briefing` 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-6c78d270a3dd406d", "name": "Unused endpoint: GET /api/briefing/list", "shortDescription": {"text": "Unused endpoint: GET /api/briefing/list"}, "fullDescription": {"text": "`src/server.ts` declares `GET /api/briefing/list` 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-1344e0aeb87a6b75", "name": "Unused endpoint: GET /morning", "shortDescription": {"text": "Unused endpoint: GET /morning"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /morning` 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-98aa32f074acdacf", "name": "Unused endpoint: GET /morning/manifest.json", "shortDescription": {"text": "Unused endpoint: GET /morning/manifest.json"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /morning/manifest.json` 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-f3123e1ae264035d", "name": "Unused endpoint: GET /morning/icon.svg", "shortDescription": {"text": "Unused endpoint: GET /morning/icon.svg"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /morning/icon.svg` 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-648a8136fa001aae", "name": "Unused endpoint: GET /morning/sw.js", "shortDescription": {"text": "Unused endpoint: GET /morning/sw.js"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /morning/sw.js` 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-ec117837547fd0f2", "name": "Unused endpoint: GET /api/morning-report/dates", "shortDescription": {"text": "Unused endpoint: GET /api/morning-report/dates"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /api/morning-report/dates` 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-af739581cd9d112e", "name": "Unused endpoint: POST /api/morning-prefs", "shortDescription": {"text": "Unused endpoint: POST /api/morning-prefs"}, "fullDescription": {"text": "`src/morning.ts` declares `POST /api/morning-prefs` 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-aa8dbbdaf5a4d390", "name": "Unused endpoint: GET /api/morning-prefs", "shortDescription": {"text": "Unused endpoint: GET /api/morning-prefs"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /api/morning-prefs` 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-b465e8ff19a52527", "name": "Unused endpoint: GET /api/morning-reader", "shortDescription": {"text": "Unused endpoint: GET /api/morning-reader"}, "fullDescription": {"text": "`src/morning.ts` declares `GET /api/morning-reader` 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-90eb13ed27aff390", "name": "Unused endpoint: POST /api/morning-report/refresh", "shortDescription": {"text": "Unused endpoint: POST /api/morning-report/refresh"}, "fullDescription": {"text": "`src/morning.ts` declares `POST /api/morning-report/refresh` 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/25476"}, "properties": {"repository": "dominiclu82/pilot-sync-mobile", "repoUrl": "https://github.com/dominiclu82/pilot-sync-mobile", "branch": "main"}, "results": [{"ruleId": "scanner-3a3b5596f28c4b9e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/server.ts:714"}, "properties": {"repobilityId": "87ce739acd95e62a", "scanner": "scanner-primary", "fingerprint": "3a3b5596f28c4b9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9ba0e2f3942d8760", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server.ts:179"}, "properties": {"repobilityId": "7753d6bdd8ad49dd", "scanner": "scanner-primary", "fingerprint": "9ba0e2f3942d8760", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6292d678d73d686f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/morning-builder.ts:521"}, "properties": {"repobilityId": "605ecdab2238e6e5", "scanner": "scanner-primary", "fingerprint": "6292d678d73d686f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c92a61fc09e70afc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/auth.ts:38"}, "properties": {"repobilityId": "6ab9c77a81ca0d35", "scanner": "scanner-primary", "fingerprint": "c92a61fc09e70afc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f18b5f129e8acdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/generate-ics-headless.ts:106"}, "properties": {"repobilityId": "d9510c18fd929117", "scanner": "scanner-primary", "fingerprint": "7f18b5f129e8acdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-71d924a9f80f7cf9", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/morning.ts:2059"}, "properties": {"repobilityId": "87de81c4d80f411a", "scanner": "scanner-primary", "fingerprint": "71d924a9f80f7cf9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6fab8045c82ccd23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/morning.ts:96"}, "properties": {"repobilityId": "35d3d7566f0ade68", "scanner": "scanner-primary", "fingerprint": "6fab8045c82ccd23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f26013f8954d7479", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/upload-ics.ts:20"}, "properties": {"repobilityId": "6fda2423ff64348c", "scanner": "scanner-primary", "fingerprint": "f26013f8954d7479", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf54811154ca0caf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pilot-log/schema.ts:293"}, "properties": {"repobilityId": "7fc68a8dc74d9e92", "scanner": "scanner-primary", "fingerprint": "bf54811154ca0caf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7cf2916770135e84", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/import-roster.ts:4"}, "properties": {"repobilityId": "c0b195a242d1ccb7", "scanner": "scanner-primary", "fingerprint": "7cf2916770135e84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cc9a34d1b118bb71", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/pilot-log/routes.ts:319"}, "properties": {"repobilityId": "fbcb45983a4bc2af", "scanner": "scanner-primary", "fingerprint": "cc9a34d1b118bb71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-de2810b53850441e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/pilot-log/routes.ts:2261"}, "properties": {"repobilityId": "134c98eaa0c90c74", "scanner": "scanner-primary", "fingerprint": "de2810b53850441e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3e481a02b4f290c9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/spa/js-weather.ts:365"}, "properties": {"repobilityId": "cd72e991431aef4f", "scanner": "scanner-primary", "fingerprint": "3e481a02b4f290c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-088420c35dfb614f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/spa/roster-grid.js:432"}, "properties": {"repobilityId": "7aeb4a847a199f76", "scanner": "scanner-primary", "fingerprint": "088420c35dfb614f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-689eb7f28eec239f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/spa/pa-scripts.js:730"}, "properties": {"repobilityId": "eb9e6cad3ddeeccd", "scanner": "scanner-primary", "fingerprint": "689eb7f28eec239f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-59ec62b67ee4bec2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/spa/briefing-card.js:921"}, "properties": {"repobilityId": "ef74d2c60a3a2834", "scanner": "scanner-primary", "fingerprint": "59ec62b67ee4bec2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a124e3802904ffa6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/spa/pilot-log.js:2756"}, "properties": {"repobilityId": "2890431ac9b705b6", "scanner": "scanner-primary", "fingerprint": "a124e3802904ffa6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3bdc24fb7b29a1f5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/spa/html-body.ts:343"}, "properties": {"repobilityId": "6ecc634039b6e7bd", "scanner": "scanner-primary", "fingerprint": "3bdc24fb7b29a1f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-60885341915f7f01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/schema.ts:89"}, "properties": {"repobilityId": "9762af5287e9716c", "scanner": "scanner-primary", "fingerprint": "60885341915f7f01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30ab7d7544700880", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/backfill.ts:178"}, "properties": {"repobilityId": "4b355b56695aa80b", "scanner": "scanner-primary", "fingerprint": "30ab7d7544700880", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41cd7d2d25bb3b50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/snapshot.ts:122"}, "properties": {"repobilityId": "e66158723e2489b3", "scanner": "scanner-primary", "fingerprint": "41cd7d2d25bb3b50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d16ac386bf820385", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/portfolio/migration.ts:112"}, "properties": {"repobilityId": "e3eb6d85cdf53cf0", "scanner": "scanner-primary", "fingerprint": "d16ac386bf820385", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ffc756f24aee16b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-browser.ts:58"}, "properties": {"repobilityId": "3fe9e43072312942", "scanner": "scanner-primary", "fingerprint": "9ffc756f24aee16b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95f51ce54e44cd5d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/parsetab.test.ts:18"}, "properties": {"repobilityId": "dafc8b0d3f2372ae", "scanner": "scanner-primary", "fingerprint": "95f51ce54e44cd5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fffb2ff44b8b869e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/import-addressbook.test.ts:22"}, "properties": {"repobilityId": "824fdf528b66a1d2", "scanner": "scanner-primary", "fingerprint": "fffb2ff44b8b869e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f14c3cabdd31283f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-pl.ts:48"}, "properties": {"repobilityId": "01eb963dbc5c208a", "scanner": "scanner-primary", "fingerprint": "f14c3cabdd31283f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b10815e3bc7bd719", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke-m.ts:51"}, "properties": {"repobilityId": "05af3bc2084f8197", "scanner": "scanner-primary", "fingerprint": "b10815e3bc7bd719", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d408de653e9f3a57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/smoke.ts:60"}, "properties": {"repobilityId": "a6bfd7e7a4932fbc", "scanner": "scanner-primary", "fingerprint": "d408de653e9f3a57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5710b9aa9ea8622", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_check.cjs:59"}, "properties": {"repobilityId": "9ddfd49bc047bd19", "scanner": "scanner-primary", "fingerprint": "f5710b9aa9ea8622", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tmp_check.cjs"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-aded695c10eece88", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_page.html:2136"}, "properties": {"repobilityId": "7a338c765ee981b5", "scanner": "scanner-primary", "fingerprint": "aded695c10eece88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tmp_page.html"}, "region": {"startLine": 2136}}}]}, {"ruleId": "scanner-d4b3a19049244247", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh2.html:2120"}, "properties": {"repobilityId": "31a3d8b6f17aa026", "scanner": "scanner-primary", "fingerprint": "d4b3a19049244247", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tmp_fresh2.html"}, "region": {"startLine": 2120}}}]}, {"ruleId": "scanner-b9ce7d97e8167d19", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_test.html:2133"}, "properties": {"repobilityId": "a9713f12c11fb4b3", "scanner": "scanner-primary", "fingerprint": "b9ce7d97e8167d19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tmp_test.html"}, "region": {"startLine": 2133}}}]}, {"ruleId": "scanner-50b56e7a4fd0f32a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tmp_fresh.html:2120"}, "properties": {"repobilityId": "2ee93a55a6468198", "scanner": "scanner-primary", "fingerprint": "50b56e7a4fd0f32a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tmp_fresh.html"}, "region": {"startLine": 2120}}}]}, {"ruleId": "scanner-52f9c129b4ee6e32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/morning.ts:3189"}, "properties": {"repobilityId": "1e5805f772ee6c5b", "scanner": "scanner-primary", "fingerprint": "52f9c129b4ee6e32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/morning.ts"}, "region": {"startLine": 3189}}}]}, {"ruleId": "scanner-a3c4d34a796edcae", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in src/morning.ts:4162"}, "properties": {"repobilityId": "58a8615cf26201e0", "scanner": "scanner-primary", "fingerprint": "a3c4d34a796edcae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/morning.ts"}, "region": {"startLine": 4162}}}]}, {"ruleId": "scanner-00cb6de8dbe4121f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pilot-log/routes.ts:2651"}, "properties": {"repobilityId": "6e94b0cb900a35fe", "scanner": "scanner-primary", "fingerprint": "00cb6de8dbe4121f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pilot-log/routes.ts"}, "region": {"startLine": 2651}}}]}, {"ruleId": "scanner-778878ba15d21673", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/gate-info.js:249"}, "properties": {"repobilityId": "328cd36cffb091a9", "scanner": "scanner-primary", "fingerprint": "778878ba15d21673", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/gate-info.js"}, "region": {"startLine": 249}}}]}, {"ruleId": "scanner-9048f1b87f4f534c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-weather.ts:31"}, "properties": {"repobilityId": "52f92228092c8363", "scanner": "scanner-primary", "fingerprint": "9048f1b87f4f534c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/js-weather.ts"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-5f2fbcbbf9a5d60f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-calendar.js:208"}, "properties": {"repobilityId": "0413c6c6bf168eca", "scanner": "scanner-primary", "fingerprint": "5f2fbcbbf9a5d60f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/js-calendar.js"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-1623d0249eeb02ee", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-core.ts:59"}, "properties": {"repobilityId": "cd4c6d21c1fe995f", "scanner": "scanner-primary", "fingerprint": "1623d0249eeb02ee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/js-core.ts"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-e81badc534d3faac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/roster-grid.js:16"}, "properties": {"repobilityId": "6bb227e57469ce92", "scanner": "scanner-primary", "fingerprint": "e81badc534d3faac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/roster-grid.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-a8f486985df6e97e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/crew-rest.js:97"}, "properties": {"repobilityId": "22fca8a178fdf2d7", "scanner": "scanner-primary", "fingerprint": "a8f486985df6e97e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/crew-rest.js"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-231a8a471d103008", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/friends.js:37"}, "properties": {"repobilityId": "d83909bf5c624b4b", "scanner": "scanner-primary", "fingerprint": "231a8a471d103008", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/friends.js"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-3b04b2ad2be048c6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/groups.js:67"}, "properties": {"repobilityId": "e4ff1d5a4d90d50c", "scanner": "scanner-primary", "fingerprint": "3b04b2ad2be048c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/groups.js"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-64865619c62c10f1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/overtime.js:44"}, "properties": {"repobilityId": "3c1da5560f99dff3", "scanner": "scanner-primary", "fingerprint": "64865619c62c10f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/overtime.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-f42e1ee0416680d5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/runway-map.js:162"}, "properties": {"repobilityId": "6f63db1ddc735441", "scanner": "scanner-primary", "fingerprint": "f42e1ee0416680d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/runway-map.js"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-0316e229d8c5481c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pa-scripts.js:123"}, "properties": {"repobilityId": "7345e8bd61393b00", "scanner": "scanner-primary", "fingerprint": "0316e229d8c5481c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/pa-scripts.js"}, "region": {"startLine": 123}}}]}, {"ruleId": "scanner-e8201045755ab232", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/live-radar.js:228"}, "properties": {"repobilityId": "d7450f8ba6706a34", "scanner": "scanner-primary", "fingerprint": "e8201045755ab232", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/live-radar.js"}, "region": {"startLine": 228}}}]}, {"ruleId": "scanner-f9f1cd2417fbd8f6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/briefing-card.js:489"}, "properties": {"repobilityId": "27560df2c821a00a", "scanner": "scanner-primary", "fingerprint": "f9f1cd2417fbd8f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/briefing-card.js"}, "region": {"startLine": 489}}}]}, {"ruleId": "scanner-0bf877c9e3955e9d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/js-duty-time-logic.js:89"}, "properties": {"repobilityId": "e086aec1b72c9182", "scanner": "scanner-primary", "fingerprint": "0bf877c9e3955e9d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/js-duty-time-logic.js"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-088f77a3a5e7be4d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/atfm.js:108"}, "properties": {"repobilityId": "7096475b41e4662e", "scanner": "scanner-primary", "fingerprint": "088f77a3a5e7be4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/atfm.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-355d8c80ce911470", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/fr24-radar.js:220"}, "properties": {"repobilityId": "00a3d0e1d5a11f79", "scanner": "scanner-primary", "fingerprint": "355d8c80ce911470", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/fr24-radar.js"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-68ccfffa361218c8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/spa/pilot-log.js:396"}, "properties": {"repobilityId": "a76ea6cb628b2a03", "scanner": "scanner-primary", "fingerprint": "68ccfffa361218c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/spa/pilot-log.js"}, "region": {"startLine": 396}}}]}, {"ruleId": "scanner-1892e888793a645b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/portfolio/frontend.ts:815"}, "properties": {"repobilityId": "f43f52c6ab8d715f", "scanner": "scanner-primary", "fingerprint": "1892e888793a645b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/portfolio/frontend.ts"}, "region": {"startLine": 815}}}]}, {"ruleId": "scanner-8a943d979d67f176", "level": "note", "message": {"text": "Very large file: tmp_check.cjs (7381 lines)"}, "properties": {"repobilityId": "7f5d2ef35d13245e", "scanner": "scanner-primary", "fingerprint": "8a943d979d67f176", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-de2df0689b2f6415", "level": "note", "message": {"text": "Very large file: src/server.ts (3731 lines)"}, "properties": {"repobilityId": "5a658d2965d5fcc6", "scanner": "scanner-primary", "fingerprint": "de2df0689b2f6415", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eec02c848d72bed2", "level": "note", "message": {"text": "Very large file: src/morning.ts (5567 lines)"}, "properties": {"repobilityId": "b8acc31efb9a754f", "scanner": "scanner-primary", "fingerprint": "eec02c848d72bed2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aaac9e019c699585", "level": "note", "message": {"text": "Very large file: src/pilot-log/import-roster.ts (922 lines)"}, "properties": {"repobilityId": "e96ea7ac79d3b8a4", "scanner": "scanner-primary", "fingerprint": "aaac9e019c699585", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-50e29ff2615b37c2", "level": "note", "message": {"text": "Very large file: src/pilot-log/routes.ts (3566 lines)"}, "properties": {"repobilityId": "20fc32341d3ff79f", "scanner": "scanner-primary", "fingerprint": "50e29ff2615b37c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c5293d2f9b2832d5", "level": "note", "message": {"text": "Very large file: src/spa/styles.ts (978 lines)"}, "properties": {"repobilityId": "d281bc5c500f3278", "scanner": "scanner-primary", "fingerprint": "c5293d2f9b2832d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-057930f57bd21a79", "level": "note", "message": {"text": "Very large file: src/spa/pa-scripts.js (1229 lines)"}, "properties": {"repobilityId": "b4f1e1370d57ad3a", "scanner": "scanner-primary", "fingerprint": "057930f57bd21a79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da50d0e0e9727467", "level": "note", "message": {"text": "Very large file: src/spa/briefing-card.js (1233 lines)"}, "properties": {"repobilityId": "8e77529152b99624", "scanner": "scanner-primary", "fingerprint": "da50d0e0e9727467", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb8077e9d34c3df4", "level": "note", "message": {"text": "Very large file: src/spa/pilot-log.js (7816 lines)"}, "properties": {"repobilityId": "bc29eb0b35c13d69", "scanner": "scanner-primary", "fingerprint": "eb8077e9d34c3df4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab3126d454c3db33", "level": "note", "message": {"text": "Very large file: src/spa/airport-db.js (4182 lines)"}, "properties": {"repobilityId": "6ce07bc8d4ee327b", "scanner": "scanner-primary", "fingerprint": "ab3126d454c3db33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-513f3ca5d3e87f6a", "level": "note", "message": {"text": "Very large file: src/spa/html-body.ts (2175 lines)"}, "properties": {"repobilityId": "401418f7e96d2b94", "scanner": "scanner-primary", "fingerprint": "513f3ca5d3e87f6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b32722a9be5d44fa", "level": "note", "message": {"text": "Very large file: src/portfolio/frontend.ts (1964 lines)"}, "properties": {"repobilityId": "569a19167646b1ee", "scanner": "scanner-primary", "fingerprint": "b32722a9be5d44fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "7319a1c60f54234c", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "57e59c4153d4d9d2", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "16001ed20a305eb6", "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": "d6fe8cdbb31b48cb", "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": "a4429bd02134d2d7", "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": "30252f99392c4742", "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": "66a049359c963ceb", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ae1a46f1eb5512e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tmp_check.cjs:802"}, "properties": {"repobilityId": "2bed4d248543fe72", "scanner": "scanner-primary", "fingerprint": "ae1a46f1eb5512e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9aa73f080e4e56ae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/nop-mint.mjs:32"}, "properties": {"repobilityId": "f11203c07a6b7893", "scanner": "scanner-primary", "fingerprint": "9aa73f080e4e56ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc220c6b3a28df03", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/health-check.mjs:2"}, "properties": {"repobilityId": "7867c32f3342774e", "scanner": "scanner-primary", "fingerprint": "fc220c6b3a28df03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed34a8c308267311", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/server.ts:709"}, "properties": {"repobilityId": "fc0d26a86fd3e7ca", "scanner": "scanner-primary", "fingerprint": "ed34a8c308267311", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccb5d26e9358c12a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.ts:1067"}, "properties": {"repobilityId": "556b6d084abefc13", "scanner": "scanner-primary", "fingerprint": "ccb5d26e9358c12a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69f4901aec3780ac", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/morning-builder.ts:379"}, "properties": {"repobilityId": "f9e9cb6d95fe594d", "scanner": "scanner-primary", "fingerprint": "69f4901aec3780ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0cfba56113bb2e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning-builder.ts:201"}, "properties": {"repobilityId": "73b1bdcfaf8efab1", "scanner": "scanner-primary", "fingerprint": "d0cfba56113bb2e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2c4ad37d5bab89a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/atfm-nop.ts:1"}, "properties": {"repobilityId": "384e62d6428d95e6", "scanner": "scanner-primary", "fingerprint": "a2c4ad37d5bab89a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69e14d8e668dae26", "level": "note", "message": {"text": "Legacy-named symbol `__legacy` in src/morning.ts:61"}, "properties": {"repobilityId": "b10f3e8a71e647d7", "scanner": "scanner-primary", "fingerprint": "69e14d8e668dae26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9c4116cca6dbe4fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/morning.ts:4955"}, "properties": {"repobilityId": "ceffe69a0dd04348", "scanner": "scanner-primary", "fingerprint": "9c4116cca6dbe4fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83264200dce532e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/morning.ts:723"}, "properties": {"repobilityId": "0db50543c71ee488", "scanner": "scanner-primary", "fingerprint": "83264200dce532e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d85305088ef3476", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pilot-log/crew-slots.ts:1"}, "properties": {"repobilityId": "78ec1beb614ec1a0", "scanner": "scanner-primary", "fingerprint": "3d85305088ef3476", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ee2f2f0e32a0e08", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pilot-log/tsv-parser.ts:3"}, "properties": {"repobilityId": "bcd34200d8b992b2", "scanner": "scanner-primary", "fingerprint": "9ee2f2f0e32a0e08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55564b2cde2e52f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pilot-log/schema.ts:234"}, "properties": {"repobilityId": "737e736c6905674b", "scanner": "scanner-primary", "fingerprint": "55564b2cde2e52f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4619b0fb389443dc", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/pilot-log/import-addressbook.ts:9"}, "properties": {"repobilityId": "b12935c8dc3a6637", "scanner": "scanner-primary", "fingerprint": "4619b0fb389443dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44b5a7aab8b5bf41", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pilot-log/import-roster.ts:4"}, "properties": {"repobilityId": "fa0915ead0c5f044", "scanner": "scanner-primary", "fingerprint": "44b5a7aab8b5bf41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b9992c23d4c7d71", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/pilot-log/import-logatp.ts:3"}, "properties": {"repobilityId": "5717e9910d7d946d", "scanner": "scanner-primary", "fingerprint": "3b9992c23d4c7d71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d14eaa6db362fea", "level": "note", "message": {"text": "Legacy-named symbol `link_copy` in src/pilot-log/routes.ts:3015"}, "properties": {"repobilityId": "de5c2f3de769388b", "scanner": "scanner-primary", "fingerprint": "3d14eaa6db362fea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-35f1060a83645dcf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pilot-log/routes.ts:4"}, "properties": {"repobilityId": "a080b5c865f099a5", "scanner": "scanner-primary", "fingerprint": "35f1060a83645dcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f581eddaa2b2febb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pilot-log/routes.ts:2402"}, "properties": {"repobilityId": "f5ef20faa8af7b39", "scanner": "scanner-primary", "fingerprint": "f581eddaa2b2febb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bead8a4bc15f5f44", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pilot-log/import-logten.ts:3"}, "properties": {"repobilityId": "b4737808ae1e7bd5", "scanner": "scanner-primary", "fingerprint": "bead8a4bc15f5f44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-170684dfaa7bef5c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pilot-log/import-wader.ts:3"}, "properties": {"repobilityId": "d444562d44900de5", "scanner": "scanner-primary", "fingerprint": "170684dfaa7bef5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8e492de736eed1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/gate-info.js:99"}, "properties": {"repobilityId": "8362d761b6eafb27", "scanner": "scanner-primary", "fingerprint": "d8e492de736eed1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f137c480e2d7f167", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-weather.ts:8"}, "properties": {"repobilityId": "bd57485407287d19", "scanner": "scanner-primary", "fingerprint": "f137c480e2d7f167", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1fde3c57679356e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/js-calendar.js:145"}, "properties": {"repobilityId": "9fceb29f9d310985", "scanner": "scanner-primary", "fingerprint": "1fde3c57679356e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52747b33efe66e73", "level": "note", "message": {"text": "Legacy-named symbol `_copyLegacy` in src/spa/js-core.ts:859"}, "properties": {"repobilityId": "61a1e7ef2995bb17", "scanner": "scanner-primary", "fingerprint": "52747b33efe66e73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3119572a37e714f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/roster-grid.js:628"}, "properties": {"repobilityId": "bf51a4113c5d5627", "scanner": "scanner-primary", "fingerprint": "3119572a37e714f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dff3f03aa2c7ac80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/friends.js:188"}, "properties": {"repobilityId": "193b84770f73a4ed", "scanner": "scanner-primary", "fingerprint": "dff3f03aa2c7ac80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69da7eeef251eade", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/groups.js:225"}, "properties": {"repobilityId": "a3f8abf06bbef4f7", "scanner": "scanner-primary", "fingerprint": "69da7eeef251eade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69c63a6adf5ee9c6", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/spa/runway-map.js:1"}, "properties": {"repobilityId": "8be59639bb4b2a62", "scanner": "scanner-primary", "fingerprint": "69c63a6adf5ee9c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13cd5c3a558cd499", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pa-scripts.js:467"}, "properties": {"repobilityId": "0a006d0f9ef7ca73", "scanner": "scanner-primary", "fingerprint": "13cd5c3a558cd499", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f0ba2cb775c6832", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/live-radar.js:160"}, "properties": {"repobilityId": "6872edfe9434f6da", "scanner": "scanner-primary", "fingerprint": "5f0ba2cb775c6832", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1977964533f04fca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/briefing-card.js:359"}, "properties": {"repobilityId": "629c45dee1de0bbb", "scanner": "scanner-primary", "fingerprint": "1977964533f04fca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-434f385e5e2b2f95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/fr24-radar.js:156"}, "properties": {"repobilityId": "7e3205f2553a4902", "scanner": "scanner-primary", "fingerprint": "434f385e5e2b2f95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f2e1f6b4ab2b866", "level": "note", "message": {"text": "Legacy-named symbol `hasOld` in src/spa/pilot-log.js:1662"}, "properties": {"repobilityId": "39a5c60d188d81bd", "scanner": "scanner-primary", "fingerprint": "7f2e1f6b4ab2b866", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bcb4d27c3ac56840", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/spa/pilot-log.js:169"}, "properties": {"repobilityId": "5a1c5660173e377e", "scanner": "scanner-primary", "fingerprint": "bcb4d27c3ac56840", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85b4ff3cc270609f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/spa/pilot-log.js:569"}, "properties": {"repobilityId": "8ea3c02b0ff51ba3", "scanner": "scanner-primary", "fingerprint": "85b4ff3cc270609f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec11afa85c15e2ff", "level": "note", "message": {"text": "Legacy-named symbol `portfolio_cache_v1` in src/portfolio/frontend.ts:688"}, "properties": {"repobilityId": "e3fef37163325db9", "scanner": "scanner-primary", "fingerprint": "ec11afa85c15e2ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3af27fcb1b451735", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/portfolio/frontend.ts:897"}, "properties": {"repobilityId": "ecf5495efb2534b8", "scanner": "scanner-primary", "fingerprint": "3af27fcb1b451735", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24ae7b9e00156920", "level": "note", "message": {"text": "Legacy-named symbol `hasOld` in src/portfolio/routes.ts:207"}, "properties": {"repobilityId": "6009b998e6626274", "scanner": "scanner-primary", "fingerprint": "24ae7b9e00156920", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8b2006483a2c2f0e", "level": "none", "message": {"text": "Commented-code block (20 lines) in src/portfolio/routes.ts:3"}, "properties": {"repobilityId": "70132ab1422df4c4", "scanner": "scanner-primary", "fingerprint": "8b2006483a2c2f0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e816474686a5dcfd", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/portfolio/dividend.ts:3"}, "properties": {"repobilityId": "65b5cb99eeb20f82", "scanner": "scanner-primary", "fingerprint": "e816474686a5dcfd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-252ecd7fe0939b8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-pl.ts:70"}, "properties": {"repobilityId": "37d71afcf7f6a0ca", "scanner": "scanner-primary", "fingerprint": "252ecd7fe0939b8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84d8a138cffe5ef1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke-m.ts:73"}, "properties": {"repobilityId": "2ee503484cfa8938", "scanner": "scanner-primary", "fingerprint": "84d8a138cffe5ef1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a3679392dead20a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test/smoke.ts:73"}, "properties": {"repobilityId": "78930f07b8b7038a", "scanner": "scanner-primary", "fingerprint": "a3679392dead20a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-897251dac0338a8a", "level": "error", "message": {"text": "Dangling fetch: GET https://radio.arinc.net/pacific/ (src/server.ts:1593)"}, "properties": {"repobilityId": "5ccd8c54a5c925cf", "scanner": "scanner-primary", "fingerprint": "897251dac0338a8a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5501c9b579c1d232", "level": "error", "message": {"text": "Dangling fetch: GET https://www.changiairport.com/en/flights/departures.html (src/server.ts:1781)"}, "properties": {"repobilityId": "8535b209397cc539", "scanner": "scanner-primary", "fingerprint": "5501c9b579c1d232", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f625a55cdcc21557", "level": "error", "message": {"text": "Dangling fetch: POST https://ca-appsync.lz.changiairport.com/graphql (src/server.ts:1817)"}, "properties": {"repobilityId": "4c66d73c6a9c9535", "scanner": "scanner-primary", "fingerprint": "f625a55cdcc21557", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2583f7822a7dc86e", "level": "error", "message": {"text": "Dangling fetch: GET https://www.flysfo.com/flysfo/api/flight-status (src/server.ts:1863)"}, "properties": {"repobilityId": "1911bfe2631abd67", "scanner": "scanner-primary", "fingerprint": "2583f7822a7dc86e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9037e062f6aa8f7", "level": "error", "message": {"text": "Dangling fetch: GET https://www.atfmc.gov.hk/public/map?refresh=1 (src/server.ts:2019)"}, "properties": {"repobilityId": "5a006c0fcc627c5e", "scanner": "scanner-primary", "fingerprint": "f9037e062f6aa8f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a79a32da4daa66e", "level": "error", "message": {"text": "Dangling fetch: POST https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token (src/server.ts:2335)"}, "properties": {"repobilityId": "bac637846da2bf14", "scanner": "scanner-primary", "fingerprint": "6a79a32da4daa66e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00dbe9c4335721a1", "level": "error", "message": {"text": "Dangling fetch: GET https://rate.bot.com.tw/xrt?Lang=zh-TW (src/morning-builder.ts:488)"}, "properties": {"repobilityId": "5403420bae9f483e", "scanner": "scanner-primary", "fingerprint": "00dbe9c4335721a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c6cf506c21ebfb96", "level": "error", "message": {"text": "Dangling fetch: GET https://openapi.twse.com.tw/v1/exchangeReport/TWT48U_ALL (src/portfolio/dividend.ts:67)"}, "properties": {"repobilityId": "84da24e8eb542afb", "scanner": "scanner-primary", "fingerprint": "c6cf506c21ebfb96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "18fcaa56e4cbebe5", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-342ecde52501305a", "level": "note", "message": {"text": "Unused endpoint: GET /main"}, "properties": {"repobilityId": "0e732f79d06e7a6a", "scanner": "scanner-primary", "fingerprint": "342ecde52501305a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-311cd49f33c5ec33", "level": "note", "message": {"text": "Unused endpoint: GET /share"}, "properties": {"repobilityId": "1c8675ba5f094c10", "scanner": "scanner-primary", "fingerprint": "311cd49f33c5ec33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f0c1251a3e19f3c", "level": "note", "message": {"text": "Unused endpoint: GET /apps"}, "properties": {"repobilityId": "5885249c93451c6f", "scanner": "scanner-primary", "fingerprint": "9f0c1251a3e19f3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e912e2e4dd5f97b0", "level": "note", "message": {"text": "Unused endpoint: GET /apps/icon.svg"}, "properties": {"repobilityId": "9d18f6fcaf333ab2", "scanner": "scanner-primary", "fingerprint": "e912e2e4dd5f97b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ffb82807ad76dc5", "level": "note", "message": {"text": "Unused endpoint: GET /apps/manifest.json"}, "properties": {"repobilityId": "11cb7db8d2e483b2", "scanner": "scanner-primary", "fingerprint": "9ffb82807ad76dc5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a20b9d3b25fdd20", "level": "note", "message": {"text": "Unused endpoint: GET /faq"}, "properties": {"repobilityId": "227c64c81d9e9a56", "scanner": "scanner-primary", "fingerprint": "8a20b9d3b25fdd20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9daee89b78e9ceac", "level": "note", "message": {"text": "Unused endpoint: GET /privacy"}, "properties": {"repobilityId": "f0860555ccb1445e", "scanner": "scanner-primary", "fingerprint": "9daee89b78e9ceac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebe3481a27b770a5", "level": "note", "message": {"text": "Unused endpoint: GET /terms"}, "properties": {"repobilityId": "f1e40d49cc39fb77", "scanner": "scanner-primary", "fingerprint": "ebe3481a27b770a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c1219a716537775", "level": "note", "message": {"text": "Unused endpoint: GET /icon.svg"}, "properties": {"repobilityId": "7ac2d8e3b01b649a", "scanner": "scanner-primary", "fingerprint": "4c1219a716537775", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5881fad21d09723d", "level": "note", "message": {"text": "Unused endpoint: GET /manifest.json"}, "properties": {"repobilityId": "e67f21282058057e", "scanner": "scanner-primary", "fingerprint": "5881fad21d09723d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dfc6d31b3f4f1759", "level": "note", "message": {"text": "Unused endpoint: GET /api/oauth2callback"}, "properties": {"repobilityId": "05b4374db1984e0f", "scanner": "scanner-primary", "fingerprint": "dfc6d31b3f4f1759", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86f2c0d75d0f63d5", "level": "note", "message": {"text": "Unused endpoint: GET /oauth/callback"}, "properties": {"repobilityId": "be806699e47df07c", "scanner": "scanner-primary", "fingerprint": "86f2c0d75d0f63d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2f097e3bd2e16ea", "level": "note", "message": {"text": "Unused endpoint: GET /briefing-room"}, "properties": {"repobilityId": "c5be5e4a68994b60", "scanner": "scanner-primary", "fingerprint": "b2f097e3bd2e16ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15d0c835fe9f3243", "level": "note", "message": {"text": "Unused endpoint: GET /api/metar"}, "properties": {"repobilityId": "1f5969dd2272238d", "scanner": "scanner-primary", "fingerprint": "15d0c835fe9f3243", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f36f403cee70baa", "level": "note", "message": {"text": "Unused endpoint: GET /api/taf"}, "properties": {"repobilityId": "34008190a247c069", "scanner": "scanner-primary", "fingerprint": "3f36f403cee70baa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d64d9671ffc673f", "level": "note", "message": {"text": "Unused endpoint: GET /api/atis"}, "properties": {"repobilityId": "3288b22f6191f304", "scanner": "scanner-primary", "fingerprint": "8d64d9671ffc673f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-133ec11585d35ba7", "level": "note", "message": {"text": "Unused endpoint: GET /api/atis-usage"}, "properties": {"repobilityId": "dbfc11e1c97188de", "scanner": "scanner-primary", "fingerprint": "133ec11585d35ba7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f22cf013c13a7f0c", "level": "note", "message": {"text": "Unused endpoint: GET /sw.js"}, "properties": {"repobilityId": "08cfe25c4cd2d749", "scanner": "scanner-primary", "fingerprint": "f22cf013c13a7f0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-385144830ea5a258", "level": "note", "message": {"text": "Unused endpoint: GET /api/pacific-hf"}, "properties": {"repobilityId": "695f06bf43c23f4d", "scanner": "scanner-primary", "fingerprint": "385144830ea5a258", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4114acc3e551b6f", "level": "note", "message": {"text": "Unused endpoint: POST /api/nop-refresh"}, "properties": {"repobilityId": "b50b15bbb254cd23", "scanner": "scanner-primary", "fingerprint": "d4114acc3e551b6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffd0c4993aae395e", "level": "note", "message": {"text": "Unused endpoint: GET /api/fr24"}, "properties": {"repobilityId": "49706166f10547c9", "scanner": "scanner-primary", "fingerprint": "ffd0c4993aae395e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be24fdfd76446e22", "level": "note", "message": {"text": "Unused endpoint: GET /api/fr24/detail"}, "properties": {"repobilityId": "e7c3af13419d79a5", "scanner": "scanner-primary", "fingerprint": "be24fdfd76446e22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb54ef899d980215", "level": "note", "message": {"text": "Unused endpoint: GET /api/fr24-schedule"}, "properties": {"repobilityId": "889e65c3dd9df6a5", "scanner": "scanner-primary", "fingerprint": "fb54ef899d980215", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c9d45956f3ce7b9", "level": "note", "message": {"text": "Unused endpoint: GET /debug/screenshot"}, "properties": {"repobilityId": "f3fcf8f842d4b773", "scanner": "scanner-primary", "fingerprint": "0c9d45956f3ce7b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b1d4dfede4ed35b", "level": "note", "message": {"text": "Unused endpoint: GET /debug/sync"}, "properties": {"repobilityId": "87eb4b5d563d407c", "scanner": "scanner-primary", "fingerprint": "7b1d4dfede4ed35b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a3c45156489b020", "level": "note", "message": {"text": "Unused endpoint: GET /api/users"}, "properties": {"repobilityId": "4dd09d16ea033d4c", "scanner": "scanner-primary", "fingerprint": "3a3c45156489b020", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc542d91e6667d26", "level": "note", "message": {"text": "Unused endpoint: GET /api/roster-data"}, "properties": {"repobilityId": "57f1da7b9655092f", "scanner": "scanner-primary", "fingerprint": "bc542d91e6667d26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12935228ff804a6f", "level": "note", "message": {"text": "Unused endpoint: GET /api/roster-friends"}, "properties": {"repobilityId": "f24022a6a820e1ae", "scanner": "scanner-primary", "fingerprint": "12935228ff804a6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66053fa1d9abfbf2", "level": "note", "message": {"text": "Unused endpoint: GET /api/groups"}, "properties": {"repobilityId": "96e8805b0c42f0c4", "scanner": "scanner-primary", "fingerprint": "66053fa1d9abfbf2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-453e5bd6bf56f916", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/groups/:id"}, "properties": {"repobilityId": "7fbfa92ce97c97c5", "scanner": "scanner-primary", "fingerprint": "453e5bd6bf56f916", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcbfe97242c23df1", "level": "note", "message": {"text": "Unused endpoint: POST /api/groups/join"}, "properties": {"repobilityId": "460738281b7c8e89", "scanner": "scanner-primary", "fingerprint": "bcbfe97242c23df1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a87ae9fe8119f9b9", "level": "note", "message": {"text": "Unused endpoint: GET /api/groups/invites"}, "properties": {"repobilityId": "179a1f5a338bd6bf", "scanner": "scanner-primary", "fingerprint": "a87ae9fe8119f9b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efa2809f28eeba8d", "level": "note", "message": {"text": "Unused endpoint: POST /api/groups/invites/:id/accept"}, "properties": {"repobilityId": "e6d794ef0c147e72", "scanner": "scanner-primary", "fingerprint": "efa2809f28eeba8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4be8b7b5cb4e95c", "level": "note", "message": {"text": "Unused endpoint: POST /api/groups/invites/:id/decline"}, "properties": {"repobilityId": "f3daf8940b23d12c", "scanner": "scanner-primary", "fingerprint": "e4be8b7b5cb4e95c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8deb0e577cd75314", "level": "note", "message": {"text": "Unused endpoint: GET /api/groups/:id/members"}, "properties": {"repobilityId": "1c2b5eb909f77f5b", "scanner": "scanner-primary", "fingerprint": "8deb0e577cd75314", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6484089590c25f47", "level": "note", "message": {"text": "Unused endpoint: GET /api/db-test"}, "properties": {"repobilityId": "2b4f896e0fe15601", "scanner": "scanner-primary", "fingerprint": "6484089590c25f47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a521997af4884762", "level": "note", "message": {"text": "Unused endpoint: GET /api/calendar-events"}, "properties": {"repobilityId": "259a1c58d8563e5e", "scanner": "scanner-primary", "fingerprint": "a521997af4884762", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-188cd98261d63cda", "level": "note", "message": {"text": "Unused endpoint: GET /api/sync-debug/:syncId/:file"}, "properties": {"repobilityId": "088652a090be6099", "scanner": "scanner-primary", "fingerprint": "188cd98261d63cda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84df4fcf2cbe5117", "level": "note", "message": {"text": "Unused endpoint: GET /api/briefing"}, "properties": {"repobilityId": "cabd7965c50ae89c", "scanner": "scanner-primary", "fingerprint": "84df4fcf2cbe5117", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c78d270a3dd406d", "level": "note", "message": {"text": "Unused endpoint: GET /api/briefing/list"}, "properties": {"repobilityId": "a90fb692b0e98dbb", "scanner": "scanner-primary", "fingerprint": "6c78d270a3dd406d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1344e0aeb87a6b75", "level": "note", "message": {"text": "Unused endpoint: GET /morning"}, "properties": {"repobilityId": "a4682bbfb0cd2699", "scanner": "scanner-primary", "fingerprint": "1344e0aeb87a6b75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98aa32f074acdacf", "level": "note", "message": {"text": "Unused endpoint: GET /morning/manifest.json"}, "properties": {"repobilityId": "6dead626b3b0244c", "scanner": "scanner-primary", "fingerprint": "98aa32f074acdacf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3123e1ae264035d", "level": "note", "message": {"text": "Unused endpoint: GET /morning/icon.svg"}, "properties": {"repobilityId": "000890bbceb900ee", "scanner": "scanner-primary", "fingerprint": "f3123e1ae264035d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-648a8136fa001aae", "level": "note", "message": {"text": "Unused endpoint: GET /morning/sw.js"}, "properties": {"repobilityId": "0818239ad374f8c2", "scanner": "scanner-primary", "fingerprint": "648a8136fa001aae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec117837547fd0f2", "level": "note", "message": {"text": "Unused endpoint: GET /api/morning-report/dates"}, "properties": {"repobilityId": "ccb0264cec8369e6", "scanner": "scanner-primary", "fingerprint": "ec117837547fd0f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af739581cd9d112e", "level": "note", "message": {"text": "Unused endpoint: POST /api/morning-prefs"}, "properties": {"repobilityId": "e9ad941c48441616", "scanner": "scanner-primary", "fingerprint": "af739581cd9d112e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa8dbbdaf5a4d390", "level": "note", "message": {"text": "Unused endpoint: GET /api/morning-prefs"}, "properties": {"repobilityId": "0eb368c3c0cdd9e9", "scanner": "scanner-primary", "fingerprint": "aa8dbbdaf5a4d390", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b465e8ff19a52527", "level": "note", "message": {"text": "Unused endpoint: GET /api/morning-reader"}, "properties": {"repobilityId": "14d6b5131c905282", "scanner": "scanner-primary", "fingerprint": "b465e8ff19a52527", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90eb13ed27aff390", "level": "note", "message": {"text": "Unused endpoint: POST /api/morning-report/refresh"}, "properties": {"repobilityId": "b2da8f2373623168", "scanner": "scanner-primary", "fingerprint": "90eb13ed27aff390", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}