{"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-8c3a5885d8a6a2ad", "name": "Stray `console.log` in TS/JS \u2014 server.js:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:124"}, "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-925668eddbb5fd07", "name": "Stray `console.log` in TS/JS \u2014 config/gchat-crm-bot.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 config/gchat-crm-bot.js: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-fe25a4f7cd015ae3", "name": "Stray `console.log` in TS/JS \u2014 test/reminders-synthetic.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/reminders-synthetic.js:21"}, "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-18c706814a789d1c", "name": "Stray `console.log` in TS/JS \u2014 test/content-reminders-synthetic.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/content-reminders-synthetic.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dd21dd60c9a5289", "name": "Stray `console.log` in TS/JS \u2014 test/nudges-synthetic.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/nudges-synthetic.js:17"}, "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-0ad1c0c4f581cea9", "name": "Stray `console.log` in TS/JS \u2014 test/suggestions-synthetic.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/suggestions-synthetic.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fcc8f30fdbba2ca", "name": "Stray `console.log` in TS/JS \u2014 scripts/reset-intelligence.js:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-intelligence.js:99"}, "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-121aa30382f13208", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-workday-daily-index.js:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-workday-daily-index.js:119"}, "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-a1545a3195529309", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-cv.js:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cv.js:167"}, "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-bf8ce273a2f62d2b", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-nate-labels.js:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-nate-labels.js:79"}, "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-ec7d20f3670fff2b", "name": "Stray `console.log` in TS/JS \u2014 scripts/ingest-workday.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ingest-workday.js:6"}, "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-23429e83e22adfe7", "name": "Stray `console.log` in TS/JS \u2014 scripts/init-db.js:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/init-db.js:153"}, "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-21fc77c6b517eff3", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-email-taxonomy.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-email-taxonomy.js:50"}, "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-538bf71e62ae6341", "name": "Stray `console.log` in TS/JS \u2014 scripts/patch-production-gmail-inbox.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-production-gmail-inbox.js: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-b294ad31ea06d925", "name": "Stray `console.log` in TS/JS \u2014 scripts/mail-taxonomy-migrate.js:217", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/mail-taxonomy-migrate.js:217"}, "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-5feb18173e8208c1", "name": "Stray `console.log` in TS/JS \u2014 scripts/ingest-boox-drive-notes.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ingest-boox-drive-notes.js:25"}, "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-1c9ea67343ada05c", "name": "Stray `console.log` in TS/JS \u2014 scripts/daily-digest.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/daily-digest.js: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-9ba7d1ec52787983", "name": "Stray `console.log` in TS/JS \u2014 scripts/gmail-taxonomy-finalize.js:239", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gmail-taxonomy-finalize.js:239"}, "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-fa6c51ce5cb4414f", "name": "Stray `console.log` in TS/JS \u2014 scripts/gmail-inbox-restore.js:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gmail-inbox-restore.js:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-90f3d4cc5f792185", "name": "Stray `console.log` in TS/JS \u2014 lib/crm.js:629", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/crm.js:629"}, "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-f3006a8bdee02f89", "name": "Stray `console.log` in TS/JS \u2014 lib/memory-compactor.js:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/memory-compactor.js:93"}, "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-34050897e0c3e333", "name": "Stray `console.log` in TS/JS \u2014 lib/weekly-digest.js:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/weekly-digest.js:172"}, "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-78b62c9a2846b976", "name": "Stray `console.log` in TS/JS \u2014 lib/agentmail-processor.js:340", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/agentmail-processor.js:340"}, "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-4715e69403580835", "name": "Stray `console.log` in TS/JS \u2014 lib/regulatory-monitor.js:226", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/regulatory-monitor.js:226"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17550fff2ee0587c", "name": "Stray `console.log` in TS/JS \u2014 lib/mycelium.js:494", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/mycelium.js:494"}, "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-145ec21103a4ac06", "name": "Stray `console.log` in TS/JS \u2014 lib/system-report.js:374", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/system-report.js:374"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4216856171bafd98", "name": "Stray `console.log` in TS/JS \u2014 lib/rh-stats.js:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/rh-stats.js:162"}, "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-069b886bc2cf3fc2", "name": "Stray `console.log` in TS/JS \u2014 lib/google-chat.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-chat.js:24"}, "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-77234da026f879e2", "name": "Stray `console.log` in TS/JS \u2014 lib/google-tasks.js:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-tasks.js:53"}, "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-c7abf96cbe3485e2", "name": "Stray `console.log` in TS/JS \u2014 lib/crm-nudges.js:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/crm-nudges.js:121"}, "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-a5546bc54af05463", "name": "Stray `console.log` in TS/JS \u2014 lib/google-auth.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-auth.js:101"}, "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-b26aabf3c166b6e9", "name": "Stray `console.log` in TS/JS \u2014 lib/gmail.js:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/gmail.js:79"}, "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-c7f3356233d4a5d0", "name": "Stray `console.log` in TS/JS \u2014 lib/job-queue.js:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/job-queue.js:127"}, "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-d4b9c3a03ca9385a", "name": "Stray `console.log` in TS/JS \u2014 lib/newsletter-pipeline.js:328", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/newsletter-pipeline.js:328"}, "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-3ddf908aaaf157ae", "name": "Stray `console.log` in TS/JS \u2014 lib/router.js:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/router.js:85"}, "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-6c9c3bf0d3abc04c", "name": "Stray `console.log` in TS/JS \u2014 lib/rss-ingest.js:190", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/rss-ingest.js:190"}, "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-a64d9d41e0e31249", "name": "Stray `console.log` in TS/JS \u2014 lib/email-processor.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/email-processor.js:47"}, "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-ed49b2ffb44dc685", "name": "Stray `console.log` in TS/JS \u2014 lib/reminders.js:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/reminders.js:93"}, "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-71d895d351925e0a", "name": "Stray `console.log` in TS/JS \u2014 lib/suggestion-engine.js:322", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/suggestion-engine.js:322"}, "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-9922fbcf00944056", "name": "Stray `console.log` in TS/JS \u2014 lib/linkedin-pipeline.js:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/linkedin-pipeline.js:110"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-918d99f66bb44536", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-workday.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-workday.js:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9c50c5a7c25fa3b8", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-debrief.js:252", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-debrief.js:252"}, "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-ae05884591cb015b", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-external.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-external.js:32"}, "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-c6d74e5ca4e416a8", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-linkedin.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-linkedin.js:47"}, "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-c55acab55370ab13", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-admin.js:824", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-admin.js:824"}, "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-260564524eff7f9f", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-crm.js:256", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-crm.js:256"}, "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-6133895c592739cc", "name": "Stray `console.log` in TS/JS \u2014 routes/hub-documents.js:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-documents.js:152"}, "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-448336d63acff9e5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 public/hub-modern.jsx:787", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 public/hub-modern.jsx:787"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d3fadf4ecee8d27", "name": "Privileged port 2 in use", "shortDescription": {"text": "Privileged port 2 in use"}, "fullDescription": {"text": "Port 2 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-598efefdd6bd409d", "name": "Insecure pattern 'node_child_process' in scripts/mail-taxonomy-migrate.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/mail-taxonomy-migrate.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a840a01ab204b9d4", "name": "Insecure pattern 'node_child_process' in scripts/ingest-boox-drive-notes.js:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/ingest-boox-drive-notes.js:6"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ea38278a0e86e71", "name": "Insecure pattern 'node_child_process' in lib/markitdown.js:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/markitdown.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01d3f71455e40bd0", "name": "Insecure pattern 'node_child_process' in lib/workday-ingest.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/workday-ingest.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6beaa62d4524fe4b", "name": "Insecure pattern 'node_child_process' in lib/system-report.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/system-report.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0f080605724823e", "name": "Insecure pattern 'node_child_process' in token-burn-dashboard/scripts/generate-daily-burn.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in token-burn-dashboard/scripts/generate-daily-burn.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c6c14fe4f8985e5", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-chat.js:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-chat.js: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-636ca3b439788a46", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/portfolio-chat.js:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/portfolio-chat.js:23"}, "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-21ebb9f5f8280253", "name": "Insecure pattern 'dangerous_innerhtml' in public/hub-modern.jsx:787", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in public/hub-modern.jsx:787"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53dca773de58bce9", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-modern.jsx:65", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-modern.jsx:65"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e77fc5b22e3df496", "name": "Very large file: routes/hub-admin.js (1766 lines)", "shortDescription": {"text": "Very large file: routes/hub-admin.js (1766 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-e9cd5fdd66f0a7ff", "name": "Very large file: routes/hub-crm.js (1499 lines)", "shortDescription": {"text": "Very large file: routes/hub-crm.js (1499 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-bbb486a5b37763ef", "name": "Very large file: public/hub-modern.jsx (2001 lines)", "shortDescription": {"text": "Very large file: public/hub-modern.jsx (2001 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "22 tests / 99 src (ratio 0.22)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 158 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 14 placeholder/mock markers across 3 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03849d4b51b0699a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 config/gchat-crm-bot.js:230", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 config/gchat-crm-bot.js:230"}, "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-1e3f0687e0d74cf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/crm.js:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/crm.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-85963314e4de6379", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/task-learning.js:192", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/task-learning.js:192"}, "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-ea784712337ce331", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/weekly-digest.js:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/weekly-digest.js:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-435b1e32437a125f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/workday-ingest.js:277", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/workday-ingest.js:277"}, "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-4b7708436132cd0c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agentmail-processor.js:145", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agentmail-processor.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-7e1c763bf8f0bb4b", "name": "Commented-code block (8 lines) in lib/prompts.js:2", "shortDescription": {"text": "Commented-code block (8 lines) in lib/prompts.js: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-9213632eff5b619c", "name": "Commented-code block (5 lines) in lib/wiki-engine.js:159", "shortDescription": {"text": "Commented-code block (5 lines) in lib/wiki-engine.js:159"}, "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-b9429b4efb732fb2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wiki-engine.js:482", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wiki-engine.js:482"}, "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-470f820fd77be443", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/regulatory-monitor.js:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/regulatory-monitor.js:29"}, "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-f2558c9b4c584793", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/extract.js:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/extract.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-75e81b872d6b5eef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/newsletter-pipeline.js:740", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/newsletter-pipeline.js:740"}, "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-ebc5afc30d8fab4b", "name": "Commented-code block (7 lines) in lib/router.js:8", "shortDescription": {"text": "Commented-code block (7 lines) in lib/router.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7e0b3dfb6e71d51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/router.js:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/router.js:112"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c73434c991d44f6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email-processor.js:226", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email-processor.js:226"}, "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-5c894ed670b80fd5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/suggestion-engine.js:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/suggestion-engine.js:37"}, "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-e0339582f963bc55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/linkedin-pipeline.js:514", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/linkedin-pipeline.js:514"}, "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-b5fecec0fd2535d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 routes/wiki.js:502", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/wiki.js:502"}, "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-c5700c7924c6ced1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-debrief.js:179", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-debrief.js:179"}, "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-955a189291ff9f15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-external.js:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-external.js:12"}, "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-55b077f0632cc8fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-linkedin.js:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-linkedin.js:118"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d973ffb56e538abe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-admin.js:1177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-admin.js:1177"}, "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-35f5a72b99122d38", "name": "Commented-code block (5 lines) in routes/hub.js:833", "shortDescription": {"text": "Commented-code block (5 lines) in routes/hub.js:833"}, "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-440ebcc43ca14ad4", "name": "Commented-code block (7 lines) in public/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (7 lines) in public/tweaks-panel.jsx:12"}, "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-38cdcb556ec811f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-chat.js:486", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-chat.js:486"}, "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-82e3e4bda5bbbb7e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/portfolio-chat.js:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/portfolio-chat.js:102"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c927a9438936df15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-modern.jsx:452", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-modern.jsx:452"}, "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-3f45a82cc48e9df9", "name": "44 env vars used in code but missing from .env.example", "shortDescription": {"text": "44 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AERODATABOX_KEY`, `AGENTMAIL_WORK_DOMAINS`, `BOOX_DRIVE_QUEUE`, `BRAVE_SEARCH_API_KEY`, `BRIEFING_HOUR`, `BRIEFING_MINUTE`, `CRM_CALENDAR_DEBUG`, `DCHAT_MCP_TOKEN` + 36 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed48b41c5af7d534", "name": "Dangling fetch: GET https://example.invalid (test/fetch.test.js:15)", "shortDescription": {"text": "Dangling fetch: GET https://example.invalid (test/fetch.test.js:15)"}, "fullDescription": {"text": "`test/fetch.test.js:15` calls `GET https://example.invalid` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/example.invalid`\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-6b6c9c52cfd467a4", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/daily-digest.js:128)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/daily-digest.js:128)"}, "fullDescription": {"text": "`scripts/daily-digest.js:128` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-727bead25da650c5", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/crm.js:160)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/crm.js:160)"}, "fullDescription": {"text": "`lib/crm.js:160` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-44ed74828a4ddb69", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/task-learning.js:192)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/task-learning.js:192)"}, "fullDescription": {"text": "`lib/task-learning.js:192` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-224102323907770c", "name": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (lib/workday-ingest.js:244)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (lib/workday-ingest.js:244)"}, "fullDescription": {"text": "`lib/workday-ingest.js:244` calls `POST https://api.openai.com/v1/audio/transcriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/audio/transcriptions`\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-68e2e7dd9e9d41ec", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/audio/transcriptions (lib/workday-ingest.js:277)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/audio/transcriptions (lib/workday-ingest.js:277)"}, "fullDescription": {"text": "`lib/workday-ingest.js:277` calls `POST https://openrouter.ai/api/v1/audio/transcriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/audio/transcriptions`\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-02006b54fb64cae2", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/agentmail-processor.js:145)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/agentmail-processor.js:145)"}, "fullDescription": {"text": "`lib/agentmail-processor.js:145` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-a2ec7dfd4e6f2b46", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:482)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:482)"}, "fullDescription": {"text": "`lib/wiki-engine.js:482` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-a44138e4700abb70", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:524)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:524)"}, "fullDescription": {"text": "`lib/wiki-engine.js:524` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-80f81f27f86543bd", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:547)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:547)"}, "fullDescription": {"text": "`lib/wiki-engine.js:547` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-456f57cf0918d261", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/mycelium.js:175)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/mycelium.js:175)"}, "fullDescription": {"text": "`lib/mycelium.js:175` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-f413f18a9faaa139", "name": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${f.flight_number}/${f.flight_date}?withAircraftIm", "shortDescription": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${f.flight_number}/${f.flight_date}?withAircraftImage=false&withLocation=false (lib/job-queue.js:133)"}, "fullDescription": {"text": "`lib/job-queue.js:133` calls `GET https://aerodatabox.p.rapidapi.com/flights/number/${f.flight_number}/${f.flight_date}?withAircraftImage=false&withLocation=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/aerodatabox.p.rapidapi.com/flights/number/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-575cc2094030b000", "name": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=fa", "shortDescription": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false (lib/job-queue.js:245)"}, "fullDescription": {"text": "`lib/job-queue.js:245` calls `GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/aerodatabox.p.rapidapi.com/flights/number/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c67600fc95d6126", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:396)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:396)"}, "fullDescription": {"text": "`lib/newsletter-pipeline.js:396` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-d274135309149d16", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:636)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:636)"}, "fullDescription": {"text": "`lib/newsletter-pipeline.js:636` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-f85eb98b188ed2b4", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:740)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:740)"}, "fullDescription": {"text": "`lib/newsletter-pipeline.js:740` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-f508ddcebff33072", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:1149)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:1149)"}, "fullDescription": {"text": "`lib/newsletter-pipeline.js:1149` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-8a5baf6ea907945a", "name": "Dangling fetch: POST https://api.exa.ai/search (lib/router.js:66)", "shortDescription": {"text": "Dangling fetch: POST https://api.exa.ai/search (lib/router.js:66)"}, "fullDescription": {"text": "`lib/router.js:66` calls `POST https://api.exa.ai/search` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.exa.ai/search`\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-f090682a654a62a5", "name": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5 (lib/router.js", "shortDescription": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5 (lib/router.js:105)"}, "fullDescription": {"text": "`lib/router.js:105` calls `GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.search.brave.com/res/v1/web/search`\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-e52b96c545f5e278", "name": "Dangling fetch: POST https://api.tavily.com/search (lib/router.js:112)", "shortDescription": {"text": "Dangling fetch: POST https://api.tavily.com/search (lib/router.js:112)"}, "fullDescription": {"text": "`lib/router.js:112` calls `POST https://api.tavily.com/search` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.tavily.com/search`\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-71cc82af4c9a35e5", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:161)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:161)"}, "fullDescription": {"text": "`lib/router.js:161` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-bad81eca5c29bdb1", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:350)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:350)"}, "fullDescription": {"text": "`lib/router.js:350` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-68d8423c58bce5c8", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:460)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:460)"}, "fullDescription": {"text": "`lib/router.js:460` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-3394c0e5fb2518c4", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:g", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${process.env.GOOGLE_AI_API_KEY} (lib/router.js:491)"}, "fullDescription": {"text": "`lib/router.js:491` calls `POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${process.env.GOOGLE_AI_API_KEY}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d39d9638b3b34202", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/email-processor.js:226)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/email-processor.js:226)"}, "fullDescription": {"text": "`lib/email-processor.js:226` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-cc99633de72f2e21", "name": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:117)", "shortDescription": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:117)"}, "fullDescription": {"text": "`lib/linkedin-pipeline.js:117` calls `POST https://api.firecrawl.dev/v1/scrape` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.firecrawl.dev/v1/scrape`\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-d2f3b1a5c7331a9d", "name": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(q)}&count=5&freshness=pm (lib/", "shortDescription": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(q)}&count=5&freshness=pm (lib/linkedin-pipeline.js:174)"}, "fullDescription": {"text": "`lib/linkedin-pipeline.js:174` calls `GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(q)}&count=5&freshness=pm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.search.brave.com/res/v1/web/search`\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-5cb7b14b2102a6f7", "name": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:192)", "shortDescription": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:192)"}, "fullDescription": {"text": "`lib/linkedin-pipeline.js:192` calls `POST https://api.firecrawl.dev/v1/scrape` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.firecrawl.dev/v1/scrape`\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-2629f632a3fc2d92", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:g", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${key} (lib/linkedin-pipeline.js:514)"}, "fullDescription": {"text": "`lib/linkedin-pipeline.js:514` calls `POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${key}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9fb3883b56c3b8a5", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/wiki.js:502)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/wiki.js:502)"}, "fullDescription": {"text": "`routes/wiki.js:502` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-635262b719f7d324", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:55)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:55)"}, "fullDescription": {"text": "`routes/hub-debrief.js:55` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-7f638f37b44201f5", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:179)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:179)"}, "fullDescription": {"text": "`routes/hub-debrief.js:179` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-ad0dfff10b763768", "name": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=bbc.com%2Fnews+top+stories+today&count=8&freshness=", "shortDescription": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=bbc.com%2Fnews+top+stories+today&count=8&freshness=pd (routes/hub-admin.js:840)"}, "fullDescription": {"text": "`routes/hub-admin.js:840` calls `GET https://api.search.brave.com/res/v1/web/search?q=bbc.com%2Fnews+top+stories+today&count=8&freshness=pd` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.search.brave.com/res/v1/web/search`\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-3b918c7d0bef7eee", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:862)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:862)"}, "fullDescription": {"text": "`routes/hub-admin.js:862` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-067f5c6102e37e0d", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1120)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1120)"}, "fullDescription": {"text": "`routes/hub-admin.js:1120` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-1f76bcdb53396f25", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1177)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1177)"}, "fullDescription": {"text": "`routes/hub-admin.js:1177` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-37339bf91737aed6", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1229)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1229)"}, "fullDescription": {"text": "`routes/hub-admin.js:1229` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-ac0dcf4071695910", "name": "Dangling fetch: GET https://openrouter.ai/api/v1/models (routes/hub-admin.js:1450)", "shortDescription": {"text": "Dangling fetch: GET https://openrouter.ai/api/v1/models (routes/hub-admin.js:1450)"}, "fullDescription": {"text": "`routes/hub-admin.js:1450` calls `GET https://openrouter.ai/api/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/models`\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-6557fb75dcbb4f72", "name": "Dangling fetch: GET https://www.googleapis.com/service_accounts/v1/metadata/x509/${encodeURIComponent(chatIssuer)} (rout", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/service_accounts/v1/metadata/x509/${encodeURIComponent(chatIssuer)} (routes/hub-crm.js:105)"}, "fullDescription": {"text": "`routes/hub-crm.js:105` calls `GET https://www.googleapis.com/service_accounts/v1/metadata/x509/${encodeURIComponent(chatIssuer)}` 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.googleapis.com/service_accounts/v1/metadata/x509/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d8065a8c149d8a0f", "name": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=fa", "shortDescription": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false (routes/hub-flights.js:360)"}, "fullDescription": {"text": "`routes/hub-flights.js:360` calls `GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/aerodatabox.p.rapidapi.com/flights/number/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2b0a8d7ff9796e0", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-documents.js:109)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-documents.js:109)"}, "fullDescription": {"text": "`routes/hub-documents.js:109` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\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-364aa8299628fdb7", "name": "Dangling fetch: POST /api/journal/audio/session (public/hub-modern.jsx:1042)", "shortDescription": {"text": "Dangling fetch: POST /api/journal/audio/session (public/hub-modern.jsx:1042)"}, "fullDescription": {"text": "`public/hub-modern.jsx:1042` calls `POST /api/journal/audio/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/journal/audio/session`\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-6a4dfcad3eb1618a", "name": "Unused endpoint: GET /login", "shortDescription": {"text": "Unused endpoint: GET /login"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /login` 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-2e9f0c712241895d", "name": "Unused endpoint: GET /auth/google", "shortDescription": {"text": "Unused endpoint: GET /auth/google"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /auth/google` 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-392dcbd9c0e4ed85", "name": "Unused endpoint: GET /auth/google/callback", "shortDescription": {"text": "Unused endpoint: GET /auth/google/callback"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /auth/google/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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`routes/wiki.js` 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-f267debbf8ae8442", "name": "Unused endpoint: GET /browse", "shortDescription": {"text": "Unused endpoint: GET /browse"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /browse` 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-ddf120b2be0c04e5", "name": "Unused endpoint: GET /page/new", "shortDescription": {"text": "Unused endpoint: GET /page/new"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /page/new` 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-6d0be7d96ca3472e", "name": "Unused endpoint: POST /page/new", "shortDescription": {"text": "Unused endpoint: POST /page/new"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /page/new` 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-db806f8188116c5f", "name": "Unused endpoint: GET /page/:slug", "shortDescription": {"text": "Unused endpoint: GET /page/:slug"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /page/:slug` 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-902f9cc248e6089f", "name": "Unused endpoint: GET /page/:slug/edit", "shortDescription": {"text": "Unused endpoint: GET /page/:slug/edit"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /page/:slug/edit` 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-0c9f09d07807e112", "name": "Unused endpoint: POST /page/:slug/save", "shortDescription": {"text": "Unused endpoint: POST /page/:slug/save"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /page/:slug/save` 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-6e7b9297cbaa42f2", "name": "Unused endpoint: POST /page/:slug/rename", "shortDescription": {"text": "Unused endpoint: POST /page/:slug/rename"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /page/:slug/rename` 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-fee7a014a2051763", "name": "Unused endpoint: POST /page/:slug/delete", "shortDescription": {"text": "Unused endpoint: POST /page/:slug/delete"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /page/:slug/delete` 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-006745bcd17bb697", "name": "Unused endpoint: GET /source/*/edit", "shortDescription": {"text": "Unused endpoint: GET /source/*/edit"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /source/*/edit` 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-a961f47fda4ce126", "name": "Unused endpoint: POST /source/*/save", "shortDescription": {"text": "Unused endpoint: POST /source/*/save"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /source/*/save` 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-079b330c5fbd22a8", "name": "Unused endpoint: GET /source/*", "shortDescription": {"text": "Unused endpoint: GET /source/*"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /source/*` 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-41f0cbf3099517aa", "name": "Unused endpoint: GET /orphans", "shortDescription": {"text": "Unused endpoint: GET /orphans"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /orphans` 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-c0ac2ef565a5459b", "name": "Unused endpoint: GET /graph", "shortDescription": {"text": "Unused endpoint: GET /graph"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /graph` 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-1f40eecb3c68cc76", "name": "Unused endpoint: GET /ingest", "shortDescription": {"text": "Unused endpoint: GET /ingest"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /ingest` 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-0c7e515dec17aeb9", "name": "Unused endpoint: POST /api/ingest/url", "shortDescription": {"text": "Unused endpoint: POST /api/ingest/url"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /api/ingest/url` 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-2205760646975fb8", "name": "Unused endpoint: GET /api/search", "shortDescription": {"text": "Unused endpoint: GET /api/search"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /api/search` 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-9185678549c1ef6d", "name": "Unused endpoint: GET /api/graph", "shortDescription": {"text": "Unused endpoint: GET /api/graph"}, "fullDescription": {"text": "`routes/wiki.js` declares `GET /api/graph` 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-444a455bc838ffb3", "name": "Unused endpoint: POST /api/graph/link", "shortDescription": {"text": "Unused endpoint: POST /api/graph/link"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /api/graph/link` 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-63538a9d4c00c92f", "name": "Unused endpoint: POST /api/graph/unlink", "shortDescription": {"text": "Unused endpoint: POST /api/graph/unlink"}, "fullDescription": {"text": "`routes/wiki.js` declares `POST /api/graph/unlink` 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-ab2c628ca8baa6a5", "name": "Unused endpoint: POST /topics/toggle", "shortDescription": {"text": "Unused endpoint: POST /topics/toggle"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /topics/toggle` 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-50aa099d2349b661", "name": "Unused endpoint: POST /topics/toggle-week", "shortDescription": {"text": "Unused endpoint: POST /topics/toggle-week"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /topics/toggle-week` 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-18432bdcc08acbb6", "name": "Unused endpoint: POST /sources/:id/priority", "shortDescription": {"text": "Unused endpoint: POST /sources/:id/priority"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /sources/:id/priority` 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-1f411d404a63ca44", "name": "Unused endpoint: GET /gmail-labels", "shortDescription": {"text": "Unused endpoint: GET /gmail-labels"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /gmail-labels` 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-a7703e292f068ddb", "name": "Unused endpoint: POST /backfill", "shortDescription": {"text": "Unused endpoint: POST /backfill"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /backfill` 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-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /generate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cccfe89f81ab208f", "name": "Unused endpoint: POST /preview", "shortDescription": {"text": "Unused endpoint: POST /preview"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /preview` 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-ef1d19290055204a", "name": "Unused endpoint: GET /generate/:jobId", "shortDescription": {"text": "Unused endpoint: GET /generate/:jobId"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /generate/:jobId` 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-2f222a275ed687b3", "name": "Unused endpoint: POST /send", "shortDescription": {"text": "Unused endpoint: POST /send"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /send` 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-abfa0827756df7cb", "name": "Unused endpoint: GET /briefing/:id", "shortDescription": {"text": "Unused endpoint: GET /briefing/:id"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /briefing/: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-ed0ee85778c4b816", "name": "Unused endpoint: POST /briefing/:id/delete", "shortDescription": {"text": "Unused endpoint: POST /briefing/:id/delete"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /briefing/:id/delete` 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-77f5bbbaab8bcfcb", "name": "Unused endpoint: POST /briefing/:id/wiki", "shortDescription": {"text": "Unused endpoint: POST /briefing/:id/wiki"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /briefing/:id/wiki` 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-f7aea729c44bcfc9", "name": "Unused endpoint: POST /briefing/:id/publish", "shortDescription": {"text": "Unused endpoint: POST /briefing/:id/publish"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /briefing/:id/publish` 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-afb2673ba588566e", "name": "Unused endpoint: POST /briefing/:id/unpublish", "shortDescription": {"text": "Unused endpoint: POST /briefing/:id/unpublish"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /briefing/:id/unpublish` 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-a8cc9d823701afa2", "name": "Unused endpoint: GET /briefing/:id/pdf", "shortDescription": {"text": "Unused endpoint: GET /briefing/:id/pdf"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /briefing/:id/pdf` 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-d6a5632bd9131015", "name": "Unused endpoint: POST /formats", "shortDescription": {"text": "Unused endpoint: POST /formats"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /formats` 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-c9fc74b457882121", "name": "Unused endpoint: POST /formats/update", "shortDescription": {"text": "Unused endpoint: POST /formats/update"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /formats/update` 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-3e999ff5649350fe", "name": "Unused endpoint: POST /formats/delete", "shortDescription": {"text": "Unused endpoint: POST /formats/delete"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /formats/delete` 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-b1065b7e0b36bdfd", "name": "Unused endpoint: POST /interests", "shortDescription": {"text": "Unused endpoint: POST /interests"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /interests` 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-d537291f51dee64f", "name": "Unused endpoint: POST /interests/update", "shortDescription": {"text": "Unused endpoint: POST /interests/update"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /interests/update` 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-0858c89f1cc30c53", "name": "Unused endpoint: POST /interests/sync-labels", "shortDescription": {"text": "Unused endpoint: POST /interests/sync-labels"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /interests/sync-labels` 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-370e43fefb2ec9d3", "name": "Unused endpoint: POST /interests/delete", "shortDescription": {"text": "Unused endpoint: POST /interests/delete"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /interests/delete` 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-88b349d943775605", "name": "Unused endpoint: POST /interests/toggle-auto", "shortDescription": {"text": "Unused endpoint: POST /interests/toggle-auto"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /interests/toggle-auto` 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-8cbcdbfd864d06b0", "name": "Unused endpoint: POST /creators/add", "shortDescription": {"text": "Unused endpoint: POST /creators/add"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `POST /creators/add` 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-b4b593d2f532ad9b", "name": "Unused endpoint: GET /creators", "shortDescription": {"text": "Unused endpoint: GET /creators"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /creators` 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-68a14be36b2f727d", "name": "Unused endpoint: GET /creator/:slug", "shortDescription": {"text": "Unused endpoint: GET /creator/:slug"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /creator/:slug` 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-8c3e5f206820be13", "name": "Unused endpoint: GET /creator/:slug/read", "shortDescription": {"text": "Unused endpoint: GET /creator/:slug/read"}, "fullDescription": {"text": "`routes/hub-newsletter.js` declares `GET /creator/:slug/read` 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/19744"}, "properties": {"repository": "SiteITAdmin/mclellan-hub", "repoUrl": "https://github.com/SiteITAdmin/mclellan-hub", "branch": "main"}, "results": [{"ruleId": "scanner-8c3a5885d8a6a2ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:124"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "8c3a5885d8a6a2ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-925668eddbb5fd07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 config/gchat-crm-bot.js:48"}, "properties": {"repobilityId": "7022f8138694b842", "scanner": "scanner-primary", "fingerprint": "925668eddbb5fd07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fe25a4f7cd015ae3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/reminders-synthetic.js:21"}, "properties": {"repobilityId": "48aea05ef6511146", "scanner": "scanner-primary", "fingerprint": "fe25a4f7cd015ae3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18c706814a789d1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/content-reminders-synthetic.js:19"}, "properties": {"repobilityId": "ac3647e7f30cb98a", "scanner": "scanner-primary", "fingerprint": "18c706814a789d1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7dd21dd60c9a5289", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/nudges-synthetic.js:17"}, "properties": {"repobilityId": "3b696f1dfba12263", "scanner": "scanner-primary", "fingerprint": "7dd21dd60c9a5289", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ad1c0c4f581cea9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/suggestions-synthetic.js:19"}, "properties": {"repobilityId": "82e29b34e3d899f6", "scanner": "scanner-primary", "fingerprint": "0ad1c0c4f581cea9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fcc8f30fdbba2ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reset-intelligence.js:99"}, "properties": {"repobilityId": "7844ded708564b32", "scanner": "scanner-primary", "fingerprint": "2fcc8f30fdbba2ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-121aa30382f13208", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-workday-daily-index.js:119"}, "properties": {"repobilityId": "847d67d63d10be4a", "scanner": "scanner-primary", "fingerprint": "121aa30382f13208", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1545a3195529309", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cv.js:167"}, "properties": {"repobilityId": "3ddcbc9bfe15857a", "scanner": "scanner-primary", "fingerprint": "a1545a3195529309", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf8ce273a2f62d2b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-nate-labels.js:79"}, "properties": {"repobilityId": "2d1b619354b2374b", "scanner": "scanner-primary", "fingerprint": "bf8ce273a2f62d2b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec7d20f3670fff2b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ingest-workday.js:6"}, "properties": {"repobilityId": "d97f2d9313ee9283", "scanner": "scanner-primary", "fingerprint": "ec7d20f3670fff2b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23429e83e22adfe7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/init-db.js:153"}, "properties": {"repobilityId": "f4facfaf2dc140cf", "scanner": "scanner-primary", "fingerprint": "23429e83e22adfe7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21fc77c6b517eff3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-email-taxonomy.js:50"}, "properties": {"repobilityId": "c39ed50cb3a34512", "scanner": "scanner-primary", "fingerprint": "21fc77c6b517eff3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-538bf71e62ae6341", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-production-gmail-inbox.js:18"}, "properties": {"repobilityId": "9d3313ac366cda52", "scanner": "scanner-primary", "fingerprint": "538bf71e62ae6341", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b294ad31ea06d925", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/mail-taxonomy-migrate.js:217"}, "properties": {"repobilityId": "c29a708a851692a3", "scanner": "scanner-primary", "fingerprint": "b294ad31ea06d925", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5feb18173e8208c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ingest-boox-drive-notes.js:25"}, "properties": {"repobilityId": "8fcadb5f555f4823", "scanner": "scanner-primary", "fingerprint": "5feb18173e8208c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c9ea67343ada05c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/daily-digest.js:38"}, "properties": {"repobilityId": "0b4493028b5c4424", "scanner": "scanner-primary", "fingerprint": "1c9ea67343ada05c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ba7d1ec52787983", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gmail-taxonomy-finalize.js:239"}, "properties": {"repobilityId": "93051af23e5a9aeb", "scanner": "scanner-primary", "fingerprint": "9ba7d1ec52787983", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa6c51ce5cb4414f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gmail-inbox-restore.js:92"}, "properties": {"repobilityId": "5ccc664998cb32e0", "scanner": "scanner-primary", "fingerprint": "fa6c51ce5cb4414f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90f3d4cc5f792185", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/crm.js:629"}, "properties": {"repobilityId": "01226cc48240a658", "scanner": "scanner-primary", "fingerprint": "90f3d4cc5f792185", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3006a8bdee02f89", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/memory-compactor.js:93"}, "properties": {"repobilityId": "7a6402f4fc4d576f", "scanner": "scanner-primary", "fingerprint": "f3006a8bdee02f89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34050897e0c3e333", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/weekly-digest.js:172"}, "properties": {"repobilityId": "26360bc651309161", "scanner": "scanner-primary", "fingerprint": "34050897e0c3e333", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78b62c9a2846b976", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/agentmail-processor.js:340"}, "properties": {"repobilityId": "583c308951ade90f", "scanner": "scanner-primary", "fingerprint": "78b62c9a2846b976", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4715e69403580835", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/regulatory-monitor.js:226"}, "properties": {"repobilityId": "c230763cf6013329", "scanner": "scanner-primary", "fingerprint": "4715e69403580835", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17550fff2ee0587c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/mycelium.js:494"}, "properties": {"repobilityId": "4e4c977325df8c50", "scanner": "scanner-primary", "fingerprint": "17550fff2ee0587c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-145ec21103a4ac06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/system-report.js:374"}, "properties": {"repobilityId": "65b50abf7e455f9b", "scanner": "scanner-primary", "fingerprint": "145ec21103a4ac06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4216856171bafd98", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/rh-stats.js:162"}, "properties": {"repobilityId": "7524a423cfe2fef0", "scanner": "scanner-primary", "fingerprint": "4216856171bafd98", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-069b886bc2cf3fc2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-chat.js:24"}, "properties": {"repobilityId": "994688c43ee8795e", "scanner": "scanner-primary", "fingerprint": "069b886bc2cf3fc2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77234da026f879e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-tasks.js:53"}, "properties": {"repobilityId": "6a2fb4ab0392dbfd", "scanner": "scanner-primary", "fingerprint": "77234da026f879e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7abf96cbe3485e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/crm-nudges.js:121"}, "properties": {"repobilityId": "51bb6132b979c3f9", "scanner": "scanner-primary", "fingerprint": "c7abf96cbe3485e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5546bc54af05463", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/google-auth.js:101"}, "properties": {"repobilityId": "10041333912b6320", "scanner": "scanner-primary", "fingerprint": "a5546bc54af05463", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b26aabf3c166b6e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/gmail.js:79"}, "properties": {"repobilityId": "29850573a8dbbce4", "scanner": "scanner-primary", "fingerprint": "b26aabf3c166b6e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7f3356233d4a5d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/job-queue.js:127"}, "properties": {"repobilityId": "3f0a213f37a2d90e", "scanner": "scanner-primary", "fingerprint": "c7f3356233d4a5d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4b9c3a03ca9385a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/newsletter-pipeline.js:328"}, "properties": {"repobilityId": "f95b0a96b132f453", "scanner": "scanner-primary", "fingerprint": "d4b9c3a03ca9385a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ddf908aaaf157ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/router.js:85"}, "properties": {"repobilityId": "6836e46e96de06ef", "scanner": "scanner-primary", "fingerprint": "3ddf908aaaf157ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c9c3bf0d3abc04c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/rss-ingest.js:190"}, "properties": {"repobilityId": "5ff8ece3a6b9a6e0", "scanner": "scanner-primary", "fingerprint": "6c9c3bf0d3abc04c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a64d9d41e0e31249", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/email-processor.js:47"}, "properties": {"repobilityId": "4c65c384cf336389", "scanner": "scanner-primary", "fingerprint": "a64d9d41e0e31249", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed49b2ffb44dc685", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/reminders.js:93"}, "properties": {"repobilityId": "fe6929c4d61a3c21", "scanner": "scanner-primary", "fingerprint": "ed49b2ffb44dc685", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-71d895d351925e0a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/suggestion-engine.js:322"}, "properties": {"repobilityId": "f094a09237b7f8d6", "scanner": "scanner-primary", "fingerprint": "71d895d351925e0a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9922fbcf00944056", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/linkedin-pipeline.js:110"}, "properties": {"repobilityId": "7ac0df4ccb61332a", "scanner": "scanner-primary", "fingerprint": "9922fbcf00944056", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-918d99f66bb44536", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-workday.js:67"}, "properties": {"repobilityId": "2a0383f99cd21c80", "scanner": "scanner-primary", "fingerprint": "918d99f66bb44536", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c50c5a7c25fa3b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-debrief.js:252"}, "properties": {"repobilityId": "f65fa1b28fdc7c0c", "scanner": "scanner-primary", "fingerprint": "9c50c5a7c25fa3b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae05884591cb015b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-external.js:32"}, "properties": {"repobilityId": "3f12e1d45960988b", "scanner": "scanner-primary", "fingerprint": "ae05884591cb015b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6d74e5ca4e416a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-linkedin.js:47"}, "properties": {"repobilityId": "7ce1b9a9eb713bfe", "scanner": "scanner-primary", "fingerprint": "c6d74e5ca4e416a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c55acab55370ab13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-admin.js:824"}, "properties": {"repobilityId": "8277fe21ca1f6437", "scanner": "scanner-primary", "fingerprint": "c55acab55370ab13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-260564524eff7f9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-crm.js:256"}, "properties": {"repobilityId": "962c1799b1f7695c", "scanner": "scanner-primary", "fingerprint": "260564524eff7f9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6133895c592739cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/hub-documents.js:152"}, "properties": {"repobilityId": "56965444fb2c7c09", "scanner": "scanner-primary", "fingerprint": "6133895c592739cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-448336d63acff9e5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 public/hub-modern.jsx:787"}, "properties": {"repobilityId": "b0d834ec633eceed", "scanner": "scanner-primary", "fingerprint": "448336d63acff9e5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3d3fadf4ecee8d27", "level": "warning", "message": {"text": "Privileged port 2 in use"}, "properties": {"repobilityId": "755b04866010e843", "scanner": "scanner-primary", "fingerprint": "3d3fadf4ecee8d27", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/install-token-burn-refresh.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-598efefdd6bd409d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/mail-taxonomy-migrate.js:3"}, "properties": {"repobilityId": "db85e89abddfe62b", "scanner": "scanner-primary", "fingerprint": "598efefdd6bd409d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/mail-taxonomy-migrate.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-a840a01ab204b9d4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/ingest-boox-drive-notes.js:6"}, "properties": {"repobilityId": "abf0813463c8b74b", "scanner": "scanner-primary", "fingerprint": "a840a01ab204b9d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/ingest-boox-drive-notes.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-4ea38278a0e86e71", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/markitdown.js:1"}, "properties": {"repobilityId": "68e8f1fe67f3d4a7", "scanner": "scanner-primary", "fingerprint": "4ea38278a0e86e71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/markitdown.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-01d3f71455e40bd0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/workday-ingest.js:3"}, "properties": {"repobilityId": "41dd8469e0561228", "scanner": "scanner-primary", "fingerprint": "01d3f71455e40bd0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/workday-ingest.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-6beaa62d4524fe4b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/system-report.js:3"}, "properties": {"repobilityId": "c4f2f6dfba48e144", "scanner": "scanner-primary", "fingerprint": "6beaa62d4524fe4b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/system-report.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-c0f080605724823e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in token-burn-dashboard/scripts/generate-daily-burn.mjs:1"}, "properties": {"repobilityId": "f6b65e3b036d50e3", "scanner": "scanner-primary", "fingerprint": "c0f080605724823e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "token-burn-dashboard/scripts/generate-daily-burn.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6c6c14fe4f8985e5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-chat.js:59"}, "properties": {"repobilityId": "93a17b4def4386ad", "scanner": "scanner-primary", "fingerprint": "6c6c14fe4f8985e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/hub-chat.js"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-636ca3b439788a46", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/portfolio-chat.js:23"}, "properties": {"repobilityId": "1d15c8b7a5b99e27", "scanner": "scanner-primary", "fingerprint": "636ca3b439788a46", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/portfolio-chat.js"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-21ebb9f5f8280253", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in public/hub-modern.jsx:787"}, "properties": {"repobilityId": "c6773d0ad8f31b97", "scanner": "scanner-primary", "fingerprint": "21ebb9f5f8280253", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/hub-modern.jsx"}, "region": {"startLine": 787}}}]}, {"ruleId": "scanner-53dca773de58bce9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/hub-modern.jsx:65"}, "properties": {"repobilityId": "59d2f19e559916f2", "scanner": "scanner-primary", "fingerprint": "53dca773de58bce9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/hub-modern.jsx"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-e77fc5b22e3df496", "level": "note", "message": {"text": "Very large file: routes/hub-admin.js (1766 lines)"}, "properties": {"repobilityId": "f58910ad803317ff", "scanner": "scanner-primary", "fingerprint": "e77fc5b22e3df496", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e9cd5fdd66f0a7ff", "level": "note", "message": {"text": "Very large file: routes/hub-crm.js (1499 lines)"}, "properties": {"repobilityId": "e9b3b1835f2ac5b7", "scanner": "scanner-primary", "fingerprint": "e9cd5fdd66f0a7ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bbb486a5b37763ef", "level": "note", "message": {"text": "Very large file: public/hub-modern.jsx (2001 lines)"}, "properties": {"repobilityId": "c0baefdbc5ac322f", "scanner": "scanner-primary", "fingerprint": "bbb486a5b37763ef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d004c977d9651238", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "05943c9c6bd180cf", "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": "1ac90c2940746f4a", "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": "36804b7c67cb13ab", "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": "8372023b512a644c", "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": "3a08d76df512005e", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5c7f1f77bd0b0742", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "012d8cfca1595807", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-03849d4b51b0699a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 config/gchat-crm-bot.js:230"}, "properties": {"repobilityId": "9aa6ca80765aca4a", "scanner": "scanner-primary", "fingerprint": "03849d4b51b0699a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e3f0687e0d74cf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/crm.js:160"}, "properties": {"repobilityId": "21aba7760303b750", "scanner": "scanner-primary", "fingerprint": "1e3f0687e0d74cf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-85963314e4de6379", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/task-learning.js:192"}, "properties": {"repobilityId": "6b35a1fda0717869", "scanner": "scanner-primary", "fingerprint": "85963314e4de6379", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea784712337ce331", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/weekly-digest.js:15"}, "properties": {"repobilityId": "cfe3ef17b1789f92", "scanner": "scanner-primary", "fingerprint": "ea784712337ce331", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-435b1e32437a125f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/workday-ingest.js:277"}, "properties": {"repobilityId": "3b60f9e7e324d4eb", "scanner": "scanner-primary", "fingerprint": "435b1e32437a125f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b7708436132cd0c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agentmail-processor.js:145"}, "properties": {"repobilityId": "e7c8c73aca0fdd0e", "scanner": "scanner-primary", "fingerprint": "4b7708436132cd0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e1c763bf8f0bb4b", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/prompts.js:2"}, "properties": {"repobilityId": "0ae77b2529f4dcac", "scanner": "scanner-primary", "fingerprint": "7e1c763bf8f0bb4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9213632eff5b619c", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/wiki-engine.js:159"}, "properties": {"repobilityId": "d32d53e904821385", "scanner": "scanner-primary", "fingerprint": "9213632eff5b619c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9429b4efb732fb2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wiki-engine.js:482"}, "properties": {"repobilityId": "c9f4d45982b2dcb4", "scanner": "scanner-primary", "fingerprint": "b9429b4efb732fb2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-470f820fd77be443", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/regulatory-monitor.js:29"}, "properties": {"repobilityId": "173e6ef5587175fa", "scanner": "scanner-primary", "fingerprint": "470f820fd77be443", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2558c9b4c584793", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/extract.js:99"}, "properties": {"repobilityId": "e44f933c6af42337", "scanner": "scanner-primary", "fingerprint": "f2558c9b4c584793", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75e81b872d6b5eef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/newsletter-pipeline.js:740"}, "properties": {"repobilityId": "d504936d8036f7fa", "scanner": "scanner-primary", "fingerprint": "75e81b872d6b5eef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ebc5afc30d8fab4b", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/router.js:8"}, "properties": {"repobilityId": "f6bfa458936f1f2a", "scanner": "scanner-primary", "fingerprint": "ebc5afc30d8fab4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7e0b3dfb6e71d51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/router.js:112"}, "properties": {"repobilityId": "8fbf9672c6830ade", "scanner": "scanner-primary", "fingerprint": "c7e0b3dfb6e71d51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c73434c991d44f6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email-processor.js:226"}, "properties": {"repobilityId": "1447aee3f1e4d850", "scanner": "scanner-primary", "fingerprint": "c73434c991d44f6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c894ed670b80fd5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/suggestion-engine.js:37"}, "properties": {"repobilityId": "39c84a3ee7530f6e", "scanner": "scanner-primary", "fingerprint": "5c894ed670b80fd5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0339582f963bc55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/linkedin-pipeline.js:514"}, "properties": {"repobilityId": "5e53b5ab16782f57", "scanner": "scanner-primary", "fingerprint": "e0339582f963bc55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5fecec0fd2535d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/wiki.js:502"}, "properties": {"repobilityId": "d882ff436ea704e6", "scanner": "scanner-primary", "fingerprint": "b5fecec0fd2535d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5700c7924c6ced1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-debrief.js:179"}, "properties": {"repobilityId": "dfea0493e315123c", "scanner": "scanner-primary", "fingerprint": "c5700c7924c6ced1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-955a189291ff9f15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-external.js:12"}, "properties": {"repobilityId": "28e6a995c3235fe1", "scanner": "scanner-primary", "fingerprint": "955a189291ff9f15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55b077f0632cc8fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-linkedin.js:118"}, "properties": {"repobilityId": "5e3ef196c25bf273", "scanner": "scanner-primary", "fingerprint": "55b077f0632cc8fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d973ffb56e538abe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 routes/hub-admin.js:1177"}, "properties": {"repobilityId": "241e79490b9474f2", "scanner": "scanner-primary", "fingerprint": "d973ffb56e538abe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35f5a72b99122d38", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/hub.js:833"}, "properties": {"repobilityId": "29fc2a404a814f16", "scanner": "scanner-primary", "fingerprint": "35f5a72b99122d38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-440ebcc43ca14ad4", "level": "none", "message": {"text": "Commented-code block (7 lines) in public/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "bc396f9adcdec090", "scanner": "scanner-primary", "fingerprint": "440ebcc43ca14ad4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38cdcb556ec811f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-chat.js:486"}, "properties": {"repobilityId": "da9835847cc70d82", "scanner": "scanner-primary", "fingerprint": "38cdcb556ec811f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82e3e4bda5bbbb7e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/portfolio-chat.js:102"}, "properties": {"repobilityId": "903049202d3adeb8", "scanner": "scanner-primary", "fingerprint": "82e3e4bda5bbbb7e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c927a9438936df15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/hub-modern.jsx:452"}, "properties": {"repobilityId": "bfd28e69267aa7ac", "scanner": "scanner-primary", "fingerprint": "c927a9438936df15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f45a82cc48e9df9", "level": "note", "message": {"text": "44 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "589836c35e9d9c49", "scanner": "scanner-primary", "fingerprint": "3f45a82cc48e9df9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-ed48b41c5af7d534", "level": "error", "message": {"text": "Dangling fetch: GET https://example.invalid (test/fetch.test.js:15)"}, "properties": {"repobilityId": "104a8905cd04fb1b", "scanner": "scanner-primary", "fingerprint": "ed48b41c5af7d534", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b6c9c52cfd467a4", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/daily-digest.js:128)"}, "properties": {"repobilityId": "54b9df03c2ab64a4", "scanner": "scanner-primary", "fingerprint": "6b6c9c52cfd467a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-727bead25da650c5", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/crm.js:160)"}, "properties": {"repobilityId": "03099810fc09d190", "scanner": "scanner-primary", "fingerprint": "727bead25da650c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-44ed74828a4ddb69", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/task-learning.js:192)"}, "properties": {"repobilityId": "38c65958a1a4052d", "scanner": "scanner-primary", "fingerprint": "44ed74828a4ddb69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-224102323907770c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (lib/workday-ingest.js:244)"}, "properties": {"repobilityId": "9f1aa53f34519981", "scanner": "scanner-primary", "fingerprint": "224102323907770c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68e2e7dd9e9d41ec", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/audio/transcriptions (lib/workday-ingest.js:277)"}, "properties": {"repobilityId": "626d473545935c90", "scanner": "scanner-primary", "fingerprint": "68e2e7dd9e9d41ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02006b54fb64cae2", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/agentmail-processor.js:145)"}, "properties": {"repobilityId": "262a9a565b2fd5a9", "scanner": "scanner-primary", "fingerprint": "02006b54fb64cae2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2ec7dfd4e6f2b46", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:482)"}, "properties": {"repobilityId": "3586b08472bca08e", "scanner": "scanner-primary", "fingerprint": "a2ec7dfd4e6f2b46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a44138e4700abb70", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:524)"}, "properties": {"repobilityId": "c94426f5eb40652b", "scanner": "scanner-primary", "fingerprint": "a44138e4700abb70", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-80f81f27f86543bd", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/wiki-engine.js:547)"}, "properties": {"repobilityId": "eff339e282374b98", "scanner": "scanner-primary", "fingerprint": "80f81f27f86543bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-456f57cf0918d261", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/mycelium.js:175)"}, "properties": {"repobilityId": "22a2f685d5f54e05", "scanner": "scanner-primary", "fingerprint": "456f57cf0918d261", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f413f18a9faaa139", "level": "error", "message": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${f.flight_number}/${f.flight_date}?withAircraftImage=false&withLocation=false (lib/job-queue.js:133)"}, "properties": {"repobilityId": "58396995e69dab67", "scanner": "scanner-primary", "fingerprint": "f413f18a9faaa139", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-575cc2094030b000", "level": "error", "message": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false (lib/job-queue.js:245)"}, "properties": {"repobilityId": "7465e29d81b7b645", "scanner": "scanner-primary", "fingerprint": "575cc2094030b000", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c67600fc95d6126", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:396)"}, "properties": {"repobilityId": "0e09d4f6e87ce9b7", "scanner": "scanner-primary", "fingerprint": "1c67600fc95d6126", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d274135309149d16", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:636)"}, "properties": {"repobilityId": "1d1de695e9cf4084", "scanner": "scanner-primary", "fingerprint": "d274135309149d16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f85eb98b188ed2b4", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:740)"}, "properties": {"repobilityId": "3a3318088cf4fc60", "scanner": "scanner-primary", "fingerprint": "f85eb98b188ed2b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f508ddcebff33072", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/newsletter-pipeline.js:1149)"}, "properties": {"repobilityId": "9c1f085eada81577", "scanner": "scanner-primary", "fingerprint": "f508ddcebff33072", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a5baf6ea907945a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.exa.ai/search (lib/router.js:66)"}, "properties": {"repobilityId": "66d68b08eb3569f4", "scanner": "scanner-primary", "fingerprint": "8a5baf6ea907945a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f090682a654a62a5", "level": "error", "message": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=5 (lib/router.js:105)"}, "properties": {"repobilityId": "85a6dd0bdc6db625", "scanner": "scanner-primary", "fingerprint": "f090682a654a62a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e52b96c545f5e278", "level": "error", "message": {"text": "Dangling fetch: POST https://api.tavily.com/search (lib/router.js:112)"}, "properties": {"repobilityId": "39b319e174f12d45", "scanner": "scanner-primary", "fingerprint": "e52b96c545f5e278", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71cc82af4c9a35e5", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:161)"}, "properties": {"repobilityId": "07c1f5ba2a1d8c17", "scanner": "scanner-primary", "fingerprint": "71cc82af4c9a35e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bad81eca5c29bdb1", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:350)"}, "properties": {"repobilityId": "55754dbf269376fe", "scanner": "scanner-primary", "fingerprint": "bad81eca5c29bdb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68d8423c58bce5c8", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/router.js:460)"}, "properties": {"repobilityId": "52aadfee52c480e0", "scanner": "scanner-primary", "fingerprint": "68d8423c58bce5c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3394c0e5fb2518c4", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${process.env.GOOGLE_AI_API_KEY} (lib/router.js:491)"}, "properties": {"repobilityId": "e250690efa35bde7", "scanner": "scanner-primary", "fingerprint": "3394c0e5fb2518c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d39d9638b3b34202", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (lib/email-processor.js:226)"}, "properties": {"repobilityId": "fbfc995ceb7c0d26", "scanner": "scanner-primary", "fingerprint": "d39d9638b3b34202", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc99633de72f2e21", "level": "error", "message": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:117)"}, "properties": {"repobilityId": "f3a31962cb0420ed", "scanner": "scanner-primary", "fingerprint": "cc99633de72f2e21", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2f3b1a5c7331a9d", "level": "error", "message": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(q)}&count=5&freshness=pm (lib/linkedin-pipeline.js:174)"}, "properties": {"repobilityId": "a557d69d204dc2bf", "scanner": "scanner-primary", "fingerprint": "d2f3b1a5c7331a9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5cb7b14b2102a6f7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (lib/linkedin-pipeline.js:192)"}, "properties": {"repobilityId": "c1939e308fbdc873", "scanner": "scanner-primary", "fingerprint": "5cb7b14b2102a6f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2629f632a3fc2d92", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContent?key=${key} (lib/linkedin-pipeline.js:514)"}, "properties": {"repobilityId": "28d4a5734a454bbf", "scanner": "scanner-primary", "fingerprint": "2629f632a3fc2d92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9fb3883b56c3b8a5", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/wiki.js:502)"}, "properties": {"repobilityId": "08c75b25e1f1b8c7", "scanner": "scanner-primary", "fingerprint": "9fb3883b56c3b8a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-635262b719f7d324", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:55)"}, "properties": {"repobilityId": "06898089c8d95e57", "scanner": "scanner-primary", "fingerprint": "635262b719f7d324", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7f638f37b44201f5", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-debrief.js:179)"}, "properties": {"repobilityId": "3ef0439703f7786f", "scanner": "scanner-primary", "fingerprint": "7f638f37b44201f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad0dfff10b763768", "level": "error", "message": {"text": "Dangling fetch: GET https://api.search.brave.com/res/v1/web/search?q=bbc.com%2Fnews+top+stories+today&count=8&freshness=pd (routes/hub-admin.js:840)"}, "properties": {"repobilityId": "7e3f968833584431", "scanner": "scanner-primary", "fingerprint": "ad0dfff10b763768", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b918c7d0bef7eee", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:862)"}, "properties": {"repobilityId": "12af370b475877f0", "scanner": "scanner-primary", "fingerprint": "3b918c7d0bef7eee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-067f5c6102e37e0d", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1120)"}, "properties": {"repobilityId": "aecf5ffc7755553e", "scanner": "scanner-primary", "fingerprint": "067f5c6102e37e0d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f76bcdb53396f25", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1177)"}, "properties": {"repobilityId": "62a9d04a888f8e26", "scanner": "scanner-primary", "fingerprint": "1f76bcdb53396f25", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37339bf91737aed6", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-admin.js:1229)"}, "properties": {"repobilityId": "e7012f27a6dd5212", "scanner": "scanner-primary", "fingerprint": "37339bf91737aed6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ac0dcf4071695910", "level": "error", "message": {"text": "Dangling fetch: GET https://openrouter.ai/api/v1/models (routes/hub-admin.js:1450)"}, "properties": {"repobilityId": "e61f02b7ae83aab8", "scanner": "scanner-primary", "fingerprint": "ac0dcf4071695910", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6557fb75dcbb4f72", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/service_accounts/v1/metadata/x509/${encodeURIComponent(chatIssuer)} (routes/hub-crm.js:105)"}, "properties": {"repobilityId": "75405d421a6c5e2b", "scanner": "scanner-primary", "fingerprint": "6557fb75dcbb4f72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d8065a8c149d8a0f", "level": "error", "message": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/flights/number/${flightNumber}/${flightDate}?withAircraftImage=false&withLocation=false (routes/hub-flights.js:360)"}, "properties": {"repobilityId": "8bacb3ab8da743bc", "scanner": "scanner-primary", "fingerprint": "d8065a8c149d8a0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2b0a8d7ff9796e0", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (routes/hub-documents.js:109)"}, "properties": {"repobilityId": "40cdfd914035e026", "scanner": "scanner-primary", "fingerprint": "f2b0a8d7ff9796e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-364aa8299628fdb7", "level": "error", "message": {"text": "Dangling fetch: POST /api/journal/audio/session (public/hub-modern.jsx:1042)"}, "properties": {"repobilityId": "f09f86edba3ca20c", "scanner": "scanner-primary", "fingerprint": "364aa8299628fdb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a4dfcad3eb1618a", "level": "note", "message": {"text": "Unused endpoint: GET /login"}, "properties": {"repobilityId": "b05b22a3bf2f50c3", "scanner": "scanner-primary", "fingerprint": "6a4dfcad3eb1618a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e9f0c712241895d", "level": "note", "message": {"text": "Unused endpoint: GET /auth/google"}, "properties": {"repobilityId": "dd5eda181917a41b", "scanner": "scanner-primary", "fingerprint": "2e9f0c712241895d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-392dcbd9c0e4ed85", "level": "note", "message": {"text": "Unused endpoint: GET /auth/google/callback"}, "properties": {"repobilityId": "a8a35cadf22d16a1", "scanner": "scanner-primary", "fingerprint": "392dcbd9c0e4ed85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "4fa52fa53c792b3b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f267debbf8ae8442", "level": "note", "message": {"text": "Unused endpoint: GET /browse"}, "properties": {"repobilityId": "dd0b66c3ee5170c7", "scanner": "scanner-primary", "fingerprint": "f267debbf8ae8442", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ddf120b2be0c04e5", "level": "note", "message": {"text": "Unused endpoint: GET /page/new"}, "properties": {"repobilityId": "6befc528b11ea5a8", "scanner": "scanner-primary", "fingerprint": "ddf120b2be0c04e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d0be7d96ca3472e", "level": "note", "message": {"text": "Unused endpoint: POST /page/new"}, "properties": {"repobilityId": "ec16aa0db8625774", "scanner": "scanner-primary", "fingerprint": "6d0be7d96ca3472e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db806f8188116c5f", "level": "note", "message": {"text": "Unused endpoint: GET /page/:slug"}, "properties": {"repobilityId": "734e950e3c5506de", "scanner": "scanner-primary", "fingerprint": "db806f8188116c5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-902f9cc248e6089f", "level": "note", "message": {"text": "Unused endpoint: GET /page/:slug/edit"}, "properties": {"repobilityId": "9d25f9ebb064eba8", "scanner": "scanner-primary", "fingerprint": "902f9cc248e6089f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c9f09d07807e112", "level": "note", "message": {"text": "Unused endpoint: POST /page/:slug/save"}, "properties": {"repobilityId": "3cc9e922b8151573", "scanner": "scanner-primary", "fingerprint": "0c9f09d07807e112", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e7b9297cbaa42f2", "level": "note", "message": {"text": "Unused endpoint: POST /page/:slug/rename"}, "properties": {"repobilityId": "7b703c953113b4ff", "scanner": "scanner-primary", "fingerprint": "6e7b9297cbaa42f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fee7a014a2051763", "level": "note", "message": {"text": "Unused endpoint: POST /page/:slug/delete"}, "properties": {"repobilityId": "3acdb859df70dc85", "scanner": "scanner-primary", "fingerprint": "fee7a014a2051763", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-006745bcd17bb697", "level": "note", "message": {"text": "Unused endpoint: GET /source/*/edit"}, "properties": {"repobilityId": "67b777fbc940879d", "scanner": "scanner-primary", "fingerprint": "006745bcd17bb697", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a961f47fda4ce126", "level": "note", "message": {"text": "Unused endpoint: POST /source/*/save"}, "properties": {"repobilityId": "cb286282931151a7", "scanner": "scanner-primary", "fingerprint": "a961f47fda4ce126", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-079b330c5fbd22a8", "level": "note", "message": {"text": "Unused endpoint: GET /source/*"}, "properties": {"repobilityId": "8e16e3e52b58b954", "scanner": "scanner-primary", "fingerprint": "079b330c5fbd22a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41f0cbf3099517aa", "level": "note", "message": {"text": "Unused endpoint: GET /orphans"}, "properties": {"repobilityId": "0579d61eb8fbe6d9", "scanner": "scanner-primary", "fingerprint": "41f0cbf3099517aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c0ac2ef565a5459b", "level": "note", "message": {"text": "Unused endpoint: GET /graph"}, "properties": {"repobilityId": "54279b8aad432380", "scanner": "scanner-primary", "fingerprint": "c0ac2ef565a5459b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f40eecb3c68cc76", "level": "note", "message": {"text": "Unused endpoint: GET /ingest"}, "properties": {"repobilityId": "389c4c6846fb5017", "scanner": "scanner-primary", "fingerprint": "1f40eecb3c68cc76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c7e515dec17aeb9", "level": "note", "message": {"text": "Unused endpoint: POST /api/ingest/url"}, "properties": {"repobilityId": "f75b730c8e7a56f0", "scanner": "scanner-primary", "fingerprint": "0c7e515dec17aeb9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2205760646975fb8", "level": "note", "message": {"text": "Unused endpoint: GET /api/search"}, "properties": {"repobilityId": "368bba4f07401c8e", "scanner": "scanner-primary", "fingerprint": "2205760646975fb8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9185678549c1ef6d", "level": "note", "message": {"text": "Unused endpoint: GET /api/graph"}, "properties": {"repobilityId": "0ee85e66c8af0b54", "scanner": "scanner-primary", "fingerprint": "9185678549c1ef6d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-444a455bc838ffb3", "level": "note", "message": {"text": "Unused endpoint: POST /api/graph/link"}, "properties": {"repobilityId": "e7f96442bfdf0c0e", "scanner": "scanner-primary", "fingerprint": "444a455bc838ffb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-63538a9d4c00c92f", "level": "note", "message": {"text": "Unused endpoint: POST /api/graph/unlink"}, "properties": {"repobilityId": "7e6a051929895b1f", "scanner": "scanner-primary", "fingerprint": "63538a9d4c00c92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab2c628ca8baa6a5", "level": "note", "message": {"text": "Unused endpoint: POST /topics/toggle"}, "properties": {"repobilityId": "8420bf7347713859", "scanner": "scanner-primary", "fingerprint": "ab2c628ca8baa6a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50aa099d2349b661", "level": "note", "message": {"text": "Unused endpoint: POST /topics/toggle-week"}, "properties": {"repobilityId": "d97d7407bbbe4bfe", "scanner": "scanner-primary", "fingerprint": "50aa099d2349b661", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18432bdcc08acbb6", "level": "note", "message": {"text": "Unused endpoint: POST /sources/:id/priority"}, "properties": {"repobilityId": "324b0c8f05b3e3cb", "scanner": "scanner-primary", "fingerprint": "18432bdcc08acbb6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f411d404a63ca44", "level": "note", "message": {"text": "Unused endpoint: GET /gmail-labels"}, "properties": {"repobilityId": "a153f881b586d49d", "scanner": "scanner-primary", "fingerprint": "1f411d404a63ca44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7703e292f068ddb", "level": "note", "message": {"text": "Unused endpoint: POST /backfill"}, "properties": {"repobilityId": "6fc6d266e7e1a869", "scanner": "scanner-primary", "fingerprint": "a7703e292f068ddb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "4734995cf207850b", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cccfe89f81ab208f", "level": "note", "message": {"text": "Unused endpoint: POST /preview"}, "properties": {"repobilityId": "bc6e8be6e0052c46", "scanner": "scanner-primary", "fingerprint": "cccfe89f81ab208f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef1d19290055204a", "level": "note", "message": {"text": "Unused endpoint: GET /generate/:jobId"}, "properties": {"repobilityId": "3fbfada7989661e7", "scanner": "scanner-primary", "fingerprint": "ef1d19290055204a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f222a275ed687b3", "level": "note", "message": {"text": "Unused endpoint: POST /send"}, "properties": {"repobilityId": "a73cb7daeb9d4ba0", "scanner": "scanner-primary", "fingerprint": "2f222a275ed687b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-abfa0827756df7cb", "level": "note", "message": {"text": "Unused endpoint: GET /briefing/:id"}, "properties": {"repobilityId": "dbe811b8be935ec3", "scanner": "scanner-primary", "fingerprint": "abfa0827756df7cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed0ee85778c4b816", "level": "note", "message": {"text": "Unused endpoint: POST /briefing/:id/delete"}, "properties": {"repobilityId": "0db4bfa71cfbcef6", "scanner": "scanner-primary", "fingerprint": "ed0ee85778c4b816", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77f5bbbaab8bcfcb", "level": "note", "message": {"text": "Unused endpoint: POST /briefing/:id/wiki"}, "properties": {"repobilityId": "cfe20f7c4e280633", "scanner": "scanner-primary", "fingerprint": "77f5bbbaab8bcfcb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7aea729c44bcfc9", "level": "note", "message": {"text": "Unused endpoint: POST /briefing/:id/publish"}, "properties": {"repobilityId": "917e6e858a86b493", "scanner": "scanner-primary", "fingerprint": "f7aea729c44bcfc9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afb2673ba588566e", "level": "note", "message": {"text": "Unused endpoint: POST /briefing/:id/unpublish"}, "properties": {"repobilityId": "efc65a6e9dab9424", "scanner": "scanner-primary", "fingerprint": "afb2673ba588566e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8cc9d823701afa2", "level": "note", "message": {"text": "Unused endpoint: GET /briefing/:id/pdf"}, "properties": {"repobilityId": "874e196e9480bbdb", "scanner": "scanner-primary", "fingerprint": "a8cc9d823701afa2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6a5632bd9131015", "level": "note", "message": {"text": "Unused endpoint: POST /formats"}, "properties": {"repobilityId": "c81775448afbc0ca", "scanner": "scanner-primary", "fingerprint": "d6a5632bd9131015", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9fc74b457882121", "level": "note", "message": {"text": "Unused endpoint: POST /formats/update"}, "properties": {"repobilityId": "4709a9ff8d356bdc", "scanner": "scanner-primary", "fingerprint": "c9fc74b457882121", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e999ff5649350fe", "level": "note", "message": {"text": "Unused endpoint: POST /formats/delete"}, "properties": {"repobilityId": "affd405409c1d784", "scanner": "scanner-primary", "fingerprint": "3e999ff5649350fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b1065b7e0b36bdfd", "level": "note", "message": {"text": "Unused endpoint: POST /interests"}, "properties": {"repobilityId": "b7a076add3572254", "scanner": "scanner-primary", "fingerprint": "b1065b7e0b36bdfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d537291f51dee64f", "level": "note", "message": {"text": "Unused endpoint: POST /interests/update"}, "properties": {"repobilityId": "c9a31d0c9dd79ad1", "scanner": "scanner-primary", "fingerprint": "d537291f51dee64f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0858c89f1cc30c53", "level": "note", "message": {"text": "Unused endpoint: POST /interests/sync-labels"}, "properties": {"repobilityId": "f9f46f2841db8ed3", "scanner": "scanner-primary", "fingerprint": "0858c89f1cc30c53", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-370e43fefb2ec9d3", "level": "note", "message": {"text": "Unused endpoint: POST /interests/delete"}, "properties": {"repobilityId": "79879cb4989c2339", "scanner": "scanner-primary", "fingerprint": "370e43fefb2ec9d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-88b349d943775605", "level": "note", "message": {"text": "Unused endpoint: POST /interests/toggle-auto"}, "properties": {"repobilityId": "1095683f43386ea1", "scanner": "scanner-primary", "fingerprint": "88b349d943775605", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cbcdbfd864d06b0", "level": "note", "message": {"text": "Unused endpoint: POST /creators/add"}, "properties": {"repobilityId": "2d91c35902c3a654", "scanner": "scanner-primary", "fingerprint": "8cbcdbfd864d06b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4b593d2f532ad9b", "level": "note", "message": {"text": "Unused endpoint: GET /creators"}, "properties": {"repobilityId": "7df7363532dba276", "scanner": "scanner-primary", "fingerprint": "b4b593d2f532ad9b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a14be36b2f727d", "level": "note", "message": {"text": "Unused endpoint: GET /creator/:slug"}, "properties": {"repobilityId": "55971b00b7f4a06f", "scanner": "scanner-primary", "fingerprint": "68a14be36b2f727d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c3e5f206820be13", "level": "note", "message": {"text": "Unused endpoint: GET /creator/:slug/read"}, "properties": {"repobilityId": "4282dfb09f175129", "scanner": "scanner-primary", "fingerprint": "8c3e5f206820be13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}