{"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-c4db06ab4878a5c4", "name": "Possibly dead Python function: allocate", "shortDescription": {"text": "Possibly dead Python function: allocate"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3534fc7ec0a0e39a", "name": "Possibly dead Python function: store_result", "shortDescription": {"text": "Possibly dead Python function: store_result"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c18415b40ca28ec1", "name": "Possibly dead Python function: secure_process_text", "shortDescription": {"text": "Possibly dead Python function: secure_process_text"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a45424a44621f3e2", "name": "Stray `console.log` in TS/JS \u2014 test-50-scenarios.ts:546", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-50-scenarios.ts:546"}, "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-2065a4062ca7686b", "name": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/scripts/ollama-sandbox.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/scripts/ollama-sandbox.ts:75"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ffe03d14f45b503", "name": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/eval/run-eval.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/eval/run-eval.ts:131"}, "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-7e6b4938f426f648", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:2", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:2"}, "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-bd1c8defd7a7e666", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/request-logger.ts:179", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/request-logger.ts:179"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68d75cf5eb270510", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/fix-api-keys-table.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/fix-api-keys-table.ts:16"}, "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-5ce7fbfef792e86f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/list-api-keys.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/list-api-keys.ts:12"}, "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-1d4f158be54d05ac", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/seed.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/seed.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-e9445e19ede43c91", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/check-and-create-tables.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/check-and-create-tables.ts:16"}, "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-43180407965a3de4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-test-key.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-test-key.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d4cdcf8a50ba487", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-api-key.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-api-key.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ee5dd8da22883c2", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/auto-migrate.ts:554", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/auto-migrate.ts:554"}, "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-5fa29d6d71707115", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/LandingNav.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/LandingNav.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-794639ff05c97125", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/Sidebar.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/Sidebar.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b733f5a7b94caf3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/dashboard/src/app/page.tsx:269", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/dashboard/src/app/page.tsx:269"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8bb191a3ced5eb3b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/settings/team/page.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/settings/team/page.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-abe376bb0820e9bc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/legal/gdpr/page.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/legal/gdpr/page.tsx:358"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38fe7bdd5ddec6e2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/demo/page.tsx:1055", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/demo/page.tsx:1055"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-446dd1130d5eb2ce", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/page.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/page.tsx:326"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b659624a28f86cc4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/users/page.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/users/page.tsx:296"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4e0371bc1c0129a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/audit-log/page.tsx:445", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/audit-log/page.tsx:445"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0fd7144e3d8a388", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/user-activity/page.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/user-activity/page.tsx:222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-646717fe63d7ff84", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/departments/page.tsx:680", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/departments/page.tsx:680"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb6be260c0be731d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/entity-dictionary/page.tsx:403", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/entity-dictionary/page.tsx:403"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f7ffe06cc4b8430", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/policies/page.tsx:415", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/policies/page.tsx:415"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3f8a5ca845f6081", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/enrollment/page.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/enrollment/page.tsx:373"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-073242789c5c71b6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/controls/page.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/controls/page.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26045b5fc73bc317", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/feature-flags/page.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/feature-flags/page.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2563f6c8d411fa9d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/webhooks/page.tsx:495", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/webhooks/page.tsx:495"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48615f5289f611e9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/plugins/page.tsx:313", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/plugins/page.tsx:313"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-65ead5cf7a319c72", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/vite.config.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/vite.config.ts:70"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8490a0b89d404e3a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/interceptor-test.ts:528", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/interceptor-test.ts:528"}, "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-48273c5ea89a53d2", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/unified-pipeline.test.ts:432", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/unified-pipeline.test.ts:432"}, "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-58b489a409841cae", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/runon-env-pipeline.test.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/runon-env-pipeline.test.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-373945489f8b03bf", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/contextual-intelligence.test.ts:1993", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/contextual-intelligence.test.ts:1993"}, "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-2f2cfcd0c5b1687e", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/modaglobal-scenario.test.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/modaglobal-scenario.test.ts:109"}, "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-adfc304f2aa51c03", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/100-scenarios.test.ts:1976", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/100-scenarios.test.ts:1976"}, "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-28a9787de0609aee", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/credential-detection.test.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/credential-detection.test.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-405c522d876d942e", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/detection-model-comparison.test.ts:1918", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/detection-model-comparison.test.ts:1918"}, "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-8d36fa00781b548a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/detection.spec.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/detection.spec.ts:59"}, "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-b5e6536bcb457209", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/sidepanel.spec.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/sidepanel.spec.ts:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-039d6743947332d3", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/false-positive.spec.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/false-positive.spec.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-a6445d31184f87d1", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/drive.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/drive.ts:109"}, "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-fb7210ad84dbbd5a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/injection.spec.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/injection.spec.ts:33"}, "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-73db4e5870d38514", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/selector-health.spec.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/selector-health.spec.ts:144"}, "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-ca32c175389bd3e2", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/comprehensive-detection.spec.ts:396", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/comprehensive-detection.spec.ts:396"}, "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-7af512c21ad0006d", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/intelligence/inference.js:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/intelligence/inference.js:129"}, "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-d0e48d604a0691dc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/OnboardingOverlay.tsx:483", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/OnboardingOverlay.tsx:483"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c19513f49e4c99b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/App.tsx:2453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/App.tsx:2453"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78233b69179830c2", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/sidepanel/App.tsx:321", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/sidepanel/App.tsx:321"}, "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-d7b637f801c2086f", "name": "TODO/FIXME marker in shipping code \u2014 apps/extension/src/agent/model-runtime.ts:190", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/extension/src/agent/model-runtime.ts:190"}, "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-0600e65c20ad40e4", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/auth.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/auth.ts:15"}, "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-15afa2d98fc452e2", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/index.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/index.ts:78"}, "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-d3d2de3581222541", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/proxy-handler.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/proxy-handler.ts: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-3d4cbcc4b282726d", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/local-llm-detector.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/local-llm-detector.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-6b1ea3c467b8820a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/queue.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/queue.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e72c258c6b646811", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/detection-api.ts:209", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/detection-api.ts:209"}, "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-814d42d6a9adee2a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/circuit-breaker.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/circuit-breaker.ts:159"}, "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-5cb4930db6a28ddd", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/main-world.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/main-world.ts:73"}, "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-6ce05d0c05b9299d", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/index.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/index.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-fbeb588c7f4d3a51", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/adapters/chatgpt.ts:207", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/adapters/chatgpt.ts:207"}, "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-578e5ace701ef1e9", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:169", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:169"}, "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-825e046b54c3597a", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/entity-dictionary.ts:236", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/entity-dictionary.ts:236"}, "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-9f46c8d34f100e4e", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/judge.ts:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/judge.ts:251"}, "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-76542bb33da5badb", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/semantic-classifier.ts:738", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/semantic-classifier.ts:738"}, "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-be935420f9a2ad99", "name": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/tier3-server-adapter.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/tier3-server-adapter.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab3e6f079bceb2e8", "name": "Stray `console.log` in TS/JS \u2014 apps/vscode-extension/esbuild.config.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/vscode-extension/esbuild.config.js:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9596f030c6f43c6", "name": "Stray `console.log` in TS/JS \u2014 apps/mcp-proxy/src/index.ts:176", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mcp-proxy/src/index.ts:176"}, "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-40e64673dbd37f20", "name": "Stray `console.log` in TS/JS \u2014 scripts/bench-all-models.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bench-all-models.ts:186"}, "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-72ed917358019c7f", "name": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test.ts:16"}, "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-29a156d6564d40c4", "name": "Stray `console.log` in TS/JS \u2014 scripts/bench-tier2.ts:271", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bench-tier2.ts:271"}, "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-11aafdcb8ccc6e64", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-context-qa.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-context-qa.ts:104"}, "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-817a734f1d842d42", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-wire.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-wire.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a08ff873cf773270", "name": "Stray `console.log` in TS/JS \u2014 scripts/demo.ts:381", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo.ts:381"}, "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-9713c8ff059ac860", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-live-qa.ts:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-live-qa.ts:251"}, "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-a396a0cb97e1ca37", "name": "Stray `console.log` in TS/JS \u2014 scripts/context-qa-scenarios.ts:734", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/context-qa-scenarios.ts:734"}, "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-0d4217145d571317", "name": "Stray `console.log` in TS/JS \u2014 scripts/probe-classifier.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/probe-classifier.ts:36"}, "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-1930718512e5fade", "name": "Privileged port 1001 in use", "shortDescription": {"text": "Privileged port 1001 in use"}, "fullDescription": {"text": "Port 1001 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3103caee939e04fd", "name": "Privileged port 999 in use", "shortDescription": {"text": "Privileged port 999 in use"}, "fullDescription": {"text": "Port 999 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aad1c10f98579c5e", "name": "Docker base image is tag-pinned but not digest-pinned: node:20.18.3-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.18.3-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-427dcc5a6d0f69bc", "name": "Dockerfile runs as root: apps/dashboard/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/dashboard/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-382f55b4d1922ff6", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05abd31982327c09", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36e73448d4c79b03", "name": "Insecure pattern 'direct_innerhtml_assignment' in demo/live-simulation.html:907", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo/live-simulation.html:907"}, "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-df49fabc9d831cf8", "name": "Insecure pattern 'dangerous_innerhtml' in apps/dashboard/src/app/page.tsx:269", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/dashboard/src/app/page.tsx:269"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2fcdf3f00a3cbe93", "name": "Insecure pattern 'weak_hash' in apps/extension/intelligence/expansion-tech.json:3412", "shortDescription": {"text": "Insecure pattern 'weak_hash' in apps/extension/intelligence/expansion-tech.json:3412"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6583d69329afb24e", "name": "Insecure pattern 'node_child_process' in apps/extension/scripts/dev-loop.mjs:21", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/dev-loop.mjs: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-a5f5c27faaccc06e", "name": "Insecure pattern 'node_child_process' in apps/extension/scripts/test-report.mjs:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/test-report.mjs:17"}, "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-604bcc38d5b794ff", "name": "Insecure pattern 'node_child_process' in apps/extension/scripts/run-pipeline.mjs:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/run-pipeline.mjs: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-56ab506562977997", "name": "Insecure pattern 'private_key_in_repo' in apps/extension/src/content/main-world/fake-data.ts:651", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in apps/extension/src/content/main-world/fake-data.ts:651"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-61c878abe4495258", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/coaching-toast.ts:252", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/coaching-toast.ts:252"}, "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-9aa395a96928db06", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/sensitivity-badge.ts:179", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/sensitivity-badge.ts:179"}, "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-57363f7344b66e96", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/entity-tooltip.ts:223", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/entity-tooltip.ts:223"}, "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-9848649056613d80", "name": "Insecure pattern 'domparser_html_parse' in apps/extension/src/content/capture/clipboard-monitor.ts:55", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in apps/extension/src/content/capture/clipboard-monitor.ts:55"}, "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-8fb0e6f091f026d6", "name": "Insecure pattern 'weak_hash' in apps/extension/src/detection/semantic-classifier.ts:637", "shortDescription": {"text": "Insecure pattern 'weak_hash' in apps/extension/src/detection/semantic-classifier.ts:637"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64a0b9af22d7ed64", "name": "Insecure pattern 'private_key_in_repo' in apps/extension/src/detection/fake-generator.ts:334", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in apps/extension/src/detection/fake-generator.ts:334"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-40280c15bee7c8ab", "name": "Insecure pattern 'private_key_in_repo' in apps/detection/src/pseudonymizer.py:296", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in apps/detection/src/pseudonymizer.py:296"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-eb1226521aa0ae2a", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/demo.html:907", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/demo.html:907"}, "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-7df5e72fa4d653bd", "name": "Possible secret in scripts/context-qa-scenarios.ts", "shortDescription": {"text": "Possible secret in scripts/context-qa-scenarios.ts"}, "fullDescription": {"text": "Detected pattern matching github_token. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-774d0ca942c19d29", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/bench-gemini-nano.html:312", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/bench-gemini-nano.html:312"}, "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-a35df7c7e9a1e1e9", "name": "Insecure pattern 'new_function_used' in packages/plugin-sdk/src/sandbox.ts:50", "shortDescription": {"text": "Insecure pattern 'new_function_used' in packages/plugin-sdk/src/sandbox.ts:50"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1170017a085f60a7", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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": "low", "confidence": 1.0}}, {"id": "scanner-1c090c7bfc3f2fc8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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": "low", "confidence": 1.0}}, {"id": "scanner-168d90d0da1bc76c", "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-de84852615f762ba", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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": "low", "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/checkout@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": "low", "confidence": 1.0}}, {"id": "scanner-ad39ee692cd172b9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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": "low", "confidence": 1.0}}, {"id": "scanner-c3196f73028d2523", "name": "Very large file: apps/api/src/proxy/pseudonymizer.ts (1259 lines)", "shortDescription": {"text": "Very large file: apps/api/src/proxy/pseudonymizer.ts (1259 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-2001689a3eb346ee", "name": "Very large file: apps/api/src/routes/admin.ts (2042 lines)", "shortDescription": {"text": "Very large file: apps/api/src/routes/admin.ts (2042 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-ab2ad2769215d8a3", "name": "Very large file: apps/dashboard/src/app/demo/page.tsx (1487 lines)", "shortDescription": {"text": "Very large file: apps/dashboard/src/app/demo/page.tsx (1487 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-ac3b0f1a629f8ed7", "name": "Very large file: apps/extension/tests/interceptor-test.ts (1137 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/interceptor-test.ts (1137 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-d6a85059337e8d07", "name": "Very large file: apps/extension/tests/e2e-full-pipeline.test.ts (1423 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/e2e-full-pipeline.test.ts (1423 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-08192d11464f65ba", "name": "Very large file: apps/extension/tests/contextual-intelligence.test.ts (2124 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/contextual-intelligence.test.ts (2124 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-5fe7d89e74fb7880", "name": "Very large file: apps/extension/tests/100-scenarios.test.ts (2007 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/100-scenarios.test.ts (2007 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-7a95371d2e967dff", "name": "Very large file: apps/extension/tests/ceo-legal-scenarios.test.ts (1186 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/ceo-legal-scenarios.test.ts (1186 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-00766259d66567d7", "name": "Very large file: apps/extension/tests/detection-model-comparison.test.ts (2100 lines)", "shortDescription": {"text": "Very large file: apps/extension/tests/detection-model-comparison.test.ts (2100 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-4155551d6e26c24a", "name": "Very large file: apps/extension/src/sidepanel/App.tsx (2646 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/sidepanel/App.tsx (2646 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-e0e0908da763db65", "name": "Very large file: apps/extension/src/worker/index.ts (4036 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/worker/index.ts (4036 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-049c98610f226716", "name": "Very large file: apps/extension/src/content/main-world.ts (6632 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/content/main-world.ts (6632 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-7c3018ed23e487ad", "name": "Very large file: apps/extension/src/content/index.ts (1341 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/content/index.ts (1341 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-21bb777a937f3926", "name": "Very large file: apps/extension/src/detection/semantic-classifier.ts (864 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/detection/semantic-classifier.ts (864 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-cf0522301781f999", "name": "Very large file: apps/extension/src/detection/fallback-regex.ts (1320 lines)", "shortDescription": {"text": "Very large file: apps/extension/src/detection/fallback-regex.ts (1320 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-9bfbe6abf391b71f", "name": "Very large file: scripts/context-qa-scenarios.ts (1794 lines)", "shortDescription": {"text": "Very large file: scripts/context-qa-scenarios.ts (1794 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "103 tests / 417 src (ratio 0.25)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d12f64706059a74", "name": "Node manifest has dependencies but no lockfile: v0.3-foundation/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: v0.3-foundation/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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/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-ec82f9367de34433", "name": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/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-16829d81c356f9c7", "name": "Node manifest has dependencies but no lockfile: apps/extension/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/extension/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-9a7a40ed1a8c197c", "name": "Node manifest has dependencies but no lockfile: apps/vscode-extension/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/vscode-extension/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-d90eb2c45cf1f7d4", "name": "Node manifest has dependencies but no lockfile: apps/mcp-proxy/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/mcp-proxy/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-cb3e52667c84fb86", "name": "Node manifest has dependencies but no lockfile: packages/types/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/types/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-7b85b0a5c9a918e4", "name": "Node manifest has dependencies but no lockfile: packages/crypto/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/crypto/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-eddecaa766cadff2", "name": "Node manifest has dependencies but no lockfile: packages/config/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/config/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-ba8888b50aceaae7", "name": "Node manifest has dependencies but no lockfile: packages/plugin-sdk/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/plugin-sdk/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 594 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 432 placeholder/mock markers across 92 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, 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-47f1755c70e1a8f0", "name": "Agent instruction/config may expose a secret: .claude/skills/irongate-tester.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/irongate-tester.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-d3478368f998dc5f", "name": "Commented-code block (6 lines) in eslint.config.js:24", "shortDescription": {"text": "Commented-code block (6 lines) in eslint.config.js: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-665b99fda3d287d7", "name": "Commented-code block (5 lines) in v0.3-foundation/src/core/dedupe/resolver.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/core/dedupe/resolver.ts:6"}, "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-7047b6841c4cd3e9", "name": "Commented-code block (5 lines) in v0.3-foundation/src/core/detectors/interface.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/core/detectors/interface.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c91e0f3893d9370", "name": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/messages.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/messages.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dce2e993128c4569", "name": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/evidence.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/evidence.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6181484d9211af2d", "name": "Commented-code block (7 lines) in apps/api/src/index.ts:399", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/index.ts:399"}, "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-707cd333ccca539f", "name": "Commented-code block (7 lines) in apps/api/src/monitoring/query-anomaly-detector.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/monitoring/query-anomaly-detector.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7546c071554177f", "name": "Commented-code block (7 lines) in apps/api/src/monitoring/breach-detection.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/monitoring/breach-detection.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-385087a249ca9b09", "name": "Commented-code block (8 lines) in apps/api/src/monitoring/security-alerts.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/monitoring/security-alerts.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8797539a8eebffdf", "name": "Commented-code block (6 lines) in apps/api/src/middleware/jwt-revocation.ts:101", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/middleware/jwt-revocation.ts:101"}, "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-2f5b1f004028c298", "name": "Commented-code block (5 lines) in apps/api/src/proxy/llm-router.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/proxy/llm-router.ts:10"}, "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-1e63a371acba5093", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/gemini.ts:145", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/gemini.ts:145"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e738219cb398204f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/openai.ts:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/openai.ts:138"}, "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-a5ce1bf5a4d04d1f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/anthropic.ts:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/anthropic.ts:138"}, "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-3548870c6d0c3178", "name": "Commented-code block (5 lines) in apps/api/src/lib/token-encryption.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/token-encryption.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6cb0566aeff545b8", "name": "Commented-code block (5 lines) in apps/api/src/routes/extension-auth.ts:625", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/extension-auth.ts:625"}, "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-5ed6bf51e6581a1b", "name": "Commented-code block (6 lines) in apps/api/src/routes/notifications.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/routes/notifications.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-faff48a822d2ab10", "name": "Commented-code block (7 lines) in apps/api/src/routes/invites.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/routes/invites.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bbf8e816f0feda0", "name": "Commented-code block (8 lines) in apps/api/src/routes/audit.ts:345", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/routes/audit.ts:345"}, "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-17bab79688e65295", "name": "Commented-code block (8 lines) in apps/api/src/routes/gateway.ts:10", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/routes/gateway.ts:10"}, "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-d62175525316b91a", "name": "Commented-code block (6 lines) in apps/api/src/routes/admin.ts:170", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/routes/admin.ts:170"}, "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-818fe745fe4a18e5", "name": "Commented-code block (11 lines) in apps/api/src/routes/mdm-oauth.ts:5", "shortDescription": {"text": "Commented-code block (11 lines) in apps/api/src/routes/mdm-oauth.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-e5a43d84215abb51", "name": "Commented-code block (6 lines) in apps/api/src/routes/proxy.ts:37", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/routes/proxy.ts:37"}, "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-b253fd95650a3a9a", "name": "Commented-code block (6 lines) in apps/api/src/services/email.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/email.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a399657158ab4f3", "name": "Commented-code block (6 lines) in apps/api/src/services/feedback-processor.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/feedback-processor.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3da35ddbf5f3f79", "name": "Commented-code block (8 lines) in apps/api/src/services/siem-forwarder.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/services/siem-forwarder.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95c95ccb18610f29", "name": "Commented-code block (6 lines) in apps/api/src/services/alert-system.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/alert-system.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d247cb51e2c36260", "name": "Commented-code block (5 lines) in apps/api/src/services/jamf-pro.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/services/jamf-pro.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-a414df6b32594820", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/jamf-pro.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/jamf-pro.ts:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81aa942e5097256b", "name": "Commented-code block (6 lines) in apps/api/src/services/audit-chain.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/audit-chain.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c19cc8386301b926", "name": "Commented-code block (7 lines) in apps/api/src/services/inference-engine.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/services/inference-engine.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93bd027fc71d0688", "name": "Commented-code block (7 lines) in apps/api/src/services/signing-key.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/services/signing-key.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f80194418fe1f2c6", "name": "Commented-code block (5 lines) in apps/api/src/services/plugin-loader.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/services/plugin-loader.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f20002dae6e257a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/google-workspace.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/google-workspace.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5e869e61430bf6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/microsoft-intune.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/microsoft-intune.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d821b21de1703f1b", "name": "Commented-code block (6 lines) in apps/api/src/services/sensitivity-graph.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/sensitivity-graph.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8b6f7762203e6a0", "name": "Commented-code block (6 lines) in apps/api/src/services/webhook-dispatcher.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/webhook-dispatcher.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17aca870ebeac065", "name": "Commented-code block (6 lines) in apps/api/src/services/trust-score.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/services/trust-score.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af18e64e2c0235e0", "name": "Commented-code block (5 lines) in apps/api/src/db/schema.ts:158", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/db/schema.ts:158"}, "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-da560feb3ec48e55", "name": "Commented-code block (9 lines) in apps/api/src/jobs/data-retention.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/jobs/data-retention.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fe0c32450025462", "name": "Commented-code block (7 lines) in apps/api/src/detection/secret-scanner.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/detection/secret-scanner.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef7beffd4ba5fa9b", "name": "Commented-code block (5 lines) in apps/api/src/detection/intent-classifier.ts:309", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/detection/intent-classifier.ts:309"}, "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-c433a73b92b8961b", "name": "Commented-code block (6 lines) in apps/extension/tests/audit-claims-verification.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/tests/audit-claims-verification.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69808677e72b2c7c", "name": "Commented-code block (5 lines) in apps/extension/tests/real-world-scenarios.test.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/tests/real-world-scenarios.test.ts:41"}, "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-84320e608ee76223", "name": "Commented-code block (5 lines) in apps/extension/tests/chatgpt-dom-only-depseudo.test.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/tests/chatgpt-dom-only-depseudo.test.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-349dbce03ab2dad6", "name": "Legacy-named symbol `submitOld` in apps/extension/tests/fragment-depseudo-fixes.test.ts:363", "shortDescription": {"text": "Legacy-named symbol `submitOld` in apps/extension/tests/fragment-depseudo-fixes.test.ts:363"}, "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-920a7f3647235feb", "name": "Commented-code block (5 lines) in apps/extension/tests/architecture-invariants.test.ts:618", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/tests/architecture-invariants.test.ts:618"}, "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-10886430be48aadb", "name": "Commented-code block (5 lines) in apps/extension/tests/intent-suppression.test.ts:270", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/tests/intent-suppression.test.ts:270"}, "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-d144e601e10089c7", "name": "Commented-code block (7 lines) in apps/extension/tests/def016-substring-tightening.test.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/tests/def016-substring-tightening.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-999ef613d4d62eb5", "name": "Commented-code block (7 lines) in apps/extension/tests/depseudo-corruption.test.ts:9", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/tests/depseudo-corruption.test.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e95e6c81cd04d9ad", "name": "Commented-code block (11 lines) in apps/extension/tests/def016-no-early-return-pii-leak.test.ts:5", "shortDescription": {"text": "Commented-code block (11 lines) in apps/extension/tests/def016-no-early-return-pii-leak.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-35c52ca5f578316a", "name": "Commented-code block (9 lines) in apps/extension/tests/production-bugs-regression.test.ts:676", "shortDescription": {"text": "Commented-code block (9 lines) in apps/extension/tests/production-bugs-regression.test.ts:676"}, "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-73af2017578dee52", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/intelligence/inference.js:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/intelligence/inference.js:125"}, "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-ac60a7e6cf138aaa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/scripts/full-drive.mjs:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/scripts/full-drive.mjs:234"}, "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-e01353107616bb08", "name": "Commented-code block (5 lines) in apps/extension/src/managed-config.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/managed-config.ts:53"}, "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-2bd46324adeeddc1", "name": "Commented-code block (7 lines) in apps/extension/src/api-key-store.ts:226", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/src/api-key-store.ts:226"}, "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-872c8276ff746e42", "name": "Commented-code block (7 lines) in apps/extension/src/security/kill-switch-poller.ts:106", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/src/security/kill-switch-poller.ts:106"}, "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-5ec1e4e25ced426b", "name": "Commented-code block (6 lines) in apps/extension/src/sidepanel/UpgradePrompt.tsx:26", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/sidepanel/UpgradePrompt.tsx:26"}, "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-7ff97f7f60419da3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/sidepanel/DeploymentBadge.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/sidepanel/DeploymentBadge.tsx: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-16e153d1a55abd98", "name": "Commented-code block (5 lines) in apps/extension/src/sidepanel/App.tsx:150", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/sidepanel/App.tsx:150"}, "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-2f905b1b4e0a640d", "name": "Commented-code block (6 lines) in apps/extension/src/shared/event-phase.ts:103", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/shared/event-phase.ts:103"}, "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-67f6d422de54d029", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/agent/model-runtime.ts:216", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/agent/model-runtime.ts:216"}, "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-4270397fef4f3fc5", "name": "Commented-code block (6 lines) in apps/extension/src/worker/api-client.ts:119", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/api-client.ts:119"}, "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-32bd309c0ea56220", "name": "Commented-code block (5 lines) in apps/extension/src/worker/index.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/index.ts:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da4993b2eeaa2699", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/index.ts:2201", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/index.ts:2201"}, "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-2d1c094d6fce9533", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/local-llm-detector.ts:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/local-llm-detector.ts:115"}, "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-1aefa0210e692efd", "name": "Commented-code block (5 lines) in apps/extension/src/worker/tab-state.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/tab-state.ts:25"}, "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-1f462768d3b14aae", "name": "Commented-code block (6 lines) in apps/extension/src/worker/detection-api.ts:52", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/detection-api.ts:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae1827a02e15bfbf", "name": "Commented-code block (5 lines) in apps/extension/src/worker/audit-trail.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/audit-trail.ts:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94c15eac3ccf65d4", "name": "Commented-code block (6 lines) in apps/extension/src/worker/detectors/secret-scanner.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/detectors/secret-scanner.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70a3ca0729b9e6c1", "name": "Commented-code block (5 lines) in apps/extension/src/audit/audit-sink.ts:192", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/audit/audit-sink.ts:192"}, "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-4aebe2477f7f77ce", "name": "Commented-code block (5 lines) in apps/extension/src/audit/audit-buffer.ts:278", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/audit/audit-buffer.ts:278"}, "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-be260be602bd7fdb", "name": "Commented-code block (8 lines) in apps/extension/src/content/main-world.ts:48", "shortDescription": {"text": "Commented-code block (8 lines) in apps/extension/src/content/main-world.ts:48"}, "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-1a9c8dea00667f15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world.ts:3061", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world.ts:3061"}, "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-71483800023de03c", "name": "Commented-code block (6 lines) in apps/extension/src/content/index.ts:266", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/content/index.ts:266"}, "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-9a7b434b4406e0d6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/adapters/registry.ts:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/adapters/registry.ts:105"}, "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-a93ebdf22bf08b08", "name": "Commented-code block (5 lines) in apps/extension/src/content/adapters/chatgpt.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/content/adapters/chatgpt.ts:55"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdf12eeb54bced71", "name": "Commented-code block (7 lines) in apps/extension/src/content/main-world/stream-depseudo.ts:16", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/src/content/main-world/stream-depseudo.ts:16"}, "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-52636a6272bf862f", "name": "Commented-code block (5 lines) in apps/extension/src/content/main-world/turn-coordinator.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/content/main-world/turn-coordinator.ts:63"}, "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-52da121774dda506", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world/turn-coordinator.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world/turn-coordinator.ts:77"}, "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-7f74ac671b2766e5", "name": "Legacy-named symbol `_generateFakeLegacy` in apps/extension/src/content/main-world/fake-data.ts:389", "shortDescription": {"text": "Legacy-named symbol `_generateFakeLegacy` in apps/extension/src/content/main-world/fake-data.ts:389"}, "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-8d35565a0ab8f108", "name": "Commented-code block (6 lines) in apps/extension/src/content/main-world/fake-data.ts:371", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/content/main-world/fake-data.ts:371"}, "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-957c893fb78ce61d", "name": "Commented-code block (5 lines) in apps/extension/src/content/main-world/depseudo-engine.ts:148", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/content/main-world/depseudo-engine.ts:148"}, "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-3272e0334c8e420c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:2"}, "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-b65366909c50b8a0", "name": "Commented-code block (6 lines) in apps/extension/src/content/capture/index.ts:100", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/content/capture/index.ts:100"}, "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-182b282a4642f33c", "name": "Commented-code block (5 lines) in apps/extension/src/detection/intent-context-classifier.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/intent-context-classifier.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa33f9305214b191", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/intent-context-classifier.ts:317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/intent-context-classifier.ts:317"}, "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-b32ce6493378d8e4", "name": "Commented-code block (6 lines) in apps/extension/src/detection/entity-ownership.ts:262", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/entity-ownership.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-a1881fa4e8930e82", "name": "Commented-code block (6 lines) in apps/extension/src/detection/judge.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/judge.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5804ddc6d647b36e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/judge.ts:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/judge.ts:193"}, "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-9393d9ffa71fedec", "name": "Commented-code block (10 lines) in apps/extension/src/detection/intent-suppression.ts:71", "shortDescription": {"text": "Commented-code block (10 lines) in apps/extension/src/detection/intent-suppression.ts:71"}, "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-7df67afdadc4969d", "name": "Commented-code block (5 lines) in apps/extension/src/detection/structural-parser.ts:44", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/structural-parser.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd11ee2b61cde8ad", "name": "Commented-code block (6 lines) in apps/extension/src/detection/tier3-server-adapter.ts:62", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/tier3-server-adapter.ts:62"}, "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-ebd1976ed9c34502", "name": "Commented-code block (6 lines) in apps/extension/src/detection/scorer.ts:289", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/scorer.ts:289"}, "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-0c1d7673642980f1", "name": "Commented-code block (6 lines) in apps/extension/src/detection/tier2-adapter.ts:164", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/tier2-adapter.ts:164"}, "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-89c1d672baf50bc1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/tier2-adapter.ts:525", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/tier2-adapter.ts:525"}, "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-27ccfe4d700df25d", "name": "Commented-code block (7 lines) in apps/extension/src/detection/fallback-regex.ts:288", "shortDescription": {"text": "Commented-code block (7 lines) in apps/extension/src/detection/fallback-regex.ts:288"}, "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-5c43e3bc6b9fd326", "name": "Commented-code block (6 lines) in apps/extension/src/detection/contextual-keywords.ts:278", "shortDescription": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/contextual-keywords.ts:278"}, "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-4ac0048c5801f7ba", "name": "Commented-code block (5 lines) in apps/extension/src/detection/types.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/types.ts:47"}, "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-20b6ce179bc7961e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mcp-proxy/src/index.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mcp-proxy/src/index.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7fa81ccd0ee9f476", "name": "Commented-code block (7 lines) in packages/crypto/src/aes-gcm.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in packages/crypto/src/aes-gcm.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f68e97019729b378", "name": "Commented-code block (7 lines) in packages/crypto/src/hmac.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in packages/crypto/src/hmac.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a11e9b4718ff861e", "name": "Commented-code block (8 lines) in packages/crypto/src/hashing.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in packages/crypto/src/hashing.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73cc2cd84b6f1451", "name": "Commented-code block (9 lines) in packages/crypto/src/rbac.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in packages/crypto/src/rbac.ts:6"}, "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-9383ee7fd83942d6", "name": "Commented-code block (8 lines) in packages/crypto/src/kms-encryption.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in packages/crypto/src/kms-encryption.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-09f262ee35f83b36", "name": "58 env vars used in code but missing from .env.example", "shortDescription": {"text": "58 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AGENT_LLM_API_KEY`, `AGENT_LLM_ENDPOINT`, `AGENT_LLM_MODEL`, `ALLOWED_EXTENSION_IDS`, `ALLOWED_ORIGINS`, `AWS_REGION`, `BASE_URL`, `CI` + 50 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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/detection/src/recognizers/matter_number.py:analyze, apps/detection/src/recognizers/opposing_counsel.py:analyze, apps/detection/src/recognizers/privilege_marker.py:analyze\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}}, {"id": "scanner-7b43341c44b60c14", "name": "FastAPI POST `detect_entities` without auth dependency \u2014 apps/detection/src/main.py:367", "shortDescription": {"text": "FastAPI POST `detect_entities` without auth dependency \u2014 apps/detection/src/main.py:367"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-396cd11294ad02ba", "name": "FastAPI POST `score_text` without auth dependency \u2014 apps/detection/src/main.py:436", "shortDescription": {"text": "FastAPI POST `score_text` without auth dependency \u2014 apps/detection/src/main.py:436"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-888b84f1deda8a65", "name": "FastAPI POST `pseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:462", "shortDescription": {"text": "FastAPI POST `pseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:462"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44407f932128d33b", "name": "FastAPI POST `evaluate_policy_endpoint` without auth dependency \u2014 apps/detection/src/main.py:665", "shortDescription": {"text": "FastAPI POST `evaluate_policy_endpoint` without auth dependency \u2014 apps/detection/src/main.py:665"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc0e0e22010771c2", "name": "FastAPI POST `add_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:761", "shortDescription": {"text": "FastAPI POST `add_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:761"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad438679ed65b00c", "name": "FastAPI POST `bulk_import_entity_dictionary` without auth dependency \u2014 apps/detection/src/main.py:794", "shortDescription": {"text": "FastAPI POST `bulk_import_entity_dictionary` without auth dependency \u2014 apps/detection/src/main.py:794"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f856b8d40e9a7d5", "name": "FastAPI DELETE `delete_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:830", "shortDescription": {"text": "FastAPI DELETE `delete_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:830"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-213f743f61a2e237", "name": "FastAPI POST `depseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:929", "shortDescription": {"text": "FastAPI POST `depseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:929"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-86306d4473b6451a", "name": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/scenario-test.mjs:40)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/scenario-test.mjs:40)"}, "fullDescription": {"text": "`apps/extension/tests/e2e/scenario-test.mjs:40` calls `POST http://localhost:11434/api/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24e5e7de50b15042", "name": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/tests/e2e/browser-test.mjs:149)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/tests/e2e/browser-test.mjs:149)"}, "fullDescription": {"text": "`apps/extension/tests/e2e/browser-test.mjs:149` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-470ceed4411c53ea", "name": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/browser-test.mjs:173)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/browser-test.mjs:173)"}, "fullDescription": {"text": "`apps/extension/tests/e2e/browser-test.mjs:173` calls `POST http://localhost:11434/api/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0723d49576cb7f5a", "name": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/dev-loop.mjs:203)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/dev-loop.mjs:203)"}, "fullDescription": {"text": "`apps/extension/scripts/dev-loop.mjs:203` calls `GET http://localhost:${MOCK_PORT}/api/intercepted` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:/<p>/api/intercepted`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-024828347158509e", "name": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/run-pipeline.mjs:67)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/run-pipeline.mjs:67)"}, "fullDescription": {"text": "`apps/extension/scripts/run-pipeline.mjs:67` calls `GET http://localhost:${MOCK_PORT}/api/intercepted` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:/<p>/api/intercepted`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63518c69fddb393e", "name": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:213)", "shortDescription": {"text": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:213)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:213` calls `GET /admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4d1eb135d87e1054", "name": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:219)", "shortDescription": {"text": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:219)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:219` calls `GET /admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dbc33e8125fb41d8", "name": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:225)", "shortDescription": {"text": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:225)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:225` calls `POST /admin/webhooks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/webhooks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2836b8006d426a7", "name": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:231)", "shortDescription": {"text": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:231)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:231` calls `POST /admin/webhooks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/webhooks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1440792424d63e5a", "name": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:237)", "shortDescription": {"text": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:237)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:237` calls `PUT /admin/siem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/siem`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20497b0875d65cc3", "name": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:243)", "shortDescription": {"text": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:243)"}, "fullDescription": {"text": "`apps/api/tests/rbac-enforcement.test.ts:243` calls `PUT /admin/siem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/siem`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcfa6df52f1aa429", "name": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:117)", "shortDescription": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:117)"}, "fullDescription": {"text": "`apps/api/tests/middleware.test.ts:117` calls `GET /admin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c19d229b84523c0b", "name": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:131)", "shortDescription": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:131)"}, "fullDescription": {"text": "`apps/api/tests/middleware.test.ts:131` calls `GET /admin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eaef87a87fd6021b", "name": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:143)", "shortDescription": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:143)"}, "fullDescription": {"text": "`apps/api/tests/middleware.test.ts:143` calls `GET /admin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23314866c4094629", "name": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:61)", "shortDescription": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:61)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:61` calls `POST /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7f458cb14bda1d32", "name": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:83)", "shortDescription": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:83)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:83` calls `POST /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76673fd44e312572", "name": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:107)", "shortDescription": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:107)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:107` calls `POST /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53abd3de715330ba", "name": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:119)", "shortDescription": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:119)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:119` calls `POST /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c65dd5da6a01e2ab", "name": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:156)", "shortDescription": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:156)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:156` calls `POST /v1/events/batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events/batch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a5722abccff0d94", "name": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:179)", "shortDescription": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:179)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:179` calls `POST /v1/events/batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events/batch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7e100466d8738b2", "name": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:189)", "shortDescription": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:189)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:189` calls `POST /v1/events/batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events/batch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-47ad3b66bff80ad4", "name": "Dangling fetch: GET /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:205)", "shortDescription": {"text": "Dangling fetch: GET /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:205)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:205` calls `GET /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e477958710dba80f", "name": "Dangling fetch: GET /v1/events?limit=2&offset=0 (apps/api/tests/integration/api-routes.integration.test.ts:213)", "shortDescription": {"text": "Dangling fetch: GET /v1/events?limit=2&offset=0 (apps/api/tests/integration/api-routes.integration.test.ts:213)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:213` calls `GET /v1/events?limit=2&offset=0` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc27f2aa0a730b2f", "name": "Dangling fetch: GET /v1/events?minScore=60 (apps/api/tests/integration/api-routes.integration.test.ts:220)", "shortDescription": {"text": "Dangling fetch: GET /v1/events?minScore=60 (apps/api/tests/integration/api-routes.integration.test.ts:220)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:220` calls `GET /v1/events?minScore=60` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38eecef591f1f688", "name": "Dangling fetch: GET /v1/events?aiToolId=claude (apps/api/tests/integration/api-routes.integration.test.ts:229)", "shortDescription": {"text": "Dangling fetch: GET /v1/events?aiToolId=claude (apps/api/tests/integration/api-routes.integration.test.ts:229)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:229` calls `GET /v1/events?aiToolId=claude` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3a06b19bcbe26f1", "name": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:244)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:244)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:244` calls `GET /v1/audit/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-562888043eb33dbb", "name": "Dangling fetch: GET /v1/audit/status (apps/api/tests/integration/api-routes.integration.test.ts:255)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/status (apps/api/tests/integration/api-routes.integration.test.ts:255)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:255` calls `GET /v1/audit/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-70f695e82b49c013", "name": "Dangling fetch: GET /v1/audit/export (apps/api/tests/integration/api-routes.integration.test.ts:266)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/export (apps/api/tests/integration/api-routes.integration.test.ts:266)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:266` calls `GET /v1/audit/export` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/export`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44e424063ac3fb30", "name": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:282)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:282)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:282` calls `GET /v1/audit/export/worm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/export/worm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d8db47e35cfb820", "name": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:298)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:298)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:298` calls `GET /v1/audit/export/worm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/export/worm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c99567e774ee6696", "name": "Dangling fetch: GET /v1/audit/verify-signatures (apps/api/tests/integration/api-routes.integration.test.ts:309)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/verify-signatures (apps/api/tests/integration/api-routes.integration.test.ts:309)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:309` calls `GET /v1/audit/verify-signatures` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/verify-signatures`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd95592cbec5aa06", "name": "Dangling fetch: GET /v1/audit/chain?limit=3 (apps/api/tests/integration/api-routes.integration.test.ts:319)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/chain?limit=3 (apps/api/tests/integration/api-routes.integration.test.ts:319)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:319` calls `GET /v1/audit/chain?limit=3` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/chain`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc2ff9d47bfa8d49", "name": "Dangling fetch: GET /v1/reports/exposure?period=30d (apps/api/tests/integration/api-routes.integration.test.ts:335)", "shortDescription": {"text": "Dangling fetch: GET /v1/reports/exposure?period=30d (apps/api/tests/integration/api-routes.integration.test.ts:335)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:335` calls `GET /v1/reports/exposure?period=30d` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reports/exposure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df85dd5ea9dd714d", "name": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:353)", "shortDescription": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:353)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:353` calls `POST /v1/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65b135228b837688", "name": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:373)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:373)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:373` calls `GET /v1/audit/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c8b147ab733ad27a", "name": "Dangling fetch: GET /v1/audit/verify-signature/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:377", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/verify-signature/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:377)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:377` calls `GET /v1/audit/verify-signature/${eventId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/verify-signature/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-88e0561bc0acb587", "name": "Dangling fetch: GET /v1/events/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:384)", "shortDescription": {"text": "Dangling fetch: GET /v1/events/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:384)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:384` calls `GET /v1/events/${eventId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/events/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bfa154d848fb899c", "name": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:391)", "shortDescription": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:391)"}, "fullDescription": {"text": "`apps/api/tests/integration/api-routes.integration.test.ts:391` calls `GET /v1/audit/export/worm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/audit/export/worm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-379340e3e6340f74", "name": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:98)", "shortDescription": {"text": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:98)"}, "fullDescription": {"text": "`apps/api/tests/integration/security-integration.test.ts:98` calls `POST /v1/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4efa6ac743214a9", "name": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:127)", "shortDescription": {"text": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:127)"}, "fullDescription": {"text": "`apps/api/tests/integration/security-integration.test.ts:127` calls `POST /v1/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04141c3d1c4c31fe", "name": "Dangling fetch: GET /v1/feedback/stats (apps/api/tests/integration/security-integration.test.ts:188)", "shortDescription": {"text": "Dangling fetch: GET /v1/feedback/stats (apps/api/tests/integration/security-integration.test.ts:188)"}, "fullDescription": {"text": "`apps/api/tests/integration/security-integration.test.ts:188` calls `GET /v1/feedback/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/feedback/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf6c087638197bcc", "name": "Dangling fetch: GET http://localhost:${port}/health (apps/api/src/index.ts:618)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:${port}/health (apps/api/src/index.ts:618)"}, "fullDescription": {"text": "`apps/api/src/index.ts:618` calls `GET http://localhost:${port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f136cc6ef60f85f", "name": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/sidepanel/OnboardingOverlay.tsx:140)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/sidepanel/OnboardingOverlay.tsx:140)"}, "fullDescription": {"text": "`apps/extension/src/sidepanel/OnboardingOverlay.tsx:140` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-455f6d58328bc57b", "name": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/worker/index.ts:3303)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/worker/index.ts:3303)"}, "fullDescription": {"text": "`apps/extension/src/worker/index.ts:3303` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6a3fb4f08e148cd6", "name": "Dangling fetch: POST http://localhost:11434/api/generate (scripts/run-live-qa.ts:124)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (scripts/run-live-qa.ts:124)"}, "fullDescription": {"text": "`scripts/run-live-qa.ts:124` calls `POST http://localhost:11434/api/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b880a38e1c5a9ce", "name": "Unused endpoint: POST /v1/detect", "shortDescription": {"text": "Unused endpoint: POST /v1/detect"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/detect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ef640df01da7cd8", "name": "Unused endpoint: POST /v1/score", "shortDescription": {"text": "Unused endpoint: POST /v1/score"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/score` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f3b762790920b73", "name": "Unused endpoint: POST /v1/pseudonymize", "shortDescription": {"text": "Unused endpoint: POST /v1/pseudonymize"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/pseudonymize` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-095a18fe2e44edcf", "name": "Unused endpoint: POST /v1/policy/evaluate", "shortDescription": {"text": "Unused endpoint: POST /v1/policy/evaluate"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/policy/evaluate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4e830a3c8daf0de", "name": "Unused endpoint: GET /v1/entity-dictionary", "shortDescription": {"text": "Unused endpoint: GET /v1/entity-dictionary"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `GET /v1/entity-dictionary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ce1c4e659ee28fe", "name": "Unused endpoint: POST /v1/entity-dictionary", "shortDescription": {"text": "Unused endpoint: POST /v1/entity-dictionary"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/entity-dictionary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70f7b7c1af976c64", "name": "Unused endpoint: POST /v1/entity-dictionary/bulk", "shortDescription": {"text": "Unused endpoint: POST /v1/entity-dictionary/bulk"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/entity-dictionary/bulk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa19a460b73b5d3a", "name": "Unused endpoint: DELETE /v1/entity-dictionary/{entry_id}", "shortDescription": {"text": "Unused endpoint: DELETE /v1/entity-dictionary/{entry_id}"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `DELETE /v1/entity-dictionary/{entry_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9c703408d45f8761", "name": "Unused endpoint: GET /v1/org/{org_id}/stats", "shortDescription": {"text": "Unused endpoint: GET /v1/org/{org_id}/stats"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `GET /v1/org/{org_id}/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b770d230b15a014a", "name": "Unused endpoint: GET /v1/org/{org_id}/compliance-report", "shortDescription": {"text": "Unused endpoint: GET /v1/org/{org_id}/compliance-report"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `GET /v1/org/{org_id}/compliance-report` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb5cc947da89abdc", "name": "Unused endpoint: POST /v1/depseudonymize", "shortDescription": {"text": "Unused endpoint: POST /v1/depseudonymize"}, "fullDescription": {"text": "`apps/detection/src/main.py` declares `POST /v1/depseudonymize` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2b93272c0cdd105", "name": "Unused endpoint: GET /v1/health", "shortDescription": {"text": "Unused endpoint: GET /v1/health"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /v1/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-968d4311ce08cfe9", "name": "Unused endpoint: GET /openapi.json", "shortDescription": {"text": "Unused endpoint: GET /openapi.json"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /openapi.json` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb0428442a390121", "name": "Unused endpoint: GET /docs", "shortDescription": {"text": "Unused endpoint: GET /docs"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /docs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b9f5ff6af5f178d", "name": "Unused endpoint: USE /v1/auth/*", "shortDescription": {"text": "Unused endpoint: USE /v1/auth/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/auth/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a809d63e4a9e2ae0", "name": "Unused endpoint: POST /v1/csp-report", "shortDescription": {"text": "Unused endpoint: POST /v1/csp-report"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `POST /v1/csp-report` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93c52fb582f1c330", "name": "Unused endpoint: USE /v1/*", "shortDescription": {"text": "Unused endpoint: USE /v1/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a2044d8771a68e6", "name": "Unused endpoint: USE /v1/admin/*", "shortDescription": {"text": "Unused endpoint: USE /v1/admin/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/admin/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5215d048654b315", "name": "Unused endpoint: USE /v1/admin/internal/*", "shortDescription": {"text": "Unused endpoint: USE /v1/admin/internal/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/admin/internal/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68d69f1cfef66990", "name": "Unused endpoint: USE /v1/invites/*", "shortDescription": {"text": "Unused endpoint: USE /v1/invites/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/invites/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef15c2cb96f94e7c", "name": "Unused endpoint: USE /v1/proxy/*", "shortDescription": {"text": "Unused endpoint: USE /v1/proxy/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /v1/proxy/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc83ef8e363dc750", "name": "Unused endpoint: GET /internal/cron/retention", "shortDescription": {"text": "Unused endpoint: GET /internal/cron/retention"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /internal/cron/retention` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36bedf50d3b4a416", "name": "Unused endpoint: USE /v1/admin/siem/*", "shortDescription": {"text": "Unused endpoint: USE /v1/admin/siem/*"}, "fullDescription": {"text": "`apps/api/src/middleware/sso-policy-tiers.ts` declares `USE /v1/admin/siem/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bca8100a44f7f25", "name": "Unused endpoint: POST /users", "shortDescription": {"text": "Unused endpoint: POST /users"}, "fullDescription": {"text": "`apps/api/src/middleware/rbac.ts` declares `POST /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea07bb271e62bc6d", "name": "Unused endpoint: GET /:entityHash", "shortDescription": {"text": "Unused endpoint: GET /:entityHash"}, "fullDescription": {"text": "`apps/api/src/routes/provenance.ts` declares `GET /:entityHash` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62b04274da2717b7", "name": "Unused endpoint: GET /:entityHash/lineage", "shortDescription": {"text": "Unused endpoint: GET /:entityHash/lineage"}, "fullDescription": {"text": "`apps/api/src/routes/provenance.ts` declares `GET /:entityHash/lineage` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`apps/api/src/routes/auth.ts` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/api/src/routes/classify.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19e4d4a01ddc66fd", "name": "Unused endpoint: POST /kill-switch", "shortDescription": {"text": "Unused endpoint: POST /kill-switch"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `POST /kill-switch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ea9ffbda17e8236", "name": "Unused endpoint: GET /extension/status", "shortDescription": {"text": "Unused endpoint: GET /extension/status"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `GET /extension/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38e8577bccb1f76d", "name": "Unused endpoint: DELETE /firm/data", "shortDescription": {"text": "Unused endpoint: DELETE /firm/data"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `DELETE /firm/data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2e83334a6e89739", "name": "Unused endpoint: POST /firm/rotate-keys", "shortDescription": {"text": "Unused endpoint: POST /firm/rotate-keys"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `POST /firm/rotate-keys` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-197dc61eccb8cfde", "name": "Unused endpoint: POST /firm/public-key", "shortDescription": {"text": "Unused endpoint: POST /firm/public-key"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `POST /firm/public-key` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f172b9bbf5720b7a", "name": "Unused endpoint: GET /firm/security-status", "shortDescription": {"text": "Unused endpoint: GET /firm/security-status"}, "fullDescription": {"text": "`apps/api/src/routes/security.ts` declares `GET /firm/security-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6dc86965f314d6e0", "name": "Unused endpoint: POST /register-extension", "shortDescription": {"text": "Unused endpoint: POST /register-extension"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `POST /register-extension` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be94b60b09c89afb", "name": "Unused endpoint: POST /validate-firm-code", "shortDescription": {"text": "Unused endpoint: POST /validate-firm-code"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `POST /validate-firm-code` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f328aef45d7c847a", "name": "Unused endpoint: GET /refresh-subscription", "shortDescription": {"text": "Unused endpoint: GET /refresh-subscription"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `GET /refresh-subscription` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be95234cd7d6664a", "name": "Unused endpoint: POST /enroll", "shortDescription": {"text": "Unused endpoint: POST /enroll"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `POST /enroll` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c3bb6af93b4422a", "name": "Unused endpoint: POST /verify-email", "shortDescription": {"text": "Unused endpoint: POST /verify-email"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `POST /verify-email` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0afae4bfd1ff1c08", "name": "Unused endpoint: POST /resend-verification", "shortDescription": {"text": "Unused endpoint: POST /resend-verification"}, "fullDescription": {"text": "`apps/api/src/routes/extension-auth.ts` declares `POST /resend-verification` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac2f552bf9d967ce", "name": "Unused endpoint: GET /overview", "shortDescription": {"text": "Unused endpoint: GET /overview"}, "fullDescription": {"text": "`apps/api/src/routes/dashboard.ts` declares `GET /overview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c72e441f29f4c4e2", "name": "Unused endpoint: GET /user-activity", "shortDescription": {"text": "Unused endpoint: GET /user-activity"}, "fullDescription": {"text": "`apps/api/src/routes/dashboard.ts` declares `GET /user-activity` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b39de4b3f4b061f", "name": "Unused endpoint: GET /trust-score", "shortDescription": {"text": "Unused endpoint: GET /trust-score"}, "fullDescription": {"text": "`apps/api/src/routes/dashboard.ts` declares `GET /trust-score` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1d6f3c9e45529f0", "name": "Unused endpoint: GET /sensitivity-graph", "shortDescription": {"text": "Unused endpoint: GET /sensitivity-graph"}, "fullDescription": {"text": "`apps/api/src/routes/dashboard.ts` declares `GET /sensitivity-graph` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1ec2427089be506", "name": "Unused endpoint: GET /v2/Users", "shortDescription": {"text": "Unused endpoint: GET /v2/Users"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `GET /v2/Users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e133329bf46ebc7", "name": "Unused endpoint: GET /v2/Users/:id", "shortDescription": {"text": "Unused endpoint: GET /v2/Users/:id"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `GET /v2/Users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-780336bf748d73b6", "name": "Unused endpoint: POST /v2/Users", "shortDescription": {"text": "Unused endpoint: POST /v2/Users"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `POST /v2/Users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-586ce5b52f385143", "name": "Unused endpoint: PUT /v2/Users/:id", "shortDescription": {"text": "Unused endpoint: PUT /v2/Users/:id"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `PUT /v2/Users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66ded53c309f3eb1", "name": "Unused endpoint: PATCH /v2/Users/:id", "shortDescription": {"text": "Unused endpoint: PATCH /v2/Users/:id"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `PATCH /v2/Users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-882b852e09c9a516", "name": "Unused endpoint: DELETE /v2/Users/:id", "shortDescription": {"text": "Unused endpoint: DELETE /v2/Users/:id"}, "fullDescription": {"text": "`apps/api/src/routes/scim.ts` declares `DELETE /v2/Users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20214"}, "properties": {"repository": "ssiddharthsoni-spec/irongate2", "repoUrl": "https://github.com/ssiddharthsoni-spec/irongate2", "branch": "main"}, "results": [{"ruleId": "scanner-c4db06ab4878a5c4", "level": "note", "message": {"text": "Possibly dead Python function: allocate"}, "properties": {"repobilityId": "f1d74453e0b83a87", "scanner": "scanner-primary", "fingerprint": "c4db06ab4878a5c4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/secure_pipeline.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3534fc7ec0a0e39a", "level": "note", "message": {"text": "Possibly dead Python function: store_result"}, "properties": {"repobilityId": "71a08fd11550a3da", "scanner": "scanner-primary", "fingerprint": "3534fc7ec0a0e39a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/secure_pipeline.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c18415b40ca28ec1", "level": "note", "message": {"text": "Possibly dead Python function: secure_process_text"}, "properties": {"repobilityId": "d9c97b5ef28a6d1c", "scanner": "scanner-primary", "fingerprint": "c18415b40ca28ec1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/memory_protection.py:79"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a45424a44621f3e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-50-scenarios.ts:546"}, "properties": {"repobilityId": "353229dcdce3d9ca", "scanner": "scanner-primary", "fingerprint": "a45424a44621f3e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2065a4062ca7686b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/scripts/ollama-sandbox.ts:75"}, "properties": {"repobilityId": "e2381d704a09ec77", "scanner": "scanner-primary", "fingerprint": "2065a4062ca7686b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ffe03d14f45b503", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 v0.3-foundation/eval/run-eval.ts:131"}, "properties": {"repobilityId": "4e3b13f9edd83157", "scanner": "scanner-primary", "fingerprint": "6ffe03d14f45b503", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e6b4938f426f648", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:2"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "7e6b4938f426f648", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd1c8defd7a7e666", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/request-logger.ts:179"}, "properties": {"repobilityId": "7c399da65b3a4a5b", "scanner": "scanner-primary", "fingerprint": "bd1c8defd7a7e666", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68d75cf5eb270510", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/fix-api-keys-table.ts:16"}, "properties": {"repobilityId": "3f6e1421c7a2d5fa", "scanner": "scanner-primary", "fingerprint": "68d75cf5eb270510", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ce7fbfef792e86f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/list-api-keys.ts:12"}, "properties": {"repobilityId": "45f1fbf25f6179d8", "scanner": "scanner-primary", "fingerprint": "5ce7fbfef792e86f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d4f158be54d05ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/seed.ts:23"}, "properties": {"repobilityId": "f2fdc56da7066198", "scanner": "scanner-primary", "fingerprint": "1d4f158be54d05ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9445e19ede43c91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/check-and-create-tables.ts:16"}, "properties": {"repobilityId": "52b915d73f2b63a6", "scanner": "scanner-primary", "fingerprint": "e9445e19ede43c91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43180407965a3de4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-test-key.ts:32"}, "properties": {"repobilityId": "446f8335dd1ef5fd", "scanner": "scanner-primary", "fingerprint": "43180407965a3de4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d4cdcf8a50ba487", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/create-api-key.ts:48"}, "properties": {"repobilityId": "1d3c39d3e493036e", "scanner": "scanner-primary", "fingerprint": "9d4cdcf8a50ba487", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ee5dd8da22883c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/auto-migrate.ts:554"}, "properties": {"repobilityId": "9888aceb010a6a0c", "scanner": "scanner-primary", "fingerprint": "0ee5dd8da22883c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5fa29d6d71707115", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/LandingNav.tsx:84"}, "properties": {"repobilityId": "8b3bfee085bc9bd2", "scanner": "scanner-primary", "fingerprint": "5fa29d6d71707115", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-794639ff05c97125", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/components/Sidebar.tsx:207"}, "properties": {"repobilityId": "bc71534ac9b186bf", "scanner": "scanner-primary", "fingerprint": "794639ff05c97125", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b733f5a7b94caf3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/dashboard/src/app/page.tsx:269"}, "properties": {"repobilityId": "3dfa8607e2352dbf", "scanner": "scanner-primary", "fingerprint": "8b733f5a7b94caf3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8bb191a3ced5eb3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/settings/team/page.tsx:263"}, "properties": {"repobilityId": "73fbf1813b68c5a6", "scanner": "scanner-primary", "fingerprint": "8bb191a3ced5eb3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abe376bb0820e9bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/legal/gdpr/page.tsx:358"}, "properties": {"repobilityId": "7f1b4a14a03a2351", "scanner": "scanner-primary", "fingerprint": "abe376bb0820e9bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38fe7bdd5ddec6e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/demo/page.tsx:1055"}, "properties": {"repobilityId": "11d3d137978b81ad", "scanner": "scanner-primary", "fingerprint": "38fe7bdd5ddec6e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-446dd1130d5eb2ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/page.tsx:326"}, "properties": {"repobilityId": "7671131355e58c2f", "scanner": "scanner-primary", "fingerprint": "446dd1130d5eb2ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b659624a28f86cc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/users/page.tsx:296"}, "properties": {"repobilityId": "91823c1241bcd1ec", "scanner": "scanner-primary", "fingerprint": "b659624a28f86cc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4e0371bc1c0129a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/dashboard/audit-log/page.tsx:445"}, "properties": {"repobilityId": "8bffa00bc0897b47", "scanner": "scanner-primary", "fingerprint": "a4e0371bc1c0129a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0fd7144e3d8a388", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/user-activity/page.tsx:222"}, "properties": {"repobilityId": "467745dba140bd68", "scanner": "scanner-primary", "fingerprint": "d0fd7144e3d8a388", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-646717fe63d7ff84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/departments/page.tsx:680"}, "properties": {"repobilityId": "fce3de47ff0a0b5e", "scanner": "scanner-primary", "fingerprint": "646717fe63d7ff84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb6be260c0be731d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/entity-dictionary/page.tsx:403"}, "properties": {"repobilityId": "16d655c8f154999d", "scanner": "scanner-primary", "fingerprint": "bb6be260c0be731d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f7ffe06cc4b8430", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/policies/page.tsx:415"}, "properties": {"repobilityId": "f73f2c4e865e9bc0", "scanner": "scanner-primary", "fingerprint": "6f7ffe06cc4b8430", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a3f8a5ca845f6081", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/enrollment/page.tsx:373"}, "properties": {"repobilityId": "61949f71384e539e", "scanner": "scanner-primary", "fingerprint": "a3f8a5ca845f6081", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-073242789c5c71b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/controls/page.tsx:366"}, "properties": {"repobilityId": "17d625bdb786ca1d", "scanner": "scanner-primary", "fingerprint": "073242789c5c71b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26045b5fc73bc317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/feature-flags/page.tsx:210"}, "properties": {"repobilityId": "196580695ea33c80", "scanner": "scanner-primary", "fingerprint": "26045b5fc73bc317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2563f6c8d411fa9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/webhooks/page.tsx:495"}, "properties": {"repobilityId": "35e4d71d5b7b8d87", "scanner": "scanner-primary", "fingerprint": "2563f6c8d411fa9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48615f5289f611e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/src/app/admin/plugins/page.tsx:313"}, "properties": {"repobilityId": "ec7445af9e1ff1c4", "scanner": "scanner-primary", "fingerprint": "48615f5289f611e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65ead5cf7a319c72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/vite.config.ts:70"}, "properties": {"repobilityId": "dacadc789e89255c", "scanner": "scanner-primary", "fingerprint": "65ead5cf7a319c72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8490a0b89d404e3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/interceptor-test.ts:528"}, "properties": {"repobilityId": "bfa686f724acbcc0", "scanner": "scanner-primary", "fingerprint": "8490a0b89d404e3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48273c5ea89a53d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/unified-pipeline.test.ts:432"}, "properties": {"repobilityId": "498c819b71b15dd5", "scanner": "scanner-primary", "fingerprint": "48273c5ea89a53d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-58b489a409841cae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/runon-env-pipeline.test.ts:19"}, "properties": {"repobilityId": "6041945608835eb1", "scanner": "scanner-primary", "fingerprint": "58b489a409841cae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-373945489f8b03bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/contextual-intelligence.test.ts:1993"}, "properties": {"repobilityId": "b2ab33f82fdc12dd", "scanner": "scanner-primary", "fingerprint": "373945489f8b03bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f2cfcd0c5b1687e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/modaglobal-scenario.test.ts:109"}, "properties": {"repobilityId": "3cd21bc87ae9ffeb", "scanner": "scanner-primary", "fingerprint": "2f2cfcd0c5b1687e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-adfc304f2aa51c03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/100-scenarios.test.ts:1976"}, "properties": {"repobilityId": "51114d0fd4c720bd", "scanner": "scanner-primary", "fingerprint": "adfc304f2aa51c03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-28a9787de0609aee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/credential-detection.test.ts:18"}, "properties": {"repobilityId": "097dc5396f01e8e6", "scanner": "scanner-primary", "fingerprint": "28a9787de0609aee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-405c522d876d942e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/detection-model-comparison.test.ts:1918"}, "properties": {"repobilityId": "3b9be07df83ec8d7", "scanner": "scanner-primary", "fingerprint": "405c522d876d942e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d36fa00781b548a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/detection.spec.ts:59"}, "properties": {"repobilityId": "37a01040ed092548", "scanner": "scanner-primary", "fingerprint": "8d36fa00781b548a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5e6536bcb457209", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/sidepanel.spec.ts:51"}, "properties": {"repobilityId": "7459a2e8a4acc685", "scanner": "scanner-primary", "fingerprint": "b5e6536bcb457209", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-039d6743947332d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/false-positive.spec.ts:44"}, "properties": {"repobilityId": "3544e3eade564a67", "scanner": "scanner-primary", "fingerprint": "039d6743947332d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6445d31184f87d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/drive.ts:109"}, "properties": {"repobilityId": "663f8edb66f94104", "scanner": "scanner-primary", "fingerprint": "a6445d31184f87d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb7210ad84dbbd5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/injection.spec.ts:33"}, "properties": {"repobilityId": "767cb3270f539b80", "scanner": "scanner-primary", "fingerprint": "fb7210ad84dbbd5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73db4e5870d38514", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/selector-health.spec.ts:144"}, "properties": {"repobilityId": "9fc67aeed24fc02c", "scanner": "scanner-primary", "fingerprint": "73db4e5870d38514", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca32c175389bd3e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/tests/e2e/comprehensive-detection.spec.ts:396"}, "properties": {"repobilityId": "a78a8943f708bc26", "scanner": "scanner-primary", "fingerprint": "ca32c175389bd3e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7af512c21ad0006d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/intelligence/inference.js:129"}, "properties": {"repobilityId": "7bba08cf528359fc", "scanner": "scanner-primary", "fingerprint": "7af512c21ad0006d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d0e48d604a0691dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/OnboardingOverlay.tsx:483"}, "properties": {"repobilityId": "337af3cb91d25246", "scanner": "scanner-primary", "fingerprint": "d0e48d604a0691dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c19513f49e4c99b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/extension/src/sidepanel/App.tsx:2453"}, "properties": {"repobilityId": "e2369bb8a66a33f7", "scanner": "scanner-primary", "fingerprint": "5c19513f49e4c99b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78233b69179830c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/sidepanel/App.tsx:321"}, "properties": {"repobilityId": "eedd41b395d40b52", "scanner": "scanner-primary", "fingerprint": "78233b69179830c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7b637f801c2086f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/extension/src/agent/model-runtime.ts:190"}, "properties": {"repobilityId": "2ebcf7db9e76a98a", "scanner": "scanner-primary", "fingerprint": "d7b637f801c2086f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0600e65c20ad40e4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/auth.ts:15"}, "properties": {"repobilityId": "af0c5e0756be112d", "scanner": "scanner-primary", "fingerprint": "0600e65c20ad40e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15afa2d98fc452e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/index.ts:78"}, "properties": {"repobilityId": "b887ec7994658799", "scanner": "scanner-primary", "fingerprint": "15afa2d98fc452e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3d2de3581222541", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/proxy-handler.ts:17"}, "properties": {"repobilityId": "299b2dee5cbee644", "scanner": "scanner-primary", "fingerprint": "d3d2de3581222541", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d4cbcc4b282726d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/local-llm-detector.ts:23"}, "properties": {"repobilityId": "1caa6c5c8c6f09be", "scanner": "scanner-primary", "fingerprint": "3d4cbcc4b282726d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b1ea3c467b8820a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/queue.ts:20"}, "properties": {"repobilityId": "629ad48e82a5db62", "scanner": "scanner-primary", "fingerprint": "6b1ea3c467b8820a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e72c258c6b646811", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/detection-api.ts:209"}, "properties": {"repobilityId": "bb883e8f4b6dfa16", "scanner": "scanner-primary", "fingerprint": "e72c258c6b646811", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-814d42d6a9adee2a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/worker/circuit-breaker.ts:159"}, "properties": {"repobilityId": "ce8e2fafee63c5bf", "scanner": "scanner-primary", "fingerprint": "814d42d6a9adee2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cb4930db6a28ddd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/main-world.ts:73"}, "properties": {"repobilityId": "e7afa655321b49e3", "scanner": "scanner-primary", "fingerprint": "5cb4930db6a28ddd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ce05d0c05b9299d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/index.ts:18"}, "properties": {"repobilityId": "67be42b20c9aa2a0", "scanner": "scanner-primary", "fingerprint": "6ce05d0c05b9299d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbeb588c7f4d3a51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/adapters/chatgpt.ts:207"}, "properties": {"repobilityId": "a20fbbfa2ea4d5a1", "scanner": "scanner-primary", "fingerprint": "fbeb588c7f4d3a51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-578e5ace701ef1e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:169"}, "properties": {"repobilityId": "433b4be3ac3ecceb", "scanner": "scanner-primary", "fingerprint": "578e5ace701ef1e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-825e046b54c3597a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/entity-dictionary.ts:236"}, "properties": {"repobilityId": "ee061bf76be7f13b", "scanner": "scanner-primary", "fingerprint": "825e046b54c3597a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f46c8d34f100e4e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/judge.ts:251"}, "properties": {"repobilityId": "6b930d794f4d9f71", "scanner": "scanner-primary", "fingerprint": "9f46c8d34f100e4e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76542bb33da5badb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/semantic-classifier.ts:738"}, "properties": {"repobilityId": "d4f60bdd17e8266b", "scanner": "scanner-primary", "fingerprint": "76542bb33da5badb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be935420f9a2ad99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/extension/src/detection/tier3-server-adapter.ts:50"}, "properties": {"repobilityId": "5eea94e18ec1fba2", "scanner": "scanner-primary", "fingerprint": "be935420f9a2ad99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab3e6f079bceb2e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/vscode-extension/esbuild.config.js:21"}, "properties": {"repobilityId": "d60182311b252499", "scanner": "scanner-primary", "fingerprint": "ab3e6f079bceb2e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9596f030c6f43c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mcp-proxy/src/index.ts:176"}, "properties": {"repobilityId": "025d2e6dd5e40743", "scanner": "scanner-primary", "fingerprint": "a9596f030c6f43c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40e64673dbd37f20", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bench-all-models.ts:186"}, "properties": {"repobilityId": "7fd0224d447263ce", "scanner": "scanner-primary", "fingerprint": "40e64673dbd37f20", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72ed917358019c7f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/smoke-test.ts:16"}, "properties": {"repobilityId": "5f2b372ac377e7d4", "scanner": "scanner-primary", "fingerprint": "72ed917358019c7f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-29a156d6564d40c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bench-tier2.ts:271"}, "properties": {"repobilityId": "0fee40e3b9c8de2e", "scanner": "scanner-primary", "fingerprint": "29a156d6564d40c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11aafdcb8ccc6e64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-context-qa.ts:104"}, "properties": {"repobilityId": "ed0e928af8dd6b31", "scanner": "scanner-primary", "fingerprint": "11aafdcb8ccc6e64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-817a734f1d842d42", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-wire.ts:92"}, "properties": {"repobilityId": "28d6ef3eab50f1e4", "scanner": "scanner-primary", "fingerprint": "817a734f1d842d42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a08ff873cf773270", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo.ts:381"}, "properties": {"repobilityId": "3ba90b3520fed056", "scanner": "scanner-primary", "fingerprint": "a08ff873cf773270", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9713c8ff059ac860", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-live-qa.ts:251"}, "properties": {"repobilityId": "408ebb990af4aca4", "scanner": "scanner-primary", "fingerprint": "9713c8ff059ac860", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a396a0cb97e1ca37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/context-qa-scenarios.ts:734"}, "properties": {"repobilityId": "225a58746a7158b8", "scanner": "scanner-primary", "fingerprint": "a396a0cb97e1ca37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d4217145d571317", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/probe-classifier.ts:36"}, "properties": {"repobilityId": "c0ee4178036e0ec7", "scanner": "scanner-primary", "fingerprint": "0d4217145d571317", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1930718512e5fade", "level": "warning", "message": {"text": "Privileged port 1001 in use"}, "properties": {"repobilityId": "eb126d41479634e4", "scanner": "scanner-primary", "fingerprint": "1930718512e5fade", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/docker/detection-service.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3103caee939e04fd", "level": "warning", "message": {"text": "Privileged port 999 in use"}, "properties": {"repobilityId": "f3d0a20a459426b3", "scanner": "scanner-primary", "fingerprint": "3103caee939e04fd", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/docker/docker-compose.prod.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aad1c10f98579c5e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20.18.3-slim"}, "properties": {"repobilityId": "de79fc64b598f99c", "scanner": "scanner-primary", "fingerprint": "aad1c10f98579c5e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-427dcc5a6d0f69bc", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/dashboard/Dockerfile"}, "properties": {"repobilityId": "4f089858fe4a229f", "scanner": "scanner-primary", "fingerprint": "427dcc5a6d0f69bc", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-382f55b4d1922ff6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "16601bd657355649", "scanner": "scanner-primary", "fingerprint": "382f55b4d1922ff6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-382f55b4d1922ff6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "f01ff9557d3e545f", "scanner": "scanner-primary", "fingerprint": "382f55b4d1922ff6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/Dockerfile"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-05abd31982327c09", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "d561ac11254149d6", "scanner": "scanner-primary", "fingerprint": "05abd31982327c09", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-36e73448d4c79b03", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo/live-simulation.html:907"}, "properties": {"repobilityId": "1a5aab70b1baa41a", "scanner": "scanner-primary", "fingerprint": "36e73448d4c79b03", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "demo/live-simulation.html"}, "region": {"startLine": 907}}}]}, {"ruleId": "scanner-df49fabc9d831cf8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/dashboard/src/app/page.tsx:269"}, "properties": {"repobilityId": "56b1113160bdd111", "scanner": "scanner-primary", "fingerprint": "df49fabc9d831cf8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/src/app/page.tsx"}, "region": {"startLine": 269}}}]}, {"ruleId": "scanner-2fcdf3f00a3cbe93", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in apps/extension/intelligence/expansion-tech.json:3412"}, "properties": {"repobilityId": "9a3f762da3302c0b", "scanner": "scanner-primary", "fingerprint": "2fcdf3f00a3cbe93", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/intelligence/expansion-tech.json"}, "region": {"startLine": 3412}}}]}, {"ruleId": "scanner-6583d69329afb24e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/dev-loop.mjs:21"}, "properties": {"repobilityId": "2d3717b6f184009e", "scanner": "scanner-primary", "fingerprint": "6583d69329afb24e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/scripts/dev-loop.mjs"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-a5f5c27faaccc06e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/test-report.mjs:17"}, "properties": {"repobilityId": "280b37301b116fe5", "scanner": "scanner-primary", "fingerprint": "a5f5c27faaccc06e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/scripts/test-report.mjs"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-604bcc38d5b794ff", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/extension/scripts/run-pipeline.mjs:22"}, "properties": {"repobilityId": "7fc90f3c7c8f5c89", "scanner": "scanner-primary", "fingerprint": "604bcc38d5b794ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/scripts/run-pipeline.mjs"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-56ab506562977997", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in apps/extension/src/content/main-world/fake-data.ts:651"}, "properties": {"repobilityId": "fda2dbcbf8c8d001", "scanner": "scanner-primary", "fingerprint": "56ab506562977997", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/content/main-world/fake-data.ts"}, "region": {"startLine": 651}}}]}, {"ruleId": "scanner-61c878abe4495258", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/coaching-toast.ts:252"}, "properties": {"repobilityId": "a95cd5a7f36be1c7", "scanner": "scanner-primary", "fingerprint": "61c878abe4495258", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/content/ui/coaching-toast.ts"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-9aa395a96928db06", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/sensitivity-badge.ts:179"}, "properties": {"repobilityId": "ced0c9c03a0b9d9a", "scanner": "scanner-primary", "fingerprint": "9aa395a96928db06", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/content/ui/sensitivity-badge.ts"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-57363f7344b66e96", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/extension/src/content/ui/entity-tooltip.ts:223"}, "properties": {"repobilityId": "ec0035a246f75ad1", "scanner": "scanner-primary", "fingerprint": "57363f7344b66e96", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/content/ui/entity-tooltip.ts"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-9848649056613d80", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in apps/extension/src/content/capture/clipboard-monitor.ts:55"}, "properties": {"repobilityId": "aef22464c4daf5c8", "scanner": "scanner-primary", "fingerprint": "9848649056613d80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/content/capture/clipboard-monitor.ts"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-8fb0e6f091f026d6", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in apps/extension/src/detection/semantic-classifier.ts:637"}, "properties": {"repobilityId": "6032791db21b7c9d", "scanner": "scanner-primary", "fingerprint": "8fb0e6f091f026d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/detection/semantic-classifier.ts"}, "region": {"startLine": 637}}}]}, {"ruleId": "scanner-64a0b9af22d7ed64", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in apps/extension/src/detection/fake-generator.ts:334"}, "properties": {"repobilityId": "8d8e8a045a2774b1", "scanner": "scanner-primary", "fingerprint": "64a0b9af22d7ed64", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/src/detection/fake-generator.ts"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-40280c15bee7c8ab", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in apps/detection/src/pseudonymizer.py:296"}, "properties": {"repobilityId": "34217b03540e21a3", "scanner": "scanner-primary", "fingerprint": "40280c15bee7c8ab", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/pseudonymizer.py"}, "region": {"startLine": 296}}}]}, {"ruleId": "scanner-eb1226521aa0ae2a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/demo.html:907"}, "properties": {"repobilityId": "12641bdfe15f722a", "scanner": "scanner-primary", "fingerprint": "eb1226521aa0ae2a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/demo.html"}, "region": {"startLine": 907}}}]}, {"ruleId": "scanner-7df5e72fa4d653bd", "level": "error", "message": {"text": "Possible secret in scripts/context-qa-scenarios.ts"}, "properties": {"repobilityId": "46fcb91c3b38bf8c", "scanner": "scanner-primary", "fingerprint": "7df5e72fa4d653bd", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/context-qa-scenarios.ts"}, "region": {"startLine": 1300}}}]}, {"ruleId": "scanner-7df5e72fa4d653bd", "level": "error", "message": {"text": "Possible secret in scripts/context-qa-scenarios.ts"}, "properties": {"repobilityId": "46fcb91c3b38bf8c", "scanner": "scanner-primary", "fingerprint": "7df5e72fa4d653bd", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/context-qa-scenarios.ts"}, "region": {"startLine": 1303}}}]}, {"ruleId": "scanner-774d0ca942c19d29", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/bench-gemini-nano.html:312"}, "properties": {"repobilityId": "7baca1b0c3838833", "scanner": "scanner-primary", "fingerprint": "774d0ca942c19d29", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/bench-gemini-nano.html"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-a35df7c7e9a1e1e9", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in packages/plugin-sdk/src/sandbox.ts:50"}, "properties": {"repobilityId": "2b52bdac558cac29", "scanner": "scanner-primary", "fingerprint": "a35df7c7e9a1e1e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/plugin-sdk/src/sandbox.ts"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-1170017a085f60a7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ddd16489a2224a0f", "scanner": "scanner-primary", "fingerprint": "1170017a085f60a7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/context-qa-battery.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-1170017a085f60a7", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6d298feca39e8bd1", "scanner": "scanner-primary", "fingerprint": "1170017a085f60a7", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/context-qa-battery.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-1170017a085f60a7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "05589a4ce198a6ae", "scanner": "scanner-primary", "fingerprint": "1170017a085f60a7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/context-qa-battery.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-1170017a085f60a7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d301e42996bba90f", "scanner": "scanner-primary", "fingerprint": "1170017a085f60a7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/context-qa-battery.yml"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-1c090c7bfc3f2fc8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "80b294883aadf8c7", "scanner": "scanner-primary", "fingerprint": "1c090c7bfc3f2fc8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-extension.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-1c090c7bfc3f2fc8", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e51638da63d45849", "scanner": "scanner-primary", "fingerprint": "1c090c7bfc3f2fc8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-extension.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-1c090c7bfc3f2fc8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "75cc8076263b00c4", "scanner": "scanner-primary", "fingerprint": "1c090c7bfc3f2fc8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-extension.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-168d90d0da1bc76c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "46354682e3a73c35", "scanner": "scanner-primary", "fingerprint": "168d90d0da1bc76c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-extension.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-de84852615f762ba", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c7ce5a606a9e642a", "scanner": "scanner-primary", "fingerprint": "de84852615f762ba", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wire-verification.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-de84852615f762ba", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3278d8e86c3cbe2f", "scanner": "scanner-primary", "fingerprint": "de84852615f762ba", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wire-verification.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-de84852615f762ba", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "880f1c35136184cf", "scanner": "scanner-primary", "fingerprint": "de84852615f762ba", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wire-verification.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-de84852615f762ba", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "040156ea0795ea6d", "scanner": "scanner-primary", "fingerprint": "de84852615f762ba", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wire-verification.yml"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 23}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 29}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 49}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 55}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 73}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 79}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 96}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 102}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "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": 114}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 126}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 132}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 153}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 159}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 182}}}]}, {"ruleId": "scanner-ad39ee692cd172b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "549f0c3f55bab194", "scanner": "scanner-primary", "fingerprint": "ad39ee692cd172b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/selector-health.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-c3196f73028d2523", "level": "note", "message": {"text": "Very large file: apps/api/src/proxy/pseudonymizer.ts (1259 lines)"}, "properties": {"repobilityId": "c1ae228d65bbdc5d", "scanner": "scanner-primary", "fingerprint": "c3196f73028d2523", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2001689a3eb346ee", "level": "note", "message": {"text": "Very large file: apps/api/src/routes/admin.ts (2042 lines)"}, "properties": {"repobilityId": "683c6b996a5f7e30", "scanner": "scanner-primary", "fingerprint": "2001689a3eb346ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab2ad2769215d8a3", "level": "note", "message": {"text": "Very large file: apps/dashboard/src/app/demo/page.tsx (1487 lines)"}, "properties": {"repobilityId": "a1bed3bab6a3481e", "scanner": "scanner-primary", "fingerprint": "ab2ad2769215d8a3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ac3b0f1a629f8ed7", "level": "note", "message": {"text": "Very large file: apps/extension/tests/interceptor-test.ts (1137 lines)"}, "properties": {"repobilityId": "8f6472a2405a0f7a", "scanner": "scanner-primary", "fingerprint": "ac3b0f1a629f8ed7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d6a85059337e8d07", "level": "note", "message": {"text": "Very large file: apps/extension/tests/e2e-full-pipeline.test.ts (1423 lines)"}, "properties": {"repobilityId": "278eb3b0135a36eb", "scanner": "scanner-primary", "fingerprint": "d6a85059337e8d07", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08192d11464f65ba", "level": "note", "message": {"text": "Very large file: apps/extension/tests/contextual-intelligence.test.ts (2124 lines)"}, "properties": {"repobilityId": "39ee64f0d0dd187e", "scanner": "scanner-primary", "fingerprint": "08192d11464f65ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5fe7d89e74fb7880", "level": "note", "message": {"text": "Very large file: apps/extension/tests/100-scenarios.test.ts (2007 lines)"}, "properties": {"repobilityId": "017c917cf1a09093", "scanner": "scanner-primary", "fingerprint": "5fe7d89e74fb7880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7a95371d2e967dff", "level": "note", "message": {"text": "Very large file: apps/extension/tests/ceo-legal-scenarios.test.ts (1186 lines)"}, "properties": {"repobilityId": "56d9b76124bfaab0", "scanner": "scanner-primary", "fingerprint": "7a95371d2e967dff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-00766259d66567d7", "level": "note", "message": {"text": "Very large file: apps/extension/tests/detection-model-comparison.test.ts (2100 lines)"}, "properties": {"repobilityId": "ae6be757c6e5b416", "scanner": "scanner-primary", "fingerprint": "00766259d66567d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4155551d6e26c24a", "level": "note", "message": {"text": "Very large file: apps/extension/src/sidepanel/App.tsx (2646 lines)"}, "properties": {"repobilityId": "81c0288ff2c070e7", "scanner": "scanner-primary", "fingerprint": "4155551d6e26c24a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e0e0908da763db65", "level": "note", "message": {"text": "Very large file: apps/extension/src/worker/index.ts (4036 lines)"}, "properties": {"repobilityId": "cd3b6f1a3b6b93c5", "scanner": "scanner-primary", "fingerprint": "e0e0908da763db65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-049c98610f226716", "level": "note", "message": {"text": "Very large file: apps/extension/src/content/main-world.ts (6632 lines)"}, "properties": {"repobilityId": "baeea03066e51099", "scanner": "scanner-primary", "fingerprint": "049c98610f226716", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c3018ed23e487ad", "level": "note", "message": {"text": "Very large file: apps/extension/src/content/index.ts (1341 lines)"}, "properties": {"repobilityId": "8d7551fdc9ebb491", "scanner": "scanner-primary", "fingerprint": "7c3018ed23e487ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-21bb777a937f3926", "level": "note", "message": {"text": "Very large file: apps/extension/src/detection/semantic-classifier.ts (864 lines)"}, "properties": {"repobilityId": "e132195e78050642", "scanner": "scanner-primary", "fingerprint": "21bb777a937f3926", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cf0522301781f999", "level": "note", "message": {"text": "Very large file: apps/extension/src/detection/fallback-regex.ts (1320 lines)"}, "properties": {"repobilityId": "18552e185df06322", "scanner": "scanner-primary", "fingerprint": "cf0522301781f999", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9bfbe6abf391b71f", "level": "note", "message": {"text": "Very large file: scripts/context-qa-scenarios.ts (1794 lines)"}, "properties": {"repobilityId": "b13a7a9b799e5b32", "scanner": "scanner-primary", "fingerprint": "9bfbe6abf391b71f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "83fc2bdf7e699ad0", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-4d12f64706059a74", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: v0.3-foundation/package.json"}, "properties": {"repobilityId": "0ad2fefa786acf30", "scanner": "scanner-primary", "fingerprint": "4d12f64706059a74", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "v0.3-foundation/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec82f9367de34433", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json"}, "properties": {"repobilityId": "4cf5ff15e81d6746", "scanner": "scanner-primary", "fingerprint": "ec82f9367de34433", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-16829d81c356f9c7", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/extension/package.json"}, "properties": {"repobilityId": "5982776453cfa648", "scanner": "scanner-primary", "fingerprint": "16829d81c356f9c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/extension/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9a7a40ed1a8c197c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/vscode-extension/package.json"}, "properties": {"repobilityId": "b640d7fd6b91c707", "scanner": "scanner-primary", "fingerprint": "9a7a40ed1a8c197c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/vscode-extension/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d90eb2c45cf1f7d4", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/mcp-proxy/package.json"}, "properties": {"repobilityId": "36dadb73d813bcf8", "scanner": "scanner-primary", "fingerprint": "d90eb2c45cf1f7d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/mcp-proxy/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb3e52667c84fb86", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/types/package.json"}, "properties": {"repobilityId": "b5e2784f829944e6", "scanner": "scanner-primary", "fingerprint": "cb3e52667c84fb86", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/types/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7b85b0a5c9a918e4", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/crypto/package.json"}, "properties": {"repobilityId": "316ceb684a4f38c1", "scanner": "scanner-primary", "fingerprint": "7b85b0a5c9a918e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/crypto/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eddecaa766cadff2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/config/package.json"}, "properties": {"repobilityId": "03931bf3537e3eaf", "scanner": "scanner-primary", "fingerprint": "eddecaa766cadff2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/config/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba8888b50aceaae7", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/plugin-sdk/package.json"}, "properties": {"repobilityId": "0a18add5264e1af0", "scanner": "scanner-primary", "fingerprint": "ba8888b50aceaae7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/plugin-sdk/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "cefcb34ccf85e806", "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": "1999e608daafcf8e", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "126ccc6fb7c1d9d7", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "20256f6067098fc9", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6c576bbf01c120d0", "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": "e868168a11e16b6c", "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": "85da6f860cd01682", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-47f1755c70e1a8f0", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/irongate-tester.md"}, "properties": {"repobilityId": "d85fc58a29267c2f", "scanner": "scanner-primary", "fingerprint": "47f1755c70e1a8f0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/irongate-tester.md"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-d3478368f998dc5f", "level": "none", "message": {"text": "Commented-code block (6 lines) in eslint.config.js:24"}, "properties": {"repobilityId": "e7777c673110713f", "scanner": "scanner-primary", "fingerprint": "d3478368f998dc5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-665b99fda3d287d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/core/dedupe/resolver.ts:6"}, "properties": {"repobilityId": "aab031ba039320ff", "scanner": "scanner-primary", "fingerprint": "665b99fda3d287d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7047b6841c4cd3e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/core/detectors/interface.ts:4"}, "properties": {"repobilityId": "c28874bbb5a839fd", "scanner": "scanner-primary", "fingerprint": "7047b6841c4cd3e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c91e0f3893d9370", "level": "none", "message": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/messages.ts:4"}, "properties": {"repobilityId": "add41a4ab6164f20", "scanner": "scanner-primary", "fingerprint": "9c91e0f3893d9370", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dce2e993128c4569", "level": "none", "message": {"text": "Commented-code block (5 lines) in v0.3-foundation/src/contracts/evidence.ts:4"}, "properties": {"repobilityId": "d7e3c77a4f1d03cd", "scanner": "scanner-primary", "fingerprint": "dce2e993128c4569", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6181484d9211af2d", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/index.ts:399"}, "properties": {"repobilityId": "bc195106c690ca1f", "scanner": "scanner-primary", "fingerprint": "6181484d9211af2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-707cd333ccca539f", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/monitoring/query-anomaly-detector.ts:1"}, "properties": {"repobilityId": "4c938d74992a55d8", "scanner": "scanner-primary", "fingerprint": "707cd333ccca539f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7546c071554177f", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/monitoring/breach-detection.ts:1"}, "properties": {"repobilityId": "f18d5c375c2fe404", "scanner": "scanner-primary", "fingerprint": "e7546c071554177f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-385087a249ca9b09", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/monitoring/security-alerts.ts:1"}, "properties": {"repobilityId": "b6e93edd7fb4b6f0", "scanner": "scanner-primary", "fingerprint": "385087a249ca9b09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8797539a8eebffdf", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/middleware/jwt-revocation.ts:101"}, "properties": {"repobilityId": "cc0d2a04abe3753a", "scanner": "scanner-primary", "fingerprint": "8797539a8eebffdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f5b1f004028c298", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/proxy/llm-router.ts:10"}, "properties": {"repobilityId": "55b43e0636ba8eab", "scanner": "scanner-primary", "fingerprint": "2f5b1f004028c298", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e63a371acba5093", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/gemini.ts:145"}, "properties": {"repobilityId": "2fb9571c2b817e6b", "scanner": "scanner-primary", "fingerprint": "1e63a371acba5093", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e738219cb398204f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/openai.ts:138"}, "properties": {"repobilityId": "ea7f86637f4f1a22", "scanner": "scanner-primary", "fingerprint": "e738219cb398204f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5ce1bf5a4d04d1f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/proxy/providers/anthropic.ts:138"}, "properties": {"repobilityId": "17214398d1ede271", "scanner": "scanner-primary", "fingerprint": "a5ce1bf5a4d04d1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3548870c6d0c3178", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/token-encryption.ts:12"}, "properties": {"repobilityId": "8a6c12d3406da0a2", "scanner": "scanner-primary", "fingerprint": "3548870c6d0c3178", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6cb0566aeff545b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/extension-auth.ts:625"}, "properties": {"repobilityId": "18be64b77a894ea5", "scanner": "scanner-primary", "fingerprint": "6cb0566aeff545b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ed6bf51e6581a1b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/routes/notifications.ts:1"}, "properties": {"repobilityId": "b9e008c32fd1ae01", "scanner": "scanner-primary", "fingerprint": "5ed6bf51e6581a1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-faff48a822d2ab10", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/routes/invites.ts:1"}, "properties": {"repobilityId": "94a7f345994b3759", "scanner": "scanner-primary", "fingerprint": "faff48a822d2ab10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bbf8e816f0feda0", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/routes/audit.ts:345"}, "properties": {"repobilityId": "f7269ca434001ccb", "scanner": "scanner-primary", "fingerprint": "3bbf8e816f0feda0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17bab79688e65295", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/routes/gateway.ts:10"}, "properties": {"repobilityId": "0b6bcffed7314d5a", "scanner": "scanner-primary", "fingerprint": "17bab79688e65295", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d62175525316b91a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/routes/admin.ts:170"}, "properties": {"repobilityId": "af4e797dcd60b329", "scanner": "scanner-primary", "fingerprint": "d62175525316b91a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-818fe745fe4a18e5", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/api/src/routes/mdm-oauth.ts:5"}, "properties": {"repobilityId": "d790da26a22b183c", "scanner": "scanner-primary", "fingerprint": "818fe745fe4a18e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5a43d84215abb51", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/routes/proxy.ts:37"}, "properties": {"repobilityId": "c6dae625c0ff24d5", "scanner": "scanner-primary", "fingerprint": "e5a43d84215abb51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b253fd95650a3a9a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/email.ts:1"}, "properties": {"repobilityId": "5c1791562785137c", "scanner": "scanner-primary", "fingerprint": "b253fd95650a3a9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a399657158ab4f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/feedback-processor.ts:1"}, "properties": {"repobilityId": "03582d2fe0e85a89", "scanner": "scanner-primary", "fingerprint": "7a399657158ab4f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3da35ddbf5f3f79", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/services/siem-forwarder.ts:1"}, "properties": {"repobilityId": "9d1d8eca8537b563", "scanner": "scanner-primary", "fingerprint": "f3da35ddbf5f3f79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95c95ccb18610f29", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/alert-system.ts:1"}, "properties": {"repobilityId": "3b9f90e5fc65d47d", "scanner": "scanner-primary", "fingerprint": "95c95ccb18610f29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d247cb51e2c36260", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/services/jamf-pro.ts:5"}, "properties": {"repobilityId": "95b3ac8d145ef90f", "scanner": "scanner-primary", "fingerprint": "d247cb51e2c36260", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a414df6b32594820", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/jamf-pro.ts:73"}, "properties": {"repobilityId": "0199a51d4b51834f", "scanner": "scanner-primary", "fingerprint": "a414df6b32594820", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81aa942e5097256b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/audit-chain.ts:1"}, "properties": {"repobilityId": "b98627e834e2cadd", "scanner": "scanner-primary", "fingerprint": "81aa942e5097256b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c19cc8386301b926", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/services/inference-engine.ts:1"}, "properties": {"repobilityId": "042c791512cc4957", "scanner": "scanner-primary", "fingerprint": "c19cc8386301b926", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93bd027fc71d0688", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/services/signing-key.ts:1"}, "properties": {"repobilityId": "eb590d288df6ff0a", "scanner": "scanner-primary", "fingerprint": "93bd027fc71d0688", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f80194418fe1f2c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/services/plugin-loader.ts:1"}, "properties": {"repobilityId": "0a2fdd3c22c03c86", "scanner": "scanner-primary", "fingerprint": "f80194418fe1f2c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f20002dae6e257a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/google-workspace.ts:9"}, "properties": {"repobilityId": "dd2ba2af797a08ee", "scanner": "scanner-primary", "fingerprint": "f20002dae6e257a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5e869e61430bf6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/microsoft-intune.ts:9"}, "properties": {"repobilityId": "a4e2fbebc8236277", "scanner": "scanner-primary", "fingerprint": "c5e869e61430bf6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d821b21de1703f1b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/sensitivity-graph.ts:1"}, "properties": {"repobilityId": "cff3f1e2bb7cea61", "scanner": "scanner-primary", "fingerprint": "d821b21de1703f1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8b6f7762203e6a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/webhook-dispatcher.ts:1"}, "properties": {"repobilityId": "d894b81eebe07672", "scanner": "scanner-primary", "fingerprint": "c8b6f7762203e6a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17aca870ebeac065", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/services/trust-score.ts:1"}, "properties": {"repobilityId": "502d9f89b1895eb1", "scanner": "scanner-primary", "fingerprint": "17aca870ebeac065", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af18e64e2c0235e0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/db/schema.ts:158"}, "properties": {"repobilityId": "36a14b41db4269d5", "scanner": "scanner-primary", "fingerprint": "af18e64e2c0235e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da560feb3ec48e55", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/jobs/data-retention.ts:1"}, "properties": {"repobilityId": "134165dd26e52ef3", "scanner": "scanner-primary", "fingerprint": "da560feb3ec48e55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9fe0c32450025462", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/detection/secret-scanner.ts:1"}, "properties": {"repobilityId": "2053d570d7f5bf4e", "scanner": "scanner-primary", "fingerprint": "9fe0c32450025462", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef7beffd4ba5fa9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/detection/intent-classifier.ts:309"}, "properties": {"repobilityId": "e6a6baf5715216ed", "scanner": "scanner-primary", "fingerprint": "ef7beffd4ba5fa9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c433a73b92b8961b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/tests/audit-claims-verification.test.ts:1"}, "properties": {"repobilityId": "72df02006178376f", "scanner": "scanner-primary", "fingerprint": "c433a73b92b8961b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69808677e72b2c7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/tests/real-world-scenarios.test.ts:41"}, "properties": {"repobilityId": "3ca3df7d0aba73d3", "scanner": "scanner-primary", "fingerprint": "69808677e72b2c7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84320e608ee76223", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/tests/chatgpt-dom-only-depseudo.test.ts:4"}, "properties": {"repobilityId": "3eea2f0370413812", "scanner": "scanner-primary", "fingerprint": "84320e608ee76223", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-349dbce03ab2dad6", "level": "note", "message": {"text": "Legacy-named symbol `submitOld` in apps/extension/tests/fragment-depseudo-fixes.test.ts:363"}, "properties": {"repobilityId": "684717d0a15db105", "scanner": "scanner-primary", "fingerprint": "349dbce03ab2dad6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-920a7f3647235feb", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/tests/architecture-invariants.test.ts:618"}, "properties": {"repobilityId": "c12b3e77b48f0e68", "scanner": "scanner-primary", "fingerprint": "920a7f3647235feb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10886430be48aadb", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/tests/intent-suppression.test.ts:270"}, "properties": {"repobilityId": "2691b430663875a0", "scanner": "scanner-primary", "fingerprint": "10886430be48aadb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d144e601e10089c7", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/tests/def016-substring-tightening.test.ts:3"}, "properties": {"repobilityId": "e5c017699c7968ef", "scanner": "scanner-primary", "fingerprint": "d144e601e10089c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-999ef613d4d62eb5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/tests/depseudo-corruption.test.ts:9"}, "properties": {"repobilityId": "47011acf2f854498", "scanner": "scanner-primary", "fingerprint": "999ef613d4d62eb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e95e6c81cd04d9ad", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/extension/tests/def016-no-early-return-pii-leak.test.ts:5"}, "properties": {"repobilityId": "f420fff24366e5d2", "scanner": "scanner-primary", "fingerprint": "e95e6c81cd04d9ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c52ca5f578316a", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/extension/tests/production-bugs-regression.test.ts:676"}, "properties": {"repobilityId": "69805a7ed4d809bb", "scanner": "scanner-primary", "fingerprint": "35c52ca5f578316a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73af2017578dee52", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/intelligence/inference.js:125"}, "properties": {"repobilityId": "4e2e0d4f0ffc830d", "scanner": "scanner-primary", "fingerprint": "73af2017578dee52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ac60a7e6cf138aaa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/scripts/full-drive.mjs:234"}, "properties": {"repobilityId": "4020e7457c20b841", "scanner": "scanner-primary", "fingerprint": "ac60a7e6cf138aaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e01353107616bb08", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/managed-config.ts:53"}, "properties": {"repobilityId": "c30c5ba0d85fc6e5", "scanner": "scanner-primary", "fingerprint": "e01353107616bb08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bd46324adeeddc1", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/src/api-key-store.ts:226"}, "properties": {"repobilityId": "c00f347dab855eb2", "scanner": "scanner-primary", "fingerprint": "2bd46324adeeddc1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-872c8276ff746e42", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/src/security/kill-switch-poller.ts:106"}, "properties": {"repobilityId": "5c57ad17cb900f8e", "scanner": "scanner-primary", "fingerprint": "872c8276ff746e42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ec1e4e25ced426b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/sidepanel/UpgradePrompt.tsx:26"}, "properties": {"repobilityId": "e52555fb392dca4a", "scanner": "scanner-primary", "fingerprint": "5ec1e4e25ced426b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ff97f7f60419da3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/sidepanel/DeploymentBadge.tsx:61"}, "properties": {"repobilityId": "3a2077466bb6e35f", "scanner": "scanner-primary", "fingerprint": "7ff97f7f60419da3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-16e153d1a55abd98", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/sidepanel/App.tsx:150"}, "properties": {"repobilityId": "1c5dd62abbe6f8ac", "scanner": "scanner-primary", "fingerprint": "16e153d1a55abd98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f905b1b4e0a640d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/shared/event-phase.ts:103"}, "properties": {"repobilityId": "806bd44b37be04f9", "scanner": "scanner-primary", "fingerprint": "2f905b1b4e0a640d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67f6d422de54d029", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/agent/model-runtime.ts:216"}, "properties": {"repobilityId": "316754d1a6011e20", "scanner": "scanner-primary", "fingerprint": "67f6d422de54d029", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4270397fef4f3fc5", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/api-client.ts:119"}, "properties": {"repobilityId": "0436a43d37b464f7", "scanner": "scanner-primary", "fingerprint": "4270397fef4f3fc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32bd309c0ea56220", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/index.ts:64"}, "properties": {"repobilityId": "23e9d0f3378f53d1", "scanner": "scanner-primary", "fingerprint": "32bd309c0ea56220", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da4993b2eeaa2699", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/index.ts:2201"}, "properties": {"repobilityId": "e56f3a3f4d140004", "scanner": "scanner-primary", "fingerprint": "da4993b2eeaa2699", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d1c094d6fce9533", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/worker/local-llm-detector.ts:115"}, "properties": {"repobilityId": "25662b051f9f6c69", "scanner": "scanner-primary", "fingerprint": "2d1c094d6fce9533", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1aefa0210e692efd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/tab-state.ts:25"}, "properties": {"repobilityId": "4633290579db3187", "scanner": "scanner-primary", "fingerprint": "1aefa0210e692efd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f462768d3b14aae", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/detection-api.ts:52"}, "properties": {"repobilityId": "756eb842eaa39944", "scanner": "scanner-primary", "fingerprint": "1f462768d3b14aae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae1827a02e15bfbf", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/worker/audit-trail.ts:46"}, "properties": {"repobilityId": "d370beb9aedac970", "scanner": "scanner-primary", "fingerprint": "ae1827a02e15bfbf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94c15eac3ccf65d4", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/worker/detectors/secret-scanner.ts:1"}, "properties": {"repobilityId": "b5e04768e6d8fe54", "scanner": "scanner-primary", "fingerprint": "94c15eac3ccf65d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70a3ca0729b9e6c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/audit/audit-sink.ts:192"}, "properties": {"repobilityId": "cf802294ba4b44c4", "scanner": "scanner-primary", "fingerprint": "70a3ca0729b9e6c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4aebe2477f7f77ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/audit/audit-buffer.ts:278"}, "properties": {"repobilityId": "8b4ac94a95e03018", "scanner": "scanner-primary", "fingerprint": "4aebe2477f7f77ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be260be602bd7fdb", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/extension/src/content/main-world.ts:48"}, "properties": {"repobilityId": "acf6ee3ecfcb990d", "scanner": "scanner-primary", "fingerprint": "be260be602bd7fdb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a9c8dea00667f15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world.ts:3061"}, "properties": {"repobilityId": "c244a3d0e03a9027", "scanner": "scanner-primary", "fingerprint": "1a9c8dea00667f15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71483800023de03c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/content/index.ts:266"}, "properties": {"repobilityId": "c9d0856800295d0c", "scanner": "scanner-primary", "fingerprint": "71483800023de03c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a7b434b4406e0d6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/adapters/registry.ts:105"}, "properties": {"repobilityId": "7e23fa45d7fd1d5f", "scanner": "scanner-primary", "fingerprint": "9a7b434b4406e0d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a93ebdf22bf08b08", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/content/adapters/chatgpt.ts:55"}, "properties": {"repobilityId": "40a27b14cac392c4", "scanner": "scanner-primary", "fingerprint": "a93ebdf22bf08b08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdf12eeb54bced71", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/src/content/main-world/stream-depseudo.ts:16"}, "properties": {"repobilityId": "e8ef37b98ea4d207", "scanner": "scanner-primary", "fingerprint": "fdf12eeb54bced71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52636a6272bf862f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/content/main-world/turn-coordinator.ts:63"}, "properties": {"repobilityId": "35502d710ea62467", "scanner": "scanner-primary", "fingerprint": "52636a6272bf862f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52da121774dda506", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/main-world/turn-coordinator.ts:77"}, "properties": {"repobilityId": "e5c25dab33b44f61", "scanner": "scanner-primary", "fingerprint": "52da121774dda506", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f74ac671b2766e5", "level": "note", "message": {"text": "Legacy-named symbol `_generateFakeLegacy` in apps/extension/src/content/main-world/fake-data.ts:389"}, "properties": {"repobilityId": "70eb81d565d42b2d", "scanner": "scanner-primary", "fingerprint": "7f74ac671b2766e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8d35565a0ab8f108", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/content/main-world/fake-data.ts:371"}, "properties": {"repobilityId": "bd488e1997720a30", "scanner": "scanner-primary", "fingerprint": "8d35565a0ab8f108", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-957c893fb78ce61d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/content/main-world/depseudo-engine.ts:148"}, "properties": {"repobilityId": "10841260cf87398a", "scanner": "scanner-primary", "fingerprint": "957c893fb78ce61d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3272e0334c8e420c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/content/capture/fetch-interceptor.ts:2"}, "properties": {"repobilityId": "60138770d4f0dd5d", "scanner": "scanner-primary", "fingerprint": "3272e0334c8e420c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b65366909c50b8a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/content/capture/index.ts:100"}, "properties": {"repobilityId": "ae8eb3a5d0dc6269", "scanner": "scanner-primary", "fingerprint": "b65366909c50b8a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-182b282a4642f33c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/intent-context-classifier.ts:22"}, "properties": {"repobilityId": "4cbe7804abaddea3", "scanner": "scanner-primary", "fingerprint": "182b282a4642f33c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa33f9305214b191", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/intent-context-classifier.ts:317"}, "properties": {"repobilityId": "c29a3e52e2b9f708", "scanner": "scanner-primary", "fingerprint": "fa33f9305214b191", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b32ce6493378d8e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/entity-ownership.ts:262"}, "properties": {"repobilityId": "72cb0c6dcdf6514e", "scanner": "scanner-primary", "fingerprint": "b32ce6493378d8e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1881fa4e8930e82", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/judge.ts:8"}, "properties": {"repobilityId": "449f4a78dec66e6e", "scanner": "scanner-primary", "fingerprint": "a1881fa4e8930e82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5804ddc6d647b36e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/judge.ts:193"}, "properties": {"repobilityId": "d42939e9c77357db", "scanner": "scanner-primary", "fingerprint": "5804ddc6d647b36e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9393d9ffa71fedec", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/extension/src/detection/intent-suppression.ts:71"}, "properties": {"repobilityId": "3f91732493f08b29", "scanner": "scanner-primary", "fingerprint": "9393d9ffa71fedec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7df67afdadc4969d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/structural-parser.ts:44"}, "properties": {"repobilityId": "2ff391b52daa5071", "scanner": "scanner-primary", "fingerprint": "7df67afdadc4969d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd11ee2b61cde8ad", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/tier3-server-adapter.ts:62"}, "properties": {"repobilityId": "c4e88954d1c7eb62", "scanner": "scanner-primary", "fingerprint": "cd11ee2b61cde8ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ebd1976ed9c34502", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/scorer.ts:289"}, "properties": {"repobilityId": "646069a5e33c931c", "scanner": "scanner-primary", "fingerprint": "ebd1976ed9c34502", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c1d7673642980f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/tier2-adapter.ts:164"}, "properties": {"repobilityId": "6cabd20bf5af02ff", "scanner": "scanner-primary", "fingerprint": "0c1d7673642980f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89c1d672baf50bc1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/extension/src/detection/tier2-adapter.ts:525"}, "properties": {"repobilityId": "a56403aef66fb0b2", "scanner": "scanner-primary", "fingerprint": "89c1d672baf50bc1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27ccfe4d700df25d", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/extension/src/detection/fallback-regex.ts:288"}, "properties": {"repobilityId": "7f9706a206abd18e", "scanner": "scanner-primary", "fingerprint": "27ccfe4d700df25d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c43e3bc6b9fd326", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/extension/src/detection/contextual-keywords.ts:278"}, "properties": {"repobilityId": "6721f390da820cbd", "scanner": "scanner-primary", "fingerprint": "5c43e3bc6b9fd326", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ac0048c5801f7ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/extension/src/detection/types.ts:47"}, "properties": {"repobilityId": "c6e6cf27c8c82824", "scanner": "scanner-primary", "fingerprint": "4ac0048c5801f7ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20b6ce179bc7961e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mcp-proxy/src/index.ts:75"}, "properties": {"repobilityId": "735f76f5f8d7e218", "scanner": "scanner-primary", "fingerprint": "20b6ce179bc7961e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7fa81ccd0ee9f476", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/crypto/src/aes-gcm.ts:1"}, "properties": {"repobilityId": "75ddbf07e2d293bb", "scanner": "scanner-primary", "fingerprint": "7fa81ccd0ee9f476", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f68e97019729b378", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/crypto/src/hmac.ts:1"}, "properties": {"repobilityId": "74c45d587761624e", "scanner": "scanner-primary", "fingerprint": "f68e97019729b378", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a11e9b4718ff861e", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/crypto/src/hashing.ts:1"}, "properties": {"repobilityId": "33fdf2d0163c1a70", "scanner": "scanner-primary", "fingerprint": "a11e9b4718ff861e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73cc2cd84b6f1451", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/crypto/src/rbac.ts:6"}, "properties": {"repobilityId": "f28e426d329fe4c2", "scanner": "scanner-primary", "fingerprint": "73cc2cd84b6f1451", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9383ee7fd83942d6", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/crypto/src/kms-encryption.ts:1"}, "properties": {"repobilityId": "e6e98ce48f50f540", "scanner": "scanner-primary", "fingerprint": "9383ee7fd83942d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09f262ee35f83b36", "level": "note", "message": {"text": "58 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "929a1590d71ca96e", "scanner": "scanner-primary", "fingerprint": "09f262ee35f83b36", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a2b66191ebf8f979", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-7b43341c44b60c14", "level": "error", "message": {"text": "FastAPI POST `detect_entities` without auth dependency \u2014 apps/detection/src/main.py:367"}, "properties": {"repobilityId": "bae9b6b4e6e55a4b", "scanner": "scanner-primary", "fingerprint": "7b43341c44b60c14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 367}}}]}, {"ruleId": "scanner-396cd11294ad02ba", "level": "error", "message": {"text": "FastAPI POST `score_text` without auth dependency \u2014 apps/detection/src/main.py:436"}, "properties": {"repobilityId": "53df416a4e523eaf", "scanner": "scanner-primary", "fingerprint": "396cd11294ad02ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 436}}}]}, {"ruleId": "scanner-888b84f1deda8a65", "level": "error", "message": {"text": "FastAPI POST `pseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:462"}, "properties": {"repobilityId": "e9887966b8dff376", "scanner": "scanner-primary", "fingerprint": "888b84f1deda8a65", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 462}}}]}, {"ruleId": "scanner-44407f932128d33b", "level": "error", "message": {"text": "FastAPI POST `evaluate_policy_endpoint` without auth dependency \u2014 apps/detection/src/main.py:665"}, "properties": {"repobilityId": "8f7d6d1738853701", "scanner": "scanner-primary", "fingerprint": "44407f932128d33b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 665}}}]}, {"ruleId": "scanner-bc0e0e22010771c2", "level": "error", "message": {"text": "FastAPI POST `add_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:761"}, "properties": {"repobilityId": "d9055b329bcadded", "scanner": "scanner-primary", "fingerprint": "bc0e0e22010771c2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 761}}}]}, {"ruleId": "scanner-ad438679ed65b00c", "level": "error", "message": {"text": "FastAPI POST `bulk_import_entity_dictionary` without auth dependency \u2014 apps/detection/src/main.py:794"}, "properties": {"repobilityId": "fe7e3a26eebebc33", "scanner": "scanner-primary", "fingerprint": "ad438679ed65b00c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 794}}}]}, {"ruleId": "scanner-5f856b8d40e9a7d5", "level": "error", "message": {"text": "FastAPI DELETE `delete_entity_dictionary_entry` without auth dependency \u2014 apps/detection/src/main.py:830"}, "properties": {"repobilityId": "a6b39ff528f64da3", "scanner": "scanner-primary", "fingerprint": "5f856b8d40e9a7d5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 830}}}]}, {"ruleId": "scanner-213f743f61a2e237", "level": "error", "message": {"text": "FastAPI POST `depseudonymize_text` without auth dependency \u2014 apps/detection/src/main.py:929"}, "properties": {"repobilityId": "60b3be41b70845ce", "scanner": "scanner-primary", "fingerprint": "213f743f61a2e237", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/detection/src/main.py"}, "region": {"startLine": 929}}}]}, {"ruleId": "scanner-86306d4473b6451a", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/scenario-test.mjs:40)"}, "properties": {"repobilityId": "8bb1fa01dec1a715", "scanner": "scanner-primary", "fingerprint": "86306d4473b6451a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24e5e7de50b15042", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/tests/e2e/browser-test.mjs:149)"}, "properties": {"repobilityId": "5bd5528cf7de3bde", "scanner": "scanner-primary", "fingerprint": "24e5e7de50b15042", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-470ceed4411c53ea", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (apps/extension/tests/e2e/browser-test.mjs:173)"}, "properties": {"repobilityId": "40843ddcc6cde52b", "scanner": "scanner-primary", "fingerprint": "470ceed4411c53ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0723d49576cb7f5a", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/dev-loop.mjs:203)"}, "properties": {"repobilityId": "f4d286ea9284cb0d", "scanner": "scanner-primary", "fingerprint": "0723d49576cb7f5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-024828347158509e", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:${MOCK_PORT}/api/intercepted (apps/extension/scripts/run-pipeline.mjs:67)"}, "properties": {"repobilityId": "ce90afeff27c5604", "scanner": "scanner-primary", "fingerprint": "024828347158509e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63518c69fddb393e", "level": "error", "message": {"text": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:213)"}, "properties": {"repobilityId": "c415c4dc4f960cfd", "scanner": "scanner-primary", "fingerprint": "63518c69fddb393e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4d1eb135d87e1054", "level": "error", "message": {"text": "Dangling fetch: GET /admin/users (apps/api/tests/rbac-enforcement.test.ts:219)"}, "properties": {"repobilityId": "cb812f682ae6365b", "scanner": "scanner-primary", "fingerprint": "4d1eb135d87e1054", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-dbc33e8125fb41d8", "level": "error", "message": {"text": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:225)"}, "properties": {"repobilityId": "dcfb2633e5010704", "scanner": "scanner-primary", "fingerprint": "dbc33e8125fb41d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e2836b8006d426a7", "level": "error", "message": {"text": "Dangling fetch: POST /admin/webhooks (apps/api/tests/rbac-enforcement.test.ts:231)"}, "properties": {"repobilityId": "ec25737569915289", "scanner": "scanner-primary", "fingerprint": "e2836b8006d426a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1440792424d63e5a", "level": "error", "message": {"text": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:237)"}, "properties": {"repobilityId": "5284bb1074d9de36", "scanner": "scanner-primary", "fingerprint": "1440792424d63e5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-20497b0875d65cc3", "level": "error", "message": {"text": "Dangling fetch: PUT /admin/siem (apps/api/tests/rbac-enforcement.test.ts:243)"}, "properties": {"repobilityId": "531b63f3a17887a2", "scanner": "scanner-primary", "fingerprint": "20497b0875d65cc3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bcfa6df52f1aa429", "level": "error", "message": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:117)"}, "properties": {"repobilityId": "1644bd69e0172e06", "scanner": "scanner-primary", "fingerprint": "bcfa6df52f1aa429", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c19d229b84523c0b", "level": "error", "message": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:131)"}, "properties": {"repobilityId": "04d144521e43e511", "scanner": "scanner-primary", "fingerprint": "c19d229b84523c0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-eaef87a87fd6021b", "level": "error", "message": {"text": "Dangling fetch: GET /admin (apps/api/tests/middleware.test.ts:143)"}, "properties": {"repobilityId": "dfaa58decbc105e6", "scanner": "scanner-primary", "fingerprint": "eaef87a87fd6021b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-23314866c4094629", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:61)"}, "properties": {"repobilityId": "46f2a54700ace090", "scanner": "scanner-primary", "fingerprint": "23314866c4094629", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7f458cb14bda1d32", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:83)"}, "properties": {"repobilityId": "786207041b07e04e", "scanner": "scanner-primary", "fingerprint": "7f458cb14bda1d32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-76673fd44e312572", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:107)"}, "properties": {"repobilityId": "35860157ff2cd23c", "scanner": "scanner-primary", "fingerprint": "76673fd44e312572", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-53abd3de715330ba", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:119)"}, "properties": {"repobilityId": "50bd0b79ad168fc0", "scanner": "scanner-primary", "fingerprint": "53abd3de715330ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c65dd5da6a01e2ab", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:156)"}, "properties": {"repobilityId": "f06c35b784d31fbf", "scanner": "scanner-primary", "fingerprint": "c65dd5da6a01e2ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9a5722abccff0d94", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:179)"}, "properties": {"repobilityId": "a676fdc34e6c0fa5", "scanner": "scanner-primary", "fingerprint": "9a5722abccff0d94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f7e100466d8738b2", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events/batch (apps/api/tests/integration/api-routes.integration.test.ts:189)"}, "properties": {"repobilityId": "3c8ebd97aeb5232b", "scanner": "scanner-primary", "fingerprint": "f7e100466d8738b2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-47ad3b66bff80ad4", "level": "error", "message": {"text": "Dangling fetch: GET /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:205)"}, "properties": {"repobilityId": "aa9281b52f487193", "scanner": "scanner-primary", "fingerprint": "47ad3b66bff80ad4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e477958710dba80f", "level": "error", "message": {"text": "Dangling fetch: GET /v1/events?limit=2&offset=0 (apps/api/tests/integration/api-routes.integration.test.ts:213)"}, "properties": {"repobilityId": "aa520ef78bd9a4ed", "scanner": "scanner-primary", "fingerprint": "e477958710dba80f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-dc27f2aa0a730b2f", "level": "error", "message": {"text": "Dangling fetch: GET /v1/events?minScore=60 (apps/api/tests/integration/api-routes.integration.test.ts:220)"}, "properties": {"repobilityId": "48e741f9ae10b46c", "scanner": "scanner-primary", "fingerprint": "dc27f2aa0a730b2f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-38eecef591f1f688", "level": "error", "message": {"text": "Dangling fetch: GET /v1/events?aiToolId=claude (apps/api/tests/integration/api-routes.integration.test.ts:229)"}, "properties": {"repobilityId": "3a2730f81c28cbdd", "scanner": "scanner-primary", "fingerprint": "38eecef591f1f688", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f3a06b19bcbe26f1", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:244)"}, "properties": {"repobilityId": "094a6b4101d63bce", "scanner": "scanner-primary", "fingerprint": "f3a06b19bcbe26f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-562888043eb33dbb", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/status (apps/api/tests/integration/api-routes.integration.test.ts:255)"}, "properties": {"repobilityId": "395e0dc06d6854ea", "scanner": "scanner-primary", "fingerprint": "562888043eb33dbb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-70f695e82b49c013", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/export (apps/api/tests/integration/api-routes.integration.test.ts:266)"}, "properties": {"repobilityId": "a3fbb9094106a95a", "scanner": "scanner-primary", "fingerprint": "70f695e82b49c013", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-44e424063ac3fb30", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:282)"}, "properties": {"repobilityId": "1dfe1c803bea98bb", "scanner": "scanner-primary", "fingerprint": "44e424063ac3fb30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7d8db47e35cfb820", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:298)"}, "properties": {"repobilityId": "f80da658938e5c29", "scanner": "scanner-primary", "fingerprint": "7d8db47e35cfb820", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c99567e774ee6696", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/verify-signatures (apps/api/tests/integration/api-routes.integration.test.ts:309)"}, "properties": {"repobilityId": "d801dedaa2cc9b5d", "scanner": "scanner-primary", "fingerprint": "c99567e774ee6696", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bd95592cbec5aa06", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/chain?limit=3 (apps/api/tests/integration/api-routes.integration.test.ts:319)"}, "properties": {"repobilityId": "5afb7a5500581769", "scanner": "scanner-primary", "fingerprint": "bd95592cbec5aa06", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bc2ff9d47bfa8d49", "level": "error", "message": {"text": "Dangling fetch: GET /v1/reports/exposure?period=30d (apps/api/tests/integration/api-routes.integration.test.ts:335)"}, "properties": {"repobilityId": "11ccb44992d0bb08", "scanner": "scanner-primary", "fingerprint": "bc2ff9d47bfa8d49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-df85dd5ea9dd714d", "level": "error", "message": {"text": "Dangling fetch: POST /v1/events (apps/api/tests/integration/api-routes.integration.test.ts:353)"}, "properties": {"repobilityId": "90d25bea100e45fa", "scanner": "scanner-primary", "fingerprint": "df85dd5ea9dd714d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-65b135228b837688", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/verify (apps/api/tests/integration/api-routes.integration.test.ts:373)"}, "properties": {"repobilityId": "e75ff6bfd24eb535", "scanner": "scanner-primary", "fingerprint": "65b135228b837688", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c8b147ab733ad27a", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/verify-signature/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:377)"}, "properties": {"repobilityId": "d8cbfbfbc5dd80aa", "scanner": "scanner-primary", "fingerprint": "c8b147ab733ad27a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-88e0561bc0acb587", "level": "error", "message": {"text": "Dangling fetch: GET /v1/events/${eventId} (apps/api/tests/integration/api-routes.integration.test.ts:384)"}, "properties": {"repobilityId": "486f47ed0efbc0e2", "scanner": "scanner-primary", "fingerprint": "88e0561bc0acb587", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bfa154d848fb899c", "level": "error", "message": {"text": "Dangling fetch: GET /v1/audit/export/worm (apps/api/tests/integration/api-routes.integration.test.ts:391)"}, "properties": {"repobilityId": "1d0eb887319b5bd6", "scanner": "scanner-primary", "fingerprint": "bfa154d848fb899c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-379340e3e6340f74", "level": "error", "message": {"text": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:98)"}, "properties": {"repobilityId": "6084e5bc47f0b9df", "scanner": "scanner-primary", "fingerprint": "379340e3e6340f74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b4efa6ac743214a9", "level": "error", "message": {"text": "Dangling fetch: POST /v1/feedback (apps/api/tests/integration/security-integration.test.ts:127)"}, "properties": {"repobilityId": "a45df6b044cfd43a", "scanner": "scanner-primary", "fingerprint": "b4efa6ac743214a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-04141c3d1c4c31fe", "level": "error", "message": {"text": "Dangling fetch: GET /v1/feedback/stats (apps/api/tests/integration/security-integration.test.ts:188)"}, "properties": {"repobilityId": "2b089b487fd96251", "scanner": "scanner-primary", "fingerprint": "04141c3d1c4c31fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-cf6c087638197bcc", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:${port}/health (apps/api/src/index.ts:618)"}, "properties": {"repobilityId": "2d45f9faac3cc7c9", "scanner": "scanner-primary", "fingerprint": "cf6c087638197bcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f136cc6ef60f85f", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/sidepanel/OnboardingOverlay.tsx:140)"}, "properties": {"repobilityId": "f086102500f17ec3", "scanner": "scanner-primary", "fingerprint": "4f136cc6ef60f85f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-455f6d58328bc57b", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/extension/src/worker/index.ts:3303)"}, "properties": {"repobilityId": "f6a82d404f6d441c", "scanner": "scanner-primary", "fingerprint": "455f6d58328bc57b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a3fb4f08e148cd6", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:11434/api/generate (scripts/run-live-qa.ts:124)"}, "properties": {"repobilityId": "8fb0e4d7b8648484", "scanner": "scanner-primary", "fingerprint": "6a3fb4f08e148cd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b880a38e1c5a9ce", "level": "note", "message": {"text": "Unused endpoint: POST /v1/detect"}, "properties": {"repobilityId": "36740e1f90cb05ab", "scanner": "scanner-primary", "fingerprint": "1b880a38e1c5a9ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ef640df01da7cd8", "level": "note", "message": {"text": "Unused endpoint: POST /v1/score"}, "properties": {"repobilityId": "e5cfbbc945a7e1db", "scanner": "scanner-primary", "fingerprint": "2ef640df01da7cd8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f3b762790920b73", "level": "note", "message": {"text": "Unused endpoint: POST /v1/pseudonymize"}, "properties": {"repobilityId": "8911f63e78b29e55", "scanner": "scanner-primary", "fingerprint": "1f3b762790920b73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-095a18fe2e44edcf", "level": "note", "message": {"text": "Unused endpoint: POST /v1/policy/evaluate"}, "properties": {"repobilityId": "52071c1dedbe9531", "scanner": "scanner-primary", "fingerprint": "095a18fe2e44edcf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4e830a3c8daf0de", "level": "note", "message": {"text": "Unused endpoint: GET /v1/entity-dictionary"}, "properties": {"repobilityId": "671e52cd944f9b45", "scanner": "scanner-primary", "fingerprint": "d4e830a3c8daf0de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ce1c4e659ee28fe", "level": "note", "message": {"text": "Unused endpoint: POST /v1/entity-dictionary"}, "properties": {"repobilityId": "009d1255ec1a1dfd", "scanner": "scanner-primary", "fingerprint": "9ce1c4e659ee28fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70f7b7c1af976c64", "level": "note", "message": {"text": "Unused endpoint: POST /v1/entity-dictionary/bulk"}, "properties": {"repobilityId": "493b088126e3890d", "scanner": "scanner-primary", "fingerprint": "70f7b7c1af976c64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa19a460b73b5d3a", "level": "note", "message": {"text": "Unused endpoint: DELETE /v1/entity-dictionary/{entry_id}"}, "properties": {"repobilityId": "72646235c7759d97", "scanner": "scanner-primary", "fingerprint": "fa19a460b73b5d3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c703408d45f8761", "level": "note", "message": {"text": "Unused endpoint: GET /v1/org/{org_id}/stats"}, "properties": {"repobilityId": "8fba60d4c74497e5", "scanner": "scanner-primary", "fingerprint": "9c703408d45f8761", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b770d230b15a014a", "level": "note", "message": {"text": "Unused endpoint: GET /v1/org/{org_id}/compliance-report"}, "properties": {"repobilityId": "175b034e8fb01a6c", "scanner": "scanner-primary", "fingerprint": "b770d230b15a014a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb5cc947da89abdc", "level": "note", "message": {"text": "Unused endpoint: POST /v1/depseudonymize"}, "properties": {"repobilityId": "33e5c58284bf33e0", "scanner": "scanner-primary", "fingerprint": "eb5cc947da89abdc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2b93272c0cdd105", "level": "note", "message": {"text": "Unused endpoint: GET /v1/health"}, "properties": {"repobilityId": "f8131c10630179f8", "scanner": "scanner-primary", "fingerprint": "f2b93272c0cdd105", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-968d4311ce08cfe9", "level": "note", "message": {"text": "Unused endpoint: GET /openapi.json"}, "properties": {"repobilityId": "3838214885d066fe", "scanner": "scanner-primary", "fingerprint": "968d4311ce08cfe9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb0428442a390121", "level": "note", "message": {"text": "Unused endpoint: GET /docs"}, "properties": {"repobilityId": "a641480060da900a", "scanner": "scanner-primary", "fingerprint": "eb0428442a390121", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b9f5ff6af5f178d", "level": "note", "message": {"text": "Unused endpoint: USE /v1/auth/*"}, "properties": {"repobilityId": "526bfd7c8358c11e", "scanner": "scanner-primary", "fingerprint": "6b9f5ff6af5f178d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a809d63e4a9e2ae0", "level": "note", "message": {"text": "Unused endpoint: POST /v1/csp-report"}, "properties": {"repobilityId": "2947cc41912bf4ba", "scanner": "scanner-primary", "fingerprint": "a809d63e4a9e2ae0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93c52fb582f1c330", "level": "note", "message": {"text": "Unused endpoint: USE /v1/*"}, "properties": {"repobilityId": "30a933e0a9e24fc7", "scanner": "scanner-primary", "fingerprint": "93c52fb582f1c330", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a2044d8771a68e6", "level": "note", "message": {"text": "Unused endpoint: USE /v1/admin/*"}, "properties": {"repobilityId": "78e33569cf4087ab", "scanner": "scanner-primary", "fingerprint": "5a2044d8771a68e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5215d048654b315", "level": "note", "message": {"text": "Unused endpoint: USE /v1/admin/internal/*"}, "properties": {"repobilityId": "be126e0c7b578557", "scanner": "scanner-primary", "fingerprint": "f5215d048654b315", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68d69f1cfef66990", "level": "note", "message": {"text": "Unused endpoint: USE /v1/invites/*"}, "properties": {"repobilityId": "b4839e6036b12ca5", "scanner": "scanner-primary", "fingerprint": "68d69f1cfef66990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef15c2cb96f94e7c", "level": "note", "message": {"text": "Unused endpoint: USE /v1/proxy/*"}, "properties": {"repobilityId": "825359dec85863d4", "scanner": "scanner-primary", "fingerprint": "ef15c2cb96f94e7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc83ef8e363dc750", "level": "note", "message": {"text": "Unused endpoint: GET /internal/cron/retention"}, "properties": {"repobilityId": "e20dedcd2b1263da", "scanner": "scanner-primary", "fingerprint": "fc83ef8e363dc750", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36bedf50d3b4a416", "level": "note", "message": {"text": "Unused endpoint: USE /v1/admin/siem/*"}, "properties": {"repobilityId": "92ea493bd427438b", "scanner": "scanner-primary", "fingerprint": "36bedf50d3b4a416", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bca8100a44f7f25", "level": "note", "message": {"text": "Unused endpoint: POST /users"}, "properties": {"repobilityId": "22de48c8db462126", "scanner": "scanner-primary", "fingerprint": "1bca8100a44f7f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea07bb271e62bc6d", "level": "note", "message": {"text": "Unused endpoint: GET /:entityHash"}, "properties": {"repobilityId": "c1295b111039a43e", "scanner": "scanner-primary", "fingerprint": "ea07bb271e62bc6d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62b04274da2717b7", "level": "note", "message": {"text": "Unused endpoint: GET /:entityHash/lineage"}, "properties": {"repobilityId": "57b3c3bb4f7f50d5", "scanner": "scanner-primary", "fingerprint": "62b04274da2717b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "5a15e3e757e5c2c3", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "2ca7ad2a8105ddb9", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19e4d4a01ddc66fd", "level": "note", "message": {"text": "Unused endpoint: POST /kill-switch"}, "properties": {"repobilityId": "aa17ae9369ad51cd", "scanner": "scanner-primary", "fingerprint": "19e4d4a01ddc66fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ea9ffbda17e8236", "level": "note", "message": {"text": "Unused endpoint: GET /extension/status"}, "properties": {"repobilityId": "17fd994572509829", "scanner": "scanner-primary", "fingerprint": "1ea9ffbda17e8236", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38e8577bccb1f76d", "level": "note", "message": {"text": "Unused endpoint: DELETE /firm/data"}, "properties": {"repobilityId": "d6517d00da8f546a", "scanner": "scanner-primary", "fingerprint": "38e8577bccb1f76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2e83334a6e89739", "level": "note", "message": {"text": "Unused endpoint: POST /firm/rotate-keys"}, "properties": {"repobilityId": "c1491d65fed12ede", "scanner": "scanner-primary", "fingerprint": "c2e83334a6e89739", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-197dc61eccb8cfde", "level": "note", "message": {"text": "Unused endpoint: POST /firm/public-key"}, "properties": {"repobilityId": "1cacd844d31e1c51", "scanner": "scanner-primary", "fingerprint": "197dc61eccb8cfde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f172b9bbf5720b7a", "level": "note", "message": {"text": "Unused endpoint: GET /firm/security-status"}, "properties": {"repobilityId": "3ca736d4d04c3ff4", "scanner": "scanner-primary", "fingerprint": "f172b9bbf5720b7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6dc86965f314d6e0", "level": "note", "message": {"text": "Unused endpoint: POST /register-extension"}, "properties": {"repobilityId": "d293c42f384baf08", "scanner": "scanner-primary", "fingerprint": "6dc86965f314d6e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be94b60b09c89afb", "level": "note", "message": {"text": "Unused endpoint: POST /validate-firm-code"}, "properties": {"repobilityId": "7ff250e0569dbe9e", "scanner": "scanner-primary", "fingerprint": "be94b60b09c89afb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f328aef45d7c847a", "level": "note", "message": {"text": "Unused endpoint: GET /refresh-subscription"}, "properties": {"repobilityId": "18d79a967ab4c6f6", "scanner": "scanner-primary", "fingerprint": "f328aef45d7c847a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be95234cd7d6664a", "level": "note", "message": {"text": "Unused endpoint: POST /enroll"}, "properties": {"repobilityId": "14caec336357395e", "scanner": "scanner-primary", "fingerprint": "be95234cd7d6664a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c3bb6af93b4422a", "level": "note", "message": {"text": "Unused endpoint: POST /verify-email"}, "properties": {"repobilityId": "24271d821768908a", "scanner": "scanner-primary", "fingerprint": "0c3bb6af93b4422a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0afae4bfd1ff1c08", "level": "note", "message": {"text": "Unused endpoint: POST /resend-verification"}, "properties": {"repobilityId": "e226d59f145a0461", "scanner": "scanner-primary", "fingerprint": "0afae4bfd1ff1c08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac2f552bf9d967ce", "level": "note", "message": {"text": "Unused endpoint: GET /overview"}, "properties": {"repobilityId": "f2037c6f8d61bd9c", "scanner": "scanner-primary", "fingerprint": "ac2f552bf9d967ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c72e441f29f4c4e2", "level": "note", "message": {"text": "Unused endpoint: GET /user-activity"}, "properties": {"repobilityId": "e10ffdf953842e10", "scanner": "scanner-primary", "fingerprint": "c72e441f29f4c4e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b39de4b3f4b061f", "level": "note", "message": {"text": "Unused endpoint: GET /trust-score"}, "properties": {"repobilityId": "6cee789938190799", "scanner": "scanner-primary", "fingerprint": "3b39de4b3f4b061f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1d6f3c9e45529f0", "level": "note", "message": {"text": "Unused endpoint: GET /sensitivity-graph"}, "properties": {"repobilityId": "666b3fa406e05b11", "scanner": "scanner-primary", "fingerprint": "f1d6f3c9e45529f0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1ec2427089be506", "level": "note", "message": {"text": "Unused endpoint: GET /v2/Users"}, "properties": {"repobilityId": "82882347023ab233", "scanner": "scanner-primary", "fingerprint": "c1ec2427089be506", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e133329bf46ebc7", "level": "note", "message": {"text": "Unused endpoint: GET /v2/Users/:id"}, "properties": {"repobilityId": "690a019a735e711f", "scanner": "scanner-primary", "fingerprint": "9e133329bf46ebc7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-780336bf748d73b6", "level": "note", "message": {"text": "Unused endpoint: POST /v2/Users"}, "properties": {"repobilityId": "520630a99e5e23fb", "scanner": "scanner-primary", "fingerprint": "780336bf748d73b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-586ce5b52f385143", "level": "note", "message": {"text": "Unused endpoint: PUT /v2/Users/:id"}, "properties": {"repobilityId": "074e66521e0100b5", "scanner": "scanner-primary", "fingerprint": "586ce5b52f385143", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66ded53c309f3eb1", "level": "note", "message": {"text": "Unused endpoint: PATCH /v2/Users/:id"}, "properties": {"repobilityId": "3a16cae7af711beb", "scanner": "scanner-primary", "fingerprint": "66ded53c309f3eb1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-882b852e09c9a516", "level": "note", "message": {"text": "Unused endpoint: DELETE /v2/Users/:id"}, "properties": {"repobilityId": "6af61b6f5c24bb0b", "scanner": "scanner-primary", "fingerprint": "882b852e09c9a516", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}