{"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-02ac5f29205133b1", "name": "File has no detected symbols: scripts/tmp-validate-analyze.py", "shortDescription": {"text": "File has no detected symbols: scripts/tmp-validate-analyze.py"}, "fullDescription": {"text": "Source file with no class/function declarations \u2014 possible config, dead code, or scratch file."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7249d5cce5de9ca", "name": "File has no detected symbols: scripts/tmp-validate-preflight.py", "shortDescription": {"text": "File has no detected symbols: scripts/tmp-validate-preflight.py"}, "fullDescription": {"text": "Source file with no class/function declarations \u2014 possible config, dead code, or scratch file."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-068cee56eb991cd8", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.test.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.test.ts:40"}, "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-96a21abfb100b34f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.ts:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8392018eb0eaed8c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/test-budget.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/test-budget.ts:10"}, "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-ce892dfff431f560", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/hydrogen-smoke.test.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/hydrogen-smoke.test.ts:45"}, "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-75451893ffc528b3", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/claimboundary-integration.test.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/claimboundary-integration.test.ts:174"}, "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-90e06a3d8e7dacbb", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/unit/lib/input-neutrality.test.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/unit/lib/input-neutrality.test.ts:160"}, "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-8f0ab40219ef34f3", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/scripts/regression-test.js:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/scripts/regression-test.js:145"}, "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-8981790b6b973138", "name": "Stray `console.log` in TS/JS \u2014 apps/web/test/calibration/framing-symmetry.test.ts:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/calibration/framing-symmetry.test.ts:150"}, "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-ad0328e86103545b", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/run-paired-audit.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/run-paired-audit.ts:34"}, "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-bf0f06c4c6b714ef", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/baseline-runner.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/baseline-runner.js:14"}, "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-82b23de90b6b02d2", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-bias-reports.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-bias-reports.ts:31"}, "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-4b00aca7ee5beba9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/validate-calibration-telemetry.ts:326", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/validate-calibration-telemetry.ts:326"}, "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-61c990d42f6d517f", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/migrate-env-to-db.ts:235", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/migrate-env-to-db.ts:235"}, "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-d26c6ff1ffa50d8f", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/refresh-bias-report-html.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/refresh-bias-report-html.ts:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3311226a2d72303c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-text-analysis-prompts.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-text-analysis-prompts.ts:23"}, "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-277490210ed60f56", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-all-prompts.ts:210", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-all-prompts.ts:210"}, "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-ac1668aec7956d59", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/ab-runner.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/ab-runner.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-8053b587ce477dda", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/source-reliability-cache.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/source-reliability-cache.ts:84"}, "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-a4ed7c6bbc92358f", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-brave.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-brave.ts:26"}, "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-4394306e4e21ceae", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-loader.ts:235", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-loader.ts:235"}, "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-787c17ca444c19b5", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/web-search.ts:239", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/web-search.ts: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-26af3b50ec9e2657", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-provider-utils.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-provider-utils.ts:44"}, "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-f8528899e8034c92", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-storage.ts:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-storage.ts: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-ff2419614ae159cd", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/input-policy-gate.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/input-policy-gate.ts:149"}, "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-7db11ad86ea689c3", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-health.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-health.ts: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-a55e4250d390301c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-factcheck-api.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-factcheck-api.ts:39"}, "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-1f892a804d9c7beb", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/fact-checker-service.ts:159", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/fact-checker-service.ts:159"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84edc4f9f7b04806", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-google-cse.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-google-cse.ts: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-d37ce30abc5e5ab2", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-semanticscholar.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-semanticscholar.ts:61"}, "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-150204b7723734bb", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-wikipedia.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-wikipedia.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9e649aa24b85d1c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/retrieval.ts:295", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/retrieval.ts:295"}, "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-54cedc1023e1acb5", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serpapi.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serpapi.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97f15c002a23c9ff", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/internal-runner-queue.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/internal-runner-queue.ts:126"}, "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-f2377e26945e53c0", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-circuit-breaker.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-circuit-breaker.ts:108"}, "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-9d0b401a21a74c7c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-webhook.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-webhook.ts:56"}, "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-469fdaecb6b5db57", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-cache.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-cache.ts:81"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e07ae9c27fb5739a", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serper.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serper.ts: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-305355283187a061", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/model-tiering.ts:343", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/model-tiering.ts:343"}, "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-d06c6885c3b420f3", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/evidence-deduplication.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/evidence-deduplication.ts:76"}, "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-8e1066834ab31a35", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/debug.ts:155", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/debug.ts:155"}, "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-af1fc43cd600c0a6", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claim-extraction-stage.ts:3228", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claim-extraction-stage.ts:3228"}, "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-416305096befeac7", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/quality-gates.ts:230", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/quality-gates.ts:230"}, "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-d19ec9687dd7e89d", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/source-reliability.ts:200", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/source-reliability.ts:200"}, "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-056b23910207d270", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:1550", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:1550"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc8bddbdb92b7404", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:630", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:630"}, "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-19bc6f4af17f873e", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/source-reliability-calibration.ts:125", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/source-reliability-calibration.ts:125"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0fe44345e09dae9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/llm.ts:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/llm.ts:183"}, "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-cf30f2a85d695c63", "name": "Stray `console.log` in TS/JS \u2014 scripts/promptfoo-sr.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/promptfoo-sr.js:49"}, "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-b98774d2a4abc900", "name": "Stray `console.log` in TS/JS \u2014 scripts/sr-cache-flush.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sr-cache-flush.ts:8"}, "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-70c305b3c1c230c6", "name": "Stray `console.log` in TS/JS \u2014 scripts/patch-report-verdicts.ts:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-report-verdicts.ts:166"}, "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-61bd5d2fee5e0cfe", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-validation-matrix.js:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-validation-matrix.js:136"}, "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-9e4d7e6569a6ddc4", "name": "Stray `console.log` in TS/JS \u2014 scripts/measure-evidence-quality.ts:234", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/measure-evidence-quality.ts:234"}, "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-8e9a2a4a71ca2830", "name": "Stray `console.log` in TS/JS \u2014 scripts/measure-report-quality.ts:1838", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/measure-report-quality.ts:1838"}, "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-09fbcf4fc569916d", "name": "Stray `console.log` in TS/JS \u2014 scripts/validation/compare-batches.js:171", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validation/compare-batches.js:171"}, "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-9c977169e6c6ad9d", "name": "Stray `console.log` in TS/JS \u2014 scripts/validation/extract-validation-summary.js:300", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validation/extract-validation-summary.js:300"}, "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-a91b3dd3b8c84b23", "name": "Insecure pattern 'node_child_process' in apps/web/scripts/run-calibration-lane.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/scripts/run-calibration-lane.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af734a9dc6dafe72", "name": "Insecure pattern 'domparser_html_parse' in apps/web/src/app/jobs/[id]/page.tsx:2510", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in apps/web/src/app/jobs/[id]/page.tsx:2510"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c3bf69b04ce339b4", "name": "Insecure pattern 'node_child_process' in apps/web/src/lib/build-info.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/src/lib/build-info.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-455ca2d19ff9d8b5", "name": "Insecure pattern 'cors_wildcard' in apps/web/src/lib/search-wikipedia.ts:36", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/web/src/lib/search-wikipedia.ts:36"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-546960ebbb6f0dba", "name": "Insecure pattern 'node_child_process' in scripts/promptfoo-sr.js:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/promptfoo-sr.js:18"}, "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-00076a617dbf80ed", "name": "Insecure pattern 'node_child_process' in scripts/monthly-prune-handoffs.mjs:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/monthly-prune-handoffs.mjs:16"}, "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-9332d559dcb4bed3", "name": "Insecure pattern 'node_child_process' in scripts/measure-report-quality.ts:21", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/measure-report-quality.ts:21"}, "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-959c327f2140335e", "name": "Insecure pattern 'node_child_process' in scripts/diag/best-commit-phase1.cjs:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/best-commit-phase1.cjs:10"}, "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-38f853a9f2a10f17", "name": "Insecure pattern 'node_child_process' in scripts/diag/quality-branch-membership.cjs:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/quality-branch-membership.cjs:16"}, "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-73c5ffb28bf3b32f", "name": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-drift-sizing.cjs:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-drift-sizing.cjs: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-ab5cb1e8e5d4be5f", "name": "Insecure pattern 'node_child_process' in scripts/diag/partisan-contradiction-census.cjs:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/partisan-contradiction-census.cjs:7"}, "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-3459117b6ee53374", "name": "Insecure pattern 'node_child_process' in scripts/diag/bolsonaro-ac03-evidence.cjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/bolsonaro-ac03-evidence.cjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15b5ebe87e85593e", "name": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-analysis-equiv.cjs:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-analysis-equiv.cjs:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d18f610991fc13c", "name": "Insecure pattern 'node_child_process' in scripts/diag/pv2-probe.cjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/pv2-probe.cjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27442f74064b6533", "name": "Insecure pattern 'node_child_process' in scripts/diag/plastic-ac-extract.cjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/plastic-ac-extract.cjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42fb17e83a166da7", "name": "Insecure pattern 'node_child_process' in scripts/diag/compare-evidence-pools.cjs:23", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/compare-evidence-pools.cjs:23"}, "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-81e3bce264ecf5cd", "name": "Insecure pattern 'node_child_process' in scripts/diag/quality-timeseries.cjs:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/quality-timeseries.cjs:16"}, "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-c037982c19e0b370", "name": "Insecure pattern 'node_child_process' in scripts/diag/verdict-direction-instability.cjs:29", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/verdict-direction-instability.cjs:29"}, "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-ba55f123a3842bfc", "name": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-weekly-trend.cjs:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-weekly-trend.cjs:7"}, "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-112b2da3ee2f155c", "name": "Insecure pattern 'node_child_process' in scripts/diag/verdict-stability-batch.cjs:31", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/verdict-stability-batch.cjs:31"}, "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-91cefcef40b01183", "name": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-domain-breakdown.cjs:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-domain-breakdown.cjs: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-38f9186736f7aa08", "name": "Insecure pattern 'node_child_process' in scripts/diag/reason-coded-failure-census.cjs:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/reason-coded-failure-census.cjs:12"}, "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-88bbce5f3cc6f68c", "name": "Insecure pattern 'node_child_process' in scripts/diag/report-damaged-drill.cjs:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/report-damaged-drill.cjs: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-768522610a95a168", "name": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-era-check.cjs:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-era-check.cjs:10"}, "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-58bcb881c8559a6c", "name": "Insecure pattern 'node_child_process' in scripts/diag/inputs-used.cjs:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/inputs-used.cjs:4"}, "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-abc989931a7d4080", "name": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-drill.cjs:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-drill.cjs:12"}, "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-189161e4d2cd0468", "name": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-census.cjs:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-census.cjs:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d938833040d1736", "name": "Insecure pattern 'node_child_process' in scripts/diag/contract-abort-drill.cjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/diag/contract-abort-drill.cjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d67f4fe77316440f", "name": "Insecure pattern 'node_child_process' in scripts/agents/invoke-claude.cjs:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/agents/invoke-claude.cjs: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-3742094c7f69d04d", "name": "Insecure pattern 'node_child_process' in scripts/hooks/rebuild-index-on-change.cjs:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/rebuild-index-on-change.cjs:22"}, "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-4037c3423be540d0", "name": "Insecure pattern 'node_child_process' in scripts/hooks/failed-verifier-nudge.cjs:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/failed-verifier-nudge.cjs:18"}, "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-060761958a04af70", "name": "Insecure pattern 'node_child_process' in packages/fh-agent-knowledge/src/utils/fs.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packages/fh-agent-knowledge/src/utils/fs.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d47e760435c2774", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/plastic-en/v0.1/SRC_UNEP_TURN", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/plastic-en/v0.1/SRC_UNEP_TURNING_OFF_TAP_2023.html:3422"}, "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-8ced2d696e78c4c1", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-wwii-de/v0.1/SRC_BAR_U", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-wwii-de/v0.1/SRC_BAR_UMSTRITTENE_FLUECHTLINGSPOLITIK_20191028.html:103"}, "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-0730378a61461865", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_SENTENCE_APPEAL_20251028.html:16943"}, "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-18f1401df6677ee0", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_CONVICTION_SENTENCE_20250911.html:17637"}, "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-844f8a40efb928f8", "name": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_OAS_ACHR_ART8.ht", "shortDescription": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_OAS_ACHR_ART8.html:97"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78277ea0a2124096", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_APRIL_2026_PAGE.html:85"}, "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-c9728b64a2db18df", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_MAIN_20260430.html:89"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3bd8584ba5cc44e", "name": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPOR", "shortDescription": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html:70"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aed6efb85c36066f", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDR", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html:39"}, "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-756bd15078ed7ad8", "name": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_CO", "shortDescription": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html:70"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9d6212cb9641bfd", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html:39"}, "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-7af8d946d8735428", "name": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROL", "shortDescription": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html:70"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-434e44fa30d7592e", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDR", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html:39"}, "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-2765e39bc686e9db", "name": "Insecure pattern 'cors_wildcard' in Docs/xwiki-pages/analytics/worker.js:16", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in Docs/xwiki-pages/analytics/worker.js:16"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a13e662ebad3fdd", "name": "Insecure pattern 'direct_innerhtml_assignment' in Docs/xwiki-pages/viewer-impl/xwiki-viewer.html:1082", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/xwiki-pages/viewer-impl/xwiki-viewer.html:1082"}, "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-c25f39927176b600", "name": "Insecure pattern 'direct_innerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:316", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:316"}, "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-259dff7d227b23e4", "name": "Insecure pattern 'direct_outerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:293", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:293"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/cache@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de39ac9e5cbf2f3d", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "peaceiris/actions-gh-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3345532e49ae8640", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-670ab429c5564db3", "name": "Very large file: apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts (1949 lines)", "shortDescription": {"text": "Very large file: apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts (1949 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-360b1507ef31a143", "name": "Very large file: apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts (1178 lines)", "shortDescription": {"text": "Very large file: apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts (1178 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-bde450fbbde43f80", "name": "Very large file: apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts (12040 lines)", "shortDescription": {"text": "Very large file: apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts (12040 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-5723c483f25ab633", "name": "Very large file: apps/web/test/unit/lib/analyzer/verdict-stage.test.ts (5476 lines)", "shortDescription": {"text": "Very large file: apps/web/test/unit/lib/analyzer/verdict-stage.test.ts (5476 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-eeab93d4c277d95c", "name": "Very large file: apps/web/src/app/admin/config/page.tsx (4848 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/admin/config/page.tsx (4848 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-86ee8a0e8ae64896", "name": "Very large file: apps/web/src/app/admin/source-reliability/page.tsx (1808 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/admin/source-reliability/page.tsx (1808 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-11221f49ccfa20b9", "name": "Very large file: apps/web/src/app/jobs/[id]/page.tsx (4112 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/jobs/[id]/page.tsx (4112 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-3dbba1969b42e4c2", "name": "Very large file: apps/web/src/app/jobs/[id]/utils/generateHtmlReport.ts (979 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/jobs/[id]/utils/generateHtmlReport.ts (979 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-8566cc1fc00071ea", "name": "Very large file: apps/web/src/lib/config-schemas.ts (2617 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/config-schemas.ts (2617 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-da79ac789ded2ab3", "name": "Very large file: apps/web/src/lib/analyzer/claim-extraction-stage.ts (5068 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/analyzer/claim-extraction-stage.ts (5068 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-65a85a3139008732", "name": "Very large file: apps/web/src/lib/analyzer/verdict-stage.ts (3358 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/analyzer/verdict-stage.ts (3358 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-c1c30b17f82b1bf3", "name": "Very large file: apps/web/src/lib/analyzer/research-orchestrator.ts (2168 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/analyzer/research-orchestrator.ts (2168 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-9613582630c388e7", "name": "Very large file: apps/web/src/lib/analyzer/claimboundary-pipeline.ts (1688 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/analyzer/claimboundary-pipeline.ts (1688 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-e17d4008f9e2ebde", "name": "Very large file: apps/web/src/lib/analyzer/types.ts (1505 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/analyzer/types.ts (1505 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-f33bb02eef6cd3a4", "name": "Very large file: scripts/measure-report-quality.ts (2020 lines)", "shortDescription": {"text": "Very large file: scripts/measure-report-quality.ts (2020 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-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdabaf53729e9918", "name": "Node manifest has dependencies but no lockfile: packages/fh-agent-knowledge/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/fh-agent-knowledge/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 989 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 46 placeholder/mock markers across 18 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. 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-d18b3525c0fec63b", "name": "Agent authority lacks a verifier contract: .claude/skills/audit/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/audit/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d3038fca158ad9f", "name": "Agent instruction/config may expose a secret: .claude/skills/report-review/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/report-review/SKILL.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f9ef71994f20853", "name": "Commented-code block (5 lines) in apps/web/vitest.config.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/vitest.config.ts:11"}, "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-5b540e7b158bc5cd", "name": "Commented-code block (8 lines) in apps/web/test/unit/app/api/internal/evaluate-source/evaluator-logic.test.ts:95", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/test/unit/app/api/internal/evaluate-source/evaluator-logic.test.ts:95"}, "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-38d4753efc68ef60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/app/jobs/event-display.test.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/app/jobs/event-display.test.ts:74"}, "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-b7c303e18b434724", "name": "Commented-code block (6 lines) in apps/web/test/unit/app/jobs/[id]/components/FormattedText.test.tsx:24", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/test/unit/app/jobs/[id]/components/FormattedText.test.tsx:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcfaf53f3275afbc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/lib/job-lifecycle.test.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/lib/job-lifecycle.test.ts:45"}, "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-5057d432f92ead77", "name": "Commented-code block (7 lines) in apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts:992", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts:992"}, "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-a765106f89092adf", "name": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts:656", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts:656"}, "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-b7fa137e2e088327", "name": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/confidence-calibration.test.ts:551", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/confidence-calibration.test.ts:551"}, "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-48ee0ef240b0c2a7", "name": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts:2378", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts:2378"}, "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-675c88b09a7e968f", "name": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/source-reliability.test.ts:204", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/source-reliability.test.ts:204"}, "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-c8fa18e60ab416cc", "name": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/verdict-stage.test.ts:2234", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/verdict-stage.test.ts:2234"}, "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-9d2d53f917e35803", "name": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/boundary-clustering-scope.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/boundary-clustering-scope.test.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a6060e34362ea92", "name": "Legacy-named symbol `monthsOld` in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:72", "shortDescription": {"text": "Legacy-named symbol `monthsOld` in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:72"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1543efc6b48a420", "name": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:176", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:176"}, "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-d413f1531c557240", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/scripts/regression-test.js:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/scripts/regression-test.js:61"}, "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-52149c2f43d53341", "name": "Legacy-named symbol `Calibration_Baseline_v1` in apps/web/test/calibration/framing-symmetry.test.ts:39", "shortDescription": {"text": "Legacy-named symbol `Calibration_Baseline_v1` in apps/web/test/calibration/framing-symmetry.test.ts:39"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8534aedddc4987f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/health/route.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/health/route.ts:8"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d20317700ebef526", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/admin/invites/[code]/route.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/admin/invites/[code]/route.ts:127"}, "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-9164acaf9c152d6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/route.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/route.ts:60"}, "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-5e935002a7473a26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/status/route.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/status/route.ts:27"}, "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-26d4b211f73d6853", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/route.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/route.ts:23"}, "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-2a945d029667c3e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/summary/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/summary/route.ts:24"}, "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-5c0478b6f53d7439", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/quality-health/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/quality-health/route.ts:24"}, "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-cd8be90ace7bc7e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/route.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/route.ts:43"}, "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-04e450193298fc0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/route.ts:35"}, "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-053ef76044588818", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/route.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/route.ts: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-d6d201ed3aa9db0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/history/route.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/history/route.ts:36"}, "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-03d47f89ef98de4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/version/route.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/version/route.ts:8"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3920d2b9e07dd218", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/admin/source-reliability/route.ts:141", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/admin/source-reliability/route.ts:141"}, "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-a47f5faee322a186", "name": "Commented-code block (6 lines) in apps/web/src/app/admin/page.tsx:61", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/app/admin/page.tsx:61"}, "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-3bb60dfa6d98c434", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/config/page.tsx:2728", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/config/page.tsx:2728"}, "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-c1d1b88c903f9205", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/source-reliability/page.tsx:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/source-reliability/page.tsx:243"}, "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-2e2f40e10105c6e7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/quality-health/page.tsx:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/quality-health/page.tsx:240"}, "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-bc128f14d5487bb3", "name": "Commented-code block (5 lines) in apps/web/src/lib/web-search.ts:319", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/web-search.ts:319"}, "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-0ae32ca794533c18", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/fact-checker-service.ts:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/fact-checker-service.ts: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-7963baa1ad7721cd", "name": "Commented-code block (5 lines) in apps/web/src/lib/retrieval.ts:831", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/retrieval.ts:831"}, "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-91b144395255c800", "name": "Commented-code block (5 lines) in apps/web/src/lib/internal-runner-queue.ts:385", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/internal-runner-queue.ts:385"}, "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-436f40e305a2ad75", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/internal-runner-queue.ts:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/internal-runner-queue.ts:171"}, "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-5a479f00467779c4", "name": "Commented-code block (5 lines) in apps/web/src/lib/config-schemas.ts:256", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/config-schemas.ts:256"}, "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-fc4a94c2085a03ff", "name": "Commented-code block (5 lines) in apps/web/src/lib/analyzer/config.ts:118", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/analyzer/config.ts:118"}, "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-58c80ed6589c85eb", "name": "Commented-code block (8 lines) in apps/web/src/lib/analyzer/claim-extraction-stage.ts:66", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/src/lib/analyzer/claim-extraction-stage.ts:66"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56c2e418c3751a6e", "name": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/verdict-stage.ts:1402", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/verdict-stage.ts:1402"}, "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-41217d6bb8adb0a6", "name": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-extraction-stage.ts:269", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-extraction-stage.ts:269"}, "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-7bfeafbeb3d1700f", "name": "Legacy-named symbol `monthsOld` in apps/web/src/lib/analyzer/evidence-recency.ts:43", "shortDescription": {"text": "Legacy-named symbol `monthsOld` in apps/web/src/lib/analyzer/evidence-recency.ts:43"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0995e660f0b1359c", "name": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-orchestrator.ts:2096", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-orchestrator.ts:2096"}, "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-9a20f56187e4f48d", "name": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/aggregation-stage.ts:241", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/aggregation-stage.ts:241"}, "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-f55b3357f484a947", "name": "Commented-code block (7 lines) in apps/web/src/lib/analyzer/metrics.ts:202", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/lib/analyzer/metrics.ts:202"}, "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-59ea26981302a85a", "name": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/confidence-calibration.ts:262", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/confidence-calibration.ts:262"}, "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-122bb010a21f6079", "name": "Commented-code block (6 lines) in apps/web/src/lib/source-reliability/sr-eval-engine.ts:462", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/source-reliability/sr-eval-engine.ts:462"}, "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-3e611575baf485ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/source-reliability/sr-eval-evidence-pack.ts:273", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/source-reliability/sr-eval-evidence-pack.ts:273"}, "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-f0d9737325ab6a63", "name": "Commented-code block (5 lines) in apps/web/src/lib/source-reliability/sr-eval-prompts.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/source-reliability/sr-eval-prompts.ts:14"}, "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-4ad4f1c1aeb817c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/calibration/paired-job-audit.ts:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/calibration/paired-job-audit.ts:79"}, "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-c7e35f5f7abbab56", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-validation-matrix.js:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-validation-matrix.js:31"}, "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-d5e57fa37d5171b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch.cjs:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch.cjs:28"}, "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-11944a172a1a74c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch2.cjs:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch2.cjs:19"}, "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-c5c3d706a1147ebc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/validation/extract-validation-summary.js:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/validation/extract-validation-summary.js:72"}, "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-662a83727e860800", "name": "Network/subprocess call without timeout or try/except \u2014 Docs/xwiki-pages/scripts/xar_to_xwiki_tree.py:103", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 Docs/xwiki-pages/scripts/xar_to_xwiki_tree.py:103"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5880cb5542d615cd", "name": "94 env vars used in code but missing from .env.example", "shortDescription": {"text": "94 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_MODEL`, `CI`, `CLAUDE_CODE_SESSION_ID`, `CLAUDE_PROJECT_DIR`, `CLAUDE_SESSION_ID`, `DB_PATH`, `FH_`, `FH_AGENT_KNOWLEDGE_CACHE_DIR` + 86 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-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/Benchmarks/phaseA_search_experiment.py:api_request, scripts/Benchmarks/phase1_experiment.py:api_request\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18341"}, "properties": {"repository": "robertschaub/FactHarbor", "repoUrl": "https://github.com/robertschaub/FactHarbor", "branch": "main"}, "results": [{"ruleId": "scanner-02ac5f29205133b1", "level": "note", "message": {"text": "File has no detected symbols: scripts/tmp-validate-analyze.py"}, "properties": {"repobilityId": "9b63e4d59d37d587", "scanner": "scanner-primary", "fingerprint": "02ac5f29205133b1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code-candidate"]}}, {"ruleId": "scanner-d7249d5cce5de9ca", "level": "note", "message": {"text": "File has no detected symbols: scripts/tmp-validate-preflight.py"}, "properties": {"repobilityId": "bf169b6be8e81ece", "scanner": "scanner-primary", "fingerprint": "d7249d5cce5de9ca", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code-candidate"]}}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-068cee56eb991cd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.test.ts:40"}, "properties": {"repobilityId": "3b3232a7175b27e8", "scanner": "scanner-primary", "fingerprint": "068cee56eb991cd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96a21abfb100b34f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-terminology-v2.7.ts:86"}, "properties": {"repobilityId": "1030b4fc051228d9", "scanner": "scanner-primary", "fingerprint": "96a21abfb100b34f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8392018eb0eaed8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/test-budget.ts:10"}, "properties": {"repobilityId": "0f705b2c5616e544", "scanner": "scanner-primary", "fingerprint": "8392018eb0eaed8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce892dfff431f560", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/hydrogen-smoke.test.ts:45"}, "properties": {"repobilityId": "b18871e554331a35", "scanner": "scanner-primary", "fingerprint": "ce892dfff431f560", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-75451893ffc528b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/integration/claimboundary-integration.test.ts:174"}, "properties": {"repobilityId": "f93161f153cf2e37", "scanner": "scanner-primary", "fingerprint": "75451893ffc528b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90e06a3d8e7dacbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/unit/lib/input-neutrality.test.ts:160"}, "properties": {"repobilityId": "df5c00ad5c56f7c0", "scanner": "scanner-primary", "fingerprint": "90e06a3d8e7dacbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f0ab40219ef34f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/scripts/regression-test.js:145"}, "properties": {"repobilityId": "4008c859aed27f30", "scanner": "scanner-primary", "fingerprint": "8f0ab40219ef34f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8981790b6b973138", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/test/calibration/framing-symmetry.test.ts:150"}, "properties": {"repobilityId": "e41d3c089c2fbc7e", "scanner": "scanner-primary", "fingerprint": "8981790b6b973138", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad0328e86103545b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/run-paired-audit.ts:34"}, "properties": {"repobilityId": "3ee8bcd0869a1a96", "scanner": "scanner-primary", "fingerprint": "ad0328e86103545b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf0f06c4c6b714ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/baseline-runner.js:14"}, "properties": {"repobilityId": "6ea96b2d7282e551", "scanner": "scanner-primary", "fingerprint": "bf0f06c4c6b714ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82b23de90b6b02d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-bias-reports.ts:31"}, "properties": {"repobilityId": "75b4f9d7dc3539f9", "scanner": "scanner-primary", "fingerprint": "82b23de90b6b02d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4b00aca7ee5beba9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/validate-calibration-telemetry.ts:326"}, "properties": {"repobilityId": "9bd50d8bdad5fd7a", "scanner": "scanner-primary", "fingerprint": "4b00aca7ee5beba9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-61c990d42f6d517f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/migrate-env-to-db.ts:235"}, "properties": {"repobilityId": "61989efc6161930a", "scanner": "scanner-primary", "fingerprint": "61c990d42f6d517f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d26c6ff1ffa50d8f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/refresh-bias-report-html.ts:55"}, "properties": {"repobilityId": "ffa1803f55c61919", "scanner": "scanner-primary", "fingerprint": "d26c6ff1ffa50d8f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3311226a2d72303c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-text-analysis-prompts.ts:23"}, "properties": {"repobilityId": "b765ff15bbc5f3f5", "scanner": "scanner-primary", "fingerprint": "3311226a2d72303c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-277490210ed60f56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/reseed-all-prompts.ts:210"}, "properties": {"repobilityId": "fba936697d2a801c", "scanner": "scanner-primary", "fingerprint": "277490210ed60f56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac1668aec7956d59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/ab-runner.js:17"}, "properties": {"repobilityId": "29da394e1b5e7d53", "scanner": "scanner-primary", "fingerprint": "ac1668aec7956d59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8053b587ce477dda", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/source-reliability-cache.ts:84"}, "properties": {"repobilityId": "4974e9bf53ba1199", "scanner": "scanner-primary", "fingerprint": "8053b587ce477dda", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4ed7c6bbc92358f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-brave.ts:26"}, "properties": {"repobilityId": "7820d7d26c913978", "scanner": "scanner-primary", "fingerprint": "a4ed7c6bbc92358f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4394306e4e21ceae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-loader.ts:235"}, "properties": {"repobilityId": "65c1e29ab322c473", "scanner": "scanner-primary", "fingerprint": "4394306e4e21ceae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-787c17ca444c19b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/web-search.ts:239"}, "properties": {"repobilityId": "85ea0bfc38b16789", "scanner": "scanner-primary", "fingerprint": "787c17ca444c19b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26af3b50ec9e2657", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-provider-utils.ts:44"}, "properties": {"repobilityId": "b1c51790a303bedd", "scanner": "scanner-primary", "fingerprint": "26af3b50ec9e2657", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8528899e8034c92", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/config-storage.ts:172"}, "properties": {"repobilityId": "1a7fb50acee7e8b1", "scanner": "scanner-primary", "fingerprint": "f8528899e8034c92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff2419614ae159cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/input-policy-gate.ts:149"}, "properties": {"repobilityId": "80eaeaa1b6c52e1d", "scanner": "scanner-primary", "fingerprint": "ff2419614ae159cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7db11ad86ea689c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-health.ts:85"}, "properties": {"repobilityId": "13558b3b5fb125e4", "scanner": "scanner-primary", "fingerprint": "7db11ad86ea689c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a55e4250d390301c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-factcheck-api.ts:39"}, "properties": {"repobilityId": "93cf08869a20bc64", "scanner": "scanner-primary", "fingerprint": "a55e4250d390301c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f892a804d9c7beb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/fact-checker-service.ts:159"}, "properties": {"repobilityId": "d0bf7afe8cd6f244", "scanner": "scanner-primary", "fingerprint": "1f892a804d9c7beb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-84edc4f9f7b04806", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-google-cse.ts:21"}, "properties": {"repobilityId": "25e324ee2d874990", "scanner": "scanner-primary", "fingerprint": "84edc4f9f7b04806", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d37ce30abc5e5ab2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-semanticscholar.ts:61"}, "properties": {"repobilityId": "320e9da7d96f7746", "scanner": "scanner-primary", "fingerprint": "d37ce30abc5e5ab2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-150204b7723734bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-wikipedia.ts:22"}, "properties": {"repobilityId": "51fd3cfb55dea546", "scanner": "scanner-primary", "fingerprint": "150204b7723734bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9e649aa24b85d1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/retrieval.ts:295"}, "properties": {"repobilityId": "c62cb04c630e333f", "scanner": "scanner-primary", "fingerprint": "f9e649aa24b85d1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54cedc1023e1acb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serpapi.ts:18"}, "properties": {"repobilityId": "c02d5989b714552e", "scanner": "scanner-primary", "fingerprint": "54cedc1023e1acb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97f15c002a23c9ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/internal-runner-queue.ts:126"}, "properties": {"repobilityId": "a063f4ae7aa88808", "scanner": "scanner-primary", "fingerprint": "97f15c002a23c9ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2377e26945e53c0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-circuit-breaker.ts:108"}, "properties": {"repobilityId": "6c4d42bb39dd4f8a", "scanner": "scanner-primary", "fingerprint": "f2377e26945e53c0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d0b401a21a74c7c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/provider-webhook.ts:56"}, "properties": {"repobilityId": "6fd77f294c01be96", "scanner": "scanner-primary", "fingerprint": "9d0b401a21a74c7c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-469fdaecb6b5db57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-cache.ts:81"}, "properties": {"repobilityId": "0f51b59edcf2e533", "scanner": "scanner-primary", "fingerprint": "469fdaecb6b5db57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e07ae9c27fb5739a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/search-serper.ts:25"}, "properties": {"repobilityId": "e22940fc31931480", "scanner": "scanner-primary", "fingerprint": "e07ae9c27fb5739a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-305355283187a061", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/model-tiering.ts:343"}, "properties": {"repobilityId": "1b40303fe87e28d1", "scanner": "scanner-primary", "fingerprint": "305355283187a061", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d06c6885c3b420f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/evidence-deduplication.ts:76"}, "properties": {"repobilityId": "10beb9fa8005fc69", "scanner": "scanner-primary", "fingerprint": "d06c6885c3b420f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e1066834ab31a35", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/debug.ts:155"}, "properties": {"repobilityId": "d6b71727c81a8444", "scanner": "scanner-primary", "fingerprint": "8e1066834ab31a35", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af1fc43cd600c0a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claim-extraction-stage.ts:3228"}, "properties": {"repobilityId": "75be5ada4328ddf7", "scanner": "scanner-primary", "fingerprint": "af1fc43cd600c0a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-416305096befeac7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/quality-gates.ts:230"}, "properties": {"repobilityId": "766ebe891a0bfeb7", "scanner": "scanner-primary", "fingerprint": "416305096befeac7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d19ec9687dd7e89d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/source-reliability.ts:200"}, "properties": {"repobilityId": "4000ae752a9ceeae", "scanner": "scanner-primary", "fingerprint": "d19ec9687dd7e89d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-056b23910207d270", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:1550"}, "properties": {"repobilityId": "fd9dfb7158adb2e0", "scanner": "scanner-primary", "fingerprint": "056b23910207d270", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dc8bddbdb92b7404", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/claimboundary-pipeline.ts:630"}, "properties": {"repobilityId": "c0240e8f2069a921", "scanner": "scanner-primary", "fingerprint": "dc8bddbdb92b7404", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19bc6f4af17f873e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/lib/analyzer/source-reliability-calibration.ts:125"}, "properties": {"repobilityId": "f164816673ee81b0", "scanner": "scanner-primary", "fingerprint": "19bc6f4af17f873e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b0fe44345e09dae9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/analyzer/llm.ts:183"}, "properties": {"repobilityId": "010dee6daa15ba39", "scanner": "scanner-primary", "fingerprint": "b0fe44345e09dae9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf30f2a85d695c63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/promptfoo-sr.js:49"}, "properties": {"repobilityId": "e6d670c97573d4fa", "scanner": "scanner-primary", "fingerprint": "cf30f2a85d695c63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b98774d2a4abc900", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sr-cache-flush.ts:8"}, "properties": {"repobilityId": "0b8ca3bb13b27905", "scanner": "scanner-primary", "fingerprint": "b98774d2a4abc900", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70c305b3c1c230c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-report-verdicts.ts:166"}, "properties": {"repobilityId": "6b8240746cb2d83c", "scanner": "scanner-primary", "fingerprint": "70c305b3c1c230c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-61bd5d2fee5e0cfe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-validation-matrix.js:136"}, "properties": {"repobilityId": "61ab4ce800851d7e", "scanner": "scanner-primary", "fingerprint": "61bd5d2fee5e0cfe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e4d7e6569a6ddc4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/measure-evidence-quality.ts:234"}, "properties": {"repobilityId": "b73dcb2d0ab3e079", "scanner": "scanner-primary", "fingerprint": "9e4d7e6569a6ddc4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e9a2a4a71ca2830", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/measure-report-quality.ts:1838"}, "properties": {"repobilityId": "3ce220c87adb8f16", "scanner": "scanner-primary", "fingerprint": "8e9a2a4a71ca2830", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09fbcf4fc569916d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validation/compare-batches.js:171"}, "properties": {"repobilityId": "eca48de049ec767a", "scanner": "scanner-primary", "fingerprint": "09fbcf4fc569916d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c977169e6c6ad9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validation/extract-validation-summary.js:300"}, "properties": {"repobilityId": "c7ad7fac4d402fce", "scanner": "scanner-primary", "fingerprint": "9c977169e6c6ad9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a91b3dd3b8c84b23", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/scripts/run-calibration-lane.ts:2"}, "properties": {"repobilityId": "ec49943285076ac2", "scanner": "scanner-primary", "fingerprint": "a91b3dd3b8c84b23", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/scripts/run-calibration-lane.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-af734a9dc6dafe72", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in apps/web/src/app/jobs/[id]/page.tsx:2510"}, "properties": {"repobilityId": "641bb5acc8dd6df9", "scanner": "scanner-primary", "fingerprint": "af734a9dc6dafe72", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/app/jobs/[id]/page.tsx"}, "region": {"startLine": 2510}}}]}, {"ruleId": "scanner-c3bf69b04ce339b4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/src/lib/build-info.ts:2"}, "properties": {"repobilityId": "f748d74f9cddf7cb", "scanner": "scanner-primary", "fingerprint": "c3bf69b04ce339b4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/lib/build-info.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-455ca2d19ff9d8b5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/web/src/lib/search-wikipedia.ts:36"}, "properties": {"repobilityId": "824640120ce08749", "scanner": "scanner-primary", "fingerprint": "455ca2d19ff9d8b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/lib/search-wikipedia.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-546960ebbb6f0dba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/promptfoo-sr.js:18"}, "properties": {"repobilityId": "9d5c3d36f7c93738", "scanner": "scanner-primary", "fingerprint": "546960ebbb6f0dba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/promptfoo-sr.js"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-00076a617dbf80ed", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/monthly-prune-handoffs.mjs:16"}, "properties": {"repobilityId": "56bf14e2b48a7517", "scanner": "scanner-primary", "fingerprint": "00076a617dbf80ed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/monthly-prune-handoffs.mjs"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-9332d559dcb4bed3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/measure-report-quality.ts:21"}, "properties": {"repobilityId": "7734440cbd19fa22", "scanner": "scanner-primary", "fingerprint": "9332d559dcb4bed3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/measure-report-quality.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-959c327f2140335e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/best-commit-phase1.cjs:10"}, "properties": {"repobilityId": "50006aa03a168688", "scanner": "scanner-primary", "fingerprint": "959c327f2140335e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/best-commit-phase1.cjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-38f853a9f2a10f17", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/quality-branch-membership.cjs:16"}, "properties": {"repobilityId": "709114476ff7a305", "scanner": "scanner-primary", "fingerprint": "38f853a9f2a10f17", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/quality-branch-membership.cjs"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-73c5ffb28bf3b32f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-drift-sizing.cjs:6"}, "properties": {"repobilityId": "8ed9d91edc9dba3a", "scanner": "scanner-primary", "fingerprint": "73c5ffb28bf3b32f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/fetch-failure-drift-sizing.cjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-ab5cb1e8e5d4be5f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/partisan-contradiction-census.cjs:7"}, "properties": {"repobilityId": "7a39bc59bb90b03e", "scanner": "scanner-primary", "fingerprint": "ab5cb1e8e5d4be5f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/partisan-contradiction-census.cjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-3459117b6ee53374", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/bolsonaro-ac03-evidence.cjs:5"}, "properties": {"repobilityId": "0a718c270da369e5", "scanner": "scanner-primary", "fingerprint": "3459117b6ee53374", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/bolsonaro-ac03-evidence.cjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-15b5ebe87e85593e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-analysis-equiv.cjs:11"}, "properties": {"repobilityId": "6cb14e9de4ed3771", "scanner": "scanner-primary", "fingerprint": "15b5ebe87e85593e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/benchmark-band-analysis-equiv.cjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-9d18f610991fc13c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/pv2-probe.cjs:5"}, "properties": {"repobilityId": "cf823ecbd7da59a2", "scanner": "scanner-primary", "fingerprint": "9d18f610991fc13c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/pv2-probe.cjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-27442f74064b6533", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/plastic-ac-extract.cjs:5"}, "properties": {"repobilityId": "8a4d77e08b50313b", "scanner": "scanner-primary", "fingerprint": "27442f74064b6533", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/plastic-ac-extract.cjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-42fb17e83a166da7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/compare-evidence-pools.cjs:23"}, "properties": {"repobilityId": "724866aaede830fc", "scanner": "scanner-primary", "fingerprint": "42fb17e83a166da7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/compare-evidence-pools.cjs"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-81e3bce264ecf5cd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/quality-timeseries.cjs:16"}, "properties": {"repobilityId": "d8f8b67b0c77429c", "scanner": "scanner-primary", "fingerprint": "81e3bce264ecf5cd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/quality-timeseries.cjs"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-c037982c19e0b370", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/verdict-direction-instability.cjs:29"}, "properties": {"repobilityId": "b81bf6aa44c3fda1", "scanner": "scanner-primary", "fingerprint": "c037982c19e0b370", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/verdict-direction-instability.cjs"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-ba55f123a3842bfc", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-weekly-trend.cjs:7"}, "properties": {"repobilityId": "ce9346294ff7faee", "scanner": "scanner-primary", "fingerprint": "ba55f123a3842bfc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/fetch-failure-weekly-trend.cjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-112b2da3ee2f155c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/verdict-stability-batch.cjs:31"}, "properties": {"repobilityId": "1a858664dd2563b8", "scanner": "scanner-primary", "fingerprint": "112b2da3ee2f155c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/verdict-stability-batch.cjs"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-91cefcef40b01183", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/fetch-failure-domain-breakdown.cjs:6"}, "properties": {"repobilityId": "22f6efc7f101e93b", "scanner": "scanner-primary", "fingerprint": "91cefcef40b01183", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/fetch-failure-domain-breakdown.cjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-38f9186736f7aa08", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/reason-coded-failure-census.cjs:12"}, "properties": {"repobilityId": "6b7b2a9adc102b1b", "scanner": "scanner-primary", "fingerprint": "38f9186736f7aa08", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/reason-coded-failure-census.cjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-88bbce5f3cc6f68c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/report-damaged-drill.cjs:6"}, "properties": {"repobilityId": "3d5b3624575182b3", "scanner": "scanner-primary", "fingerprint": "88bbce5f3cc6f68c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/report-damaged-drill.cjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-768522610a95a168", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/benchmark-band-era-check.cjs:10"}, "properties": {"repobilityId": "63b16d460db2a8a7", "scanner": "scanner-primary", "fingerprint": "768522610a95a168", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/benchmark-band-era-check.cjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-58bcb881c8559a6c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/inputs-used.cjs:4"}, "properties": {"repobilityId": "35d6c323585fb42f", "scanner": "scanner-primary", "fingerprint": "58bcb881c8559a6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/inputs-used.cjs"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-abc989931a7d4080", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-drill.cjs:12"}, "properties": {"repobilityId": "0d663d3c9237e9d8", "scanner": "scanner-primary", "fingerprint": "abc989931a7d4080", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/checkworthy-unverified-drill.cjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-189161e4d2cd0468", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/checkworthy-unverified-census.cjs:11"}, "properties": {"repobilityId": "679561c3d941c10e", "scanner": "scanner-primary", "fingerprint": "189161e4d2cd0468", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/checkworthy-unverified-census.cjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-7d938833040d1736", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/diag/contract-abort-drill.cjs:5"}, "properties": {"repobilityId": "bf150f1ce2ae8c83", "scanner": "scanner-primary", "fingerprint": "7d938833040d1736", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/diag/contract-abort-drill.cjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-d67f4fe77316440f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/agents/invoke-claude.cjs:6"}, "properties": {"repobilityId": "99b4a27636164d54", "scanner": "scanner-primary", "fingerprint": "d67f4fe77316440f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/agents/invoke-claude.cjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-3742094c7f69d04d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/rebuild-index-on-change.cjs:22"}, "properties": {"repobilityId": "6417e25cb26e79a1", "scanner": "scanner-primary", "fingerprint": "3742094c7f69d04d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hooks/rebuild-index-on-change.cjs"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-4037c3423be540d0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hooks/failed-verifier-nudge.cjs:18"}, "properties": {"repobilityId": "367b70e7693edbac", "scanner": "scanner-primary", "fingerprint": "4037c3423be540d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hooks/failed-verifier-nudge.cjs"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-060761958a04af70", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packages/fh-agent-knowledge/src/utils/fs.mjs:2"}, "properties": {"repobilityId": "4c3bd7c1c2d6ec4c", "scanner": "scanner-primary", "fingerprint": "060761958a04af70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/fh-agent-knowledge/src/utils/fs.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-5d47e760435c2774", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/plastic-en/v0.1/SRC_UNEP_TURNING_OFF_TAP_2023.html:3422"}, "properties": {"repobilityId": "8433f6b5d02b2c5e", "scanner": "scanner-primary", "fingerprint": "5d47e760435c2774", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/plastic-en/v0.1/SRC_UNEP_TURNING_OFF_TAP_2023.html"}, "region": {"startLine": 3422}}}]}, {"ruleId": "scanner-8ced2d696e78c4c1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-wwii-de/v0.1/SRC_BAR_UMSTRITTENE_FLUECHTLINGSPOLITIK_20191028.html:103"}, "properties": {"repobilityId": "9e17c202bc639986", "scanner": "scanner-primary", "fingerprint": "8ced2d696e78c4c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/asylum-wwii-de/v0.1/SRC_BAR_UMSTRITTENE_FLUECHTLINGSPOLITIK_20191028.html"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-0730378a61461865", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_SENTENCE_APPEAL_20251028.html:16943"}, "properties": {"repobilityId": "e75331cf8d1d2d37", "scanner": "scanner-primary", "fingerprint": "0730378a61461865", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_SENTENCE_APPEAL_20251028.html"}, "region": {"startLine": 16943}}}]}, {"ruleId": "scanner-18f1401df6677ee0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_CONVICTION_SENTENCE_20250911.html:17637"}, "properties": {"repobilityId": "da839a2415d696a9", "scanner": "scanner-primary", "fingerprint": "18f1401df6677ee0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_AP_CONVICTION_SENTENCE_20250911.html"}, "region": {"startLine": 17637}}}]}, {"ruleId": "scanner-844f8a40efb928f8", "level": "note", "message": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_OAS_ACHR_ART8.html:97"}, "properties": {"repobilityId": "32224ef978fb4980", "scanner": "scanner-primary", "fingerprint": "844f8a40efb928f8", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/bolsonaro-shared/v0.1/SRC_OAS_ACHR_ART8.html"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-78277ea0a2124096", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_APRIL_2026_PAGE.html:85"}, "properties": {"repobilityId": "3b1d851d8a2927b9", "scanner": "scanner-primary", "fingerprint": "78277ea0a2124096", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_APRIL_2026_PAGE.html"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-c9728b64a2db18df", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_MAIN_20260430.html:89"}, "properties": {"repobilityId": "d5c0bb9c2ad0dab5", "scanner": "scanner-primary", "fingerprint": "c9728b64a2db18df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/asylum-235000-de/v0.1/SRC_SEM_ASYLSTATISTIK_MAIN_20260430.html"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-a3bd8584ba5cc44e", "level": "note", "message": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html:70"}, "properties": {"repobilityId": "6dcc140af681fe5f", "scanner": "scanner-primary", "fingerprint": "a3bd8584ba5cc44e", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-aed6efb85c36066f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html:39"}, "properties": {"repobilityId": "050cef7fd3f1093f", "scanner": "scanner-primary", "fingerprint": "aed6efb85c36066f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_TRANSPORT_ROLE_20220225.html"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-756bd15078ed7ad8", "level": "note", "message": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html:70"}, "properties": {"repobilityId": "c6a1a124d2b248ff", "scanner": "scanner-primary", "fingerprint": "756bd15078ed7ad8", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-f9d6212cb9641bfd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html:39"}, "properties": {"repobilityId": "e3f8952809acc2d5", "scanner": "scanner-primary", "fingerprint": "f9d6212cb9641bfd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_FUEL_CELL_TECH_COMPARISON.html"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-7af8d946d8735428", "level": "note", "message": {"text": "Insecure pattern 'document_write' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html:70"}, "properties": {"repobilityId": "6a4b642fcede40a9", "scanner": "scanner-primary", "fingerprint": "7af8d946d8735428", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-434e44fa30d7592e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html:39"}, "properties": {"repobilityId": "b58cb7f9eed4ad93", "scanner": "scanner-primary", "fingerprint": "434e44fa30d7592e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/AGENTS/Reference_Dossiers/snapshots/hydrogen-en/v0.1/SRC_DOE_HYDROGEN_ELECTROLYSIS.html"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-2765e39bc686e9db", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in Docs/xwiki-pages/analytics/worker.js:16"}, "properties": {"repobilityId": "e54e06338a146d06", "scanner": "scanner-primary", "fingerprint": "2765e39bc686e9db", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/xwiki-pages/analytics/worker.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-3a13e662ebad3fdd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Docs/xwiki-pages/viewer-impl/xwiki-viewer.html:1082"}, "properties": {"repobilityId": "10a6b7f54b56bdea", "scanner": "scanner-primary", "fingerprint": "3a13e662ebad3fdd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Docs/xwiki-pages/viewer-impl/xwiki-viewer.html"}, "region": {"startLine": 1082}}}]}, {"ruleId": "scanner-c25f39927176b600", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:316"}, "properties": {"repobilityId": "c2c4c04f42bcb777", "scanner": "scanner-primary", "fingerprint": "c25f39927176b600", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/vscode-xwiki-preview/src/preview-panel.ts"}, "region": {"startLine": 316}}}]}, {"ruleId": "scanner-259dff7d227b23e4", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in tools/vscode-xwiki-preview/src/preview-panel.ts:293"}, "properties": {"repobilityId": "ad587e4af0d8da2e", "scanner": "scanner-primary", "fingerprint": "259dff7d227b23e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/vscode-xwiki-preview/src/preview-panel.ts"}, "region": {"startLine": 293}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-de39ac9e5cbf2f3d", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e7ec3454f749eedf", "scanner": "scanner-primary", "fingerprint": "de39ac9e5cbf2f3d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docs.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-3345532e49ae8640", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "32c4cca348173c51", "scanner": "scanner-primary", "fingerprint": "3345532e49ae8640", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docs.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-670ab429c5564db3", "level": "note", "message": {"text": "Very large file: apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts (1949 lines)"}, "properties": {"repobilityId": "7b5d52c3d8a5f00c", "scanner": "scanner-primary", "fingerprint": "670ab429c5564db3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-360b1507ef31a143", "level": "note", "message": {"text": "Very large file: apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts (1178 lines)"}, "properties": {"repobilityId": "77a9cb616c8c1646", "scanner": "scanner-primary", "fingerprint": "360b1507ef31a143", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bde450fbbde43f80", "level": "note", "message": {"text": "Very large file: apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts (12040 lines)"}, "properties": {"repobilityId": "366fbd566ef5166d", "scanner": "scanner-primary", "fingerprint": "bde450fbbde43f80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5723c483f25ab633", "level": "note", "message": {"text": "Very large file: apps/web/test/unit/lib/analyzer/verdict-stage.test.ts (5476 lines)"}, "properties": {"repobilityId": "621adb650e4523d6", "scanner": "scanner-primary", "fingerprint": "5723c483f25ab633", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eeab93d4c277d95c", "level": "note", "message": {"text": "Very large file: apps/web/src/app/admin/config/page.tsx (4848 lines)"}, "properties": {"repobilityId": "935dcb7d71ba42f4", "scanner": "scanner-primary", "fingerprint": "eeab93d4c277d95c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86ee8a0e8ae64896", "level": "note", "message": {"text": "Very large file: apps/web/src/app/admin/source-reliability/page.tsx (1808 lines)"}, "properties": {"repobilityId": "52e7bad3ff60722c", "scanner": "scanner-primary", "fingerprint": "86ee8a0e8ae64896", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-11221f49ccfa20b9", "level": "note", "message": {"text": "Very large file: apps/web/src/app/jobs/[id]/page.tsx (4112 lines)"}, "properties": {"repobilityId": "4f16e932807e7388", "scanner": "scanner-primary", "fingerprint": "11221f49ccfa20b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3dbba1969b42e4c2", "level": "note", "message": {"text": "Very large file: apps/web/src/app/jobs/[id]/utils/generateHtmlReport.ts (979 lines)"}, "properties": {"repobilityId": "9dcbc7cc2a51052d", "scanner": "scanner-primary", "fingerprint": "3dbba1969b42e4c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8566cc1fc00071ea", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/config-schemas.ts (2617 lines)"}, "properties": {"repobilityId": "daf320a99d0392b0", "scanner": "scanner-primary", "fingerprint": "8566cc1fc00071ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da79ac789ded2ab3", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/analyzer/claim-extraction-stage.ts (5068 lines)"}, "properties": {"repobilityId": "07991cb58acfceb7", "scanner": "scanner-primary", "fingerprint": "da79ac789ded2ab3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-65a85a3139008732", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/analyzer/verdict-stage.ts (3358 lines)"}, "properties": {"repobilityId": "178217308dc1d9dd", "scanner": "scanner-primary", "fingerprint": "65a85a3139008732", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c1c30b17f82b1bf3", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/analyzer/research-orchestrator.ts (2168 lines)"}, "properties": {"repobilityId": "ef5612aed7556653", "scanner": "scanner-primary", "fingerprint": "c1c30b17f82b1bf3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9613582630c388e7", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/analyzer/claimboundary-pipeline.ts (1688 lines)"}, "properties": {"repobilityId": "ccea18e32a1c7947", "scanner": "scanner-primary", "fingerprint": "9613582630c388e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e17d4008f9e2ebde", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/analyzer/types.ts (1505 lines)"}, "properties": {"repobilityId": "6c9a99b593dc789d", "scanner": "scanner-primary", "fingerprint": "e17d4008f9e2ebde", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f33bb02eef6cd3a4", "level": "note", "message": {"text": "Very large file: scripts/measure-report-quality.ts (2020 lines)"}, "properties": {"repobilityId": "2b9637a400a374f1", "scanner": "scanner-primary", "fingerprint": "f33bb02eef6cd3a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bdabaf53729e9918", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/fh-agent-knowledge/package.json"}, "properties": {"repobilityId": "5d77005cf1a0f58d", "scanner": "scanner-primary", "fingerprint": "bdabaf53729e9918", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/fh-agent-knowledge/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5bf37aa14de9b3a5", "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": "959c11963a0b0941", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "4076aeb535034816", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "2bce92f25209f1e1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6b8f7100953aeb13", "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": "cee6b73f016f251f", "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": "bd3d2ef7828915a6", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d18b3525c0fec63b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/audit/SKILL.md"}, "properties": {"repobilityId": "c9d1fda86b8d7f78", "scanner": "scanner-primary", "fingerprint": "d18b3525c0fec63b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/audit/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d3038fca158ad9f", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/report-review/SKILL.md"}, "properties": {"repobilityId": "bdd4aed6112cb521", "scanner": "scanner-primary", "fingerprint": "3d3038fca158ad9f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/report-review/SKILL.md"}, "region": {"startLine": 362}}}]}, {"ruleId": "scanner-8f9ef71994f20853", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/vitest.config.ts:11"}, "properties": {"repobilityId": "d76df8f81669db40", "scanner": "scanner-primary", "fingerprint": "8f9ef71994f20853", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b540e7b158bc5cd", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/test/unit/app/api/internal/evaluate-source/evaluator-logic.test.ts:95"}, "properties": {"repobilityId": "526de9634772659f", "scanner": "scanner-primary", "fingerprint": "5b540e7b158bc5cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38d4753efc68ef60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/app/jobs/event-display.test.ts:74"}, "properties": {"repobilityId": "385c70e9779d7d0b", "scanner": "scanner-primary", "fingerprint": "38d4753efc68ef60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7c303e18b434724", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/test/unit/app/jobs/[id]/components/FormattedText.test.tsx:24"}, "properties": {"repobilityId": "1671b510f9f56460", "scanner": "scanner-primary", "fingerprint": "b7c303e18b434724", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcfaf53f3275afbc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/unit/lib/job-lifecycle.test.ts:45"}, "properties": {"repobilityId": "db63f36e775150e6", "scanner": "scanner-primary", "fingerprint": "fcfaf53f3275afbc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5057d432f92ead77", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/test/unit/lib/analyzer/claim-contract-validation.test.ts:992"}, "properties": {"repobilityId": "143e2558f6c1db91", "scanner": "scanner-primary", "fingerprint": "5057d432f92ead77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a765106f89092adf", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/research-extraction-stage.test.ts:656"}, "properties": {"repobilityId": "6a173630568febb5", "scanner": "scanner-primary", "fingerprint": "a765106f89092adf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7fa137e2e088327", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/confidence-calibration.test.ts:551"}, "properties": {"repobilityId": "2cc37b3dc0c04e18", "scanner": "scanner-primary", "fingerprint": "b7fa137e2e088327", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48ee0ef240b0c2a7", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/claimboundary-pipeline.test.ts:2378"}, "properties": {"repobilityId": "437b65c0dfc69d2b", "scanner": "scanner-primary", "fingerprint": "48ee0ef240b0c2a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-675c88b09a7e968f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/source-reliability.test.ts:204"}, "properties": {"repobilityId": "eaddbc0b7b3e9f81", "scanner": "scanner-primary", "fingerprint": "675c88b09a7e968f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8fa18e60ab416cc", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/test/unit/lib/analyzer/verdict-stage.test.ts:2234"}, "properties": {"repobilityId": "b2cda8a6606e0cee", "scanner": "scanner-primary", "fingerprint": "c8fa18e60ab416cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d2d53f917e35803", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/test/unit/lib/analyzer/boundary-clustering-scope.test.ts:5"}, "properties": {"repobilityId": "f080c3e34d85e553", "scanner": "scanner-primary", "fingerprint": "9d2d53f917e35803", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a6060e34362ea92", "level": "note", "message": {"text": "Legacy-named symbol `monthsOld` in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:72"}, "properties": {"repobilityId": "11e28f9a64e8637c", "scanner": "scanner-primary", "fingerprint": "1a6060e34362ea92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d1543efc6b48a420", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/test/unit/lib/analyzer/recency-graduated-penalty.test.ts:176"}, "properties": {"repobilityId": "d9f15e88876e0285", "scanner": "scanner-primary", "fingerprint": "d1543efc6b48a420", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d413f1531c557240", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/test/scripts/regression-test.js:61"}, "properties": {"repobilityId": "de4eafa9ad41bf7f", "scanner": "scanner-primary", "fingerprint": "d413f1531c557240", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52149c2f43d53341", "level": "note", "message": {"text": "Legacy-named symbol `Calibration_Baseline_v1` in apps/web/test/calibration/framing-symmetry.test.ts:39"}, "properties": {"repobilityId": "4c8fe7d5f720e60f", "scanner": "scanner-primary", "fingerprint": "52149c2f43d53341", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8534aedddc4987f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/health/route.ts:8"}, "properties": {"repobilityId": "f6b8a4591226fa3c", "scanner": "scanner-primary", "fingerprint": "8534aedddc4987f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d20317700ebef526", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/admin/invites/[code]/route.ts:127"}, "properties": {"repobilityId": "67cd3a9ce3101d93", "scanner": "scanner-primary", "fingerprint": "d20317700ebef526", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9164acaf9c152d6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/route.ts:60"}, "properties": {"repobilityId": "2e2eda03fba518ae", "scanner": "scanner-primary", "fingerprint": "9164acaf9c152d6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e935002a7473a26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/analyze/status/route.ts:27"}, "properties": {"repobilityId": "ac83d2a76ab4a938", "scanner": "scanner-primary", "fingerprint": "5e935002a7473a26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26d4b211f73d6853", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/route.ts:23"}, "properties": {"repobilityId": "e5a03e47bdf92209", "scanner": "scanner-primary", "fingerprint": "26d4b211f73d6853", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a945d029667c3e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/summary/route.ts:24"}, "properties": {"repobilityId": "0d9b081abd252992", "scanner": "scanner-primary", "fingerprint": "2a945d029667c3e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c0478b6f53d7439", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/metrics/quality-health/route.ts:24"}, "properties": {"repobilityId": "0f013748dc1c8f33", "scanner": "scanner-primary", "fingerprint": "5c0478b6f53d7439", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd8be90ace7bc7e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/route.ts:43"}, "properties": {"repobilityId": "b6b445a3cb84576e", "scanner": "scanner-primary", "fingerprint": "cd8be90ace7bc7e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04e450193298fc0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/route.ts:35"}, "properties": {"repobilityId": "683587cd64ecf055", "scanner": "scanner-primary", "fingerprint": "04e450193298fc0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-053ef76044588818", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/route.ts:37"}, "properties": {"repobilityId": "77e464978a5161ef", "scanner": "scanner-primary", "fingerprint": "053ef76044588818", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d6d201ed3aa9db0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/jobs/[id]/events/history/route.ts:36"}, "properties": {"repobilityId": "aaf5c4ad35043c80", "scanner": "scanner-primary", "fingerprint": "d6d201ed3aa9db0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03d47f89ef98de4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/fh/version/route.ts:8"}, "properties": {"repobilityId": "c886f530e26e79bd", "scanner": "scanner-primary", "fingerprint": "03d47f89ef98de4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3920d2b9e07dd218", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/admin/source-reliability/route.ts:141"}, "properties": {"repobilityId": "3388052852382c72", "scanner": "scanner-primary", "fingerprint": "3920d2b9e07dd218", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a47f5faee322a186", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/app/admin/page.tsx:61"}, "properties": {"repobilityId": "e02ab5b654776b12", "scanner": "scanner-primary", "fingerprint": "a47f5faee322a186", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bb60dfa6d98c434", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/config/page.tsx:2728"}, "properties": {"repobilityId": "719f2e4310f555e2", "scanner": "scanner-primary", "fingerprint": "3bb60dfa6d98c434", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c1d1b88c903f9205", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/source-reliability/page.tsx:243"}, "properties": {"repobilityId": "d46b2c0b49f9b888", "scanner": "scanner-primary", "fingerprint": "c1d1b88c903f9205", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e2f40e10105c6e7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/admin/quality-health/page.tsx:240"}, "properties": {"repobilityId": "5b52e350bf547b9e", "scanner": "scanner-primary", "fingerprint": "2e2f40e10105c6e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc128f14d5487bb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/web-search.ts:319"}, "properties": {"repobilityId": "bb3568c41d9cc49b", "scanner": "scanner-primary", "fingerprint": "bc128f14d5487bb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ae32ca794533c18", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/fact-checker-service.ts:160"}, "properties": {"repobilityId": "0175e3d0e4481147", "scanner": "scanner-primary", "fingerprint": "0ae32ca794533c18", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7963baa1ad7721cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/retrieval.ts:831"}, "properties": {"repobilityId": "2686724f3a9f334c", "scanner": "scanner-primary", "fingerprint": "7963baa1ad7721cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91b144395255c800", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/internal-runner-queue.ts:385"}, "properties": {"repobilityId": "d92f79c8b2c4f829", "scanner": "scanner-primary", "fingerprint": "91b144395255c800", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-436f40e305a2ad75", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/internal-runner-queue.ts:171"}, "properties": {"repobilityId": "9f564f793b2fdb9d", "scanner": "scanner-primary", "fingerprint": "436f40e305a2ad75", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a479f00467779c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/config-schemas.ts:256"}, "properties": {"repobilityId": "3ee0b8f12859be68", "scanner": "scanner-primary", "fingerprint": "5a479f00467779c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc4a94c2085a03ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/analyzer/config.ts:118"}, "properties": {"repobilityId": "856a9692a3500470", "scanner": "scanner-primary", "fingerprint": "fc4a94c2085a03ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58c80ed6589c85eb", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/src/lib/analyzer/claim-extraction-stage.ts:66"}, "properties": {"repobilityId": "ea2150eb45cc4a9f", "scanner": "scanner-primary", "fingerprint": "58c80ed6589c85eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56c2e418c3751a6e", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/verdict-stage.ts:1402"}, "properties": {"repobilityId": "860b721a1996b58d", "scanner": "scanner-primary", "fingerprint": "56c2e418c3751a6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41217d6bb8adb0a6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-extraction-stage.ts:269"}, "properties": {"repobilityId": "bcd5535482fa54cc", "scanner": "scanner-primary", "fingerprint": "41217d6bb8adb0a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7bfeafbeb3d1700f", "level": "note", "message": {"text": "Legacy-named symbol `monthsOld` in apps/web/src/lib/analyzer/evidence-recency.ts:43"}, "properties": {"repobilityId": "93349ec8991cc2c5", "scanner": "scanner-primary", "fingerprint": "7bfeafbeb3d1700f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0995e660f0b1359c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/research-orchestrator.ts:2096"}, "properties": {"repobilityId": "79f5b545dadf4b49", "scanner": "scanner-primary", "fingerprint": "0995e660f0b1359c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a20f56187e4f48d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/aggregation-stage.ts:241"}, "properties": {"repobilityId": "02386f37f9d0f0b7", "scanner": "scanner-primary", "fingerprint": "9a20f56187e4f48d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f55b3357f484a947", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/lib/analyzer/metrics.ts:202"}, "properties": {"repobilityId": "44e0dc03e7f044cb", "scanner": "scanner-primary", "fingerprint": "f55b3357f484a947", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59ea26981302a85a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/analyzer/confidence-calibration.ts:262"}, "properties": {"repobilityId": "597c2217731347a0", "scanner": "scanner-primary", "fingerprint": "59ea26981302a85a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-122bb010a21f6079", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/source-reliability/sr-eval-engine.ts:462"}, "properties": {"repobilityId": "3790995c8cd2372b", "scanner": "scanner-primary", "fingerprint": "122bb010a21f6079", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e611575baf485ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/source-reliability/sr-eval-evidence-pack.ts:273"}, "properties": {"repobilityId": "d7af21a09afab7f1", "scanner": "scanner-primary", "fingerprint": "3e611575baf485ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0d9737325ab6a63", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/source-reliability/sr-eval-prompts.ts:14"}, "properties": {"repobilityId": "0ef8fb0549411226", "scanner": "scanner-primary", "fingerprint": "f0d9737325ab6a63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ad4f1c1aeb817c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/calibration/paired-job-audit.ts:79"}, "properties": {"repobilityId": "8ac5cf2abb1a35d9", "scanner": "scanner-primary", "fingerprint": "4ad4f1c1aeb817c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7e35f5f7abbab56", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-validation-matrix.js:31"}, "properties": {"repobilityId": "f6162aaa92a3b9b3", "scanner": "scanner-primary", "fingerprint": "c7e35f5f7abbab56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5e57fa37d5171b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch.cjs:28"}, "properties": {"repobilityId": "a1b4fad007978ba0", "scanner": "scanner-primary", "fingerprint": "d5e57fa37d5171b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11944a172a1a74c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/diag/best-commit-batch2.cjs:19"}, "properties": {"repobilityId": "87dd47a6b58314b2", "scanner": "scanner-primary", "fingerprint": "11944a172a1a74c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5c3d706a1147ebc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/validation/extract-validation-summary.js:72"}, "properties": {"repobilityId": "1515d0e909db7bd0", "scanner": "scanner-primary", "fingerprint": "c5c3d706a1147ebc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-662a83727e860800", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 Docs/xwiki-pages/scripts/xar_to_xwiki_tree.py:103"}, "properties": {"repobilityId": "8473dc0a0d3186b4", "scanner": "scanner-primary", "fingerprint": "662a83727e860800", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5880cb5542d615cd", "level": "note", "message": {"text": "94 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7547c8423eeacaba", "scanner": "scanner-primary", "fingerprint": "5880cb5542d615cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "121a7644eadffdb3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c31f0e1355c5a498", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2082ebcbc5238c31", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}