{"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-f7fd522094a3e315", "name": "Stray `console.log` in TS/JS \u2014 setup-p2-files.js:593", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 setup-p2-files.js:593"}, "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-a93d2b1c84d7aaac", "name": "Stray `console.log` in TS/JS \u2014 frontend/service-worker.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/service-worker.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1efcbdd50b11ef7a", "name": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.js: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-076c4cd9be71f1ce", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/state/state-manager.js:846", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/state/state-manager.js:846"}, "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-cdc6740957026ddd", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.js:9"}, "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-f9e20ab1f98867fc", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/platform/storage-manager-validation.test.js:232", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/platform/storage-manager-validation.test.js:232"}, "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-ab5960ea9a37351e", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/platform/toast-service.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/platform/toast-service.js: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-94e3db112bf95ecb", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/core/event-bus.js:217", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/core/event-bus.js:217"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8da9afa9f5a7ac12", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/core/virtual-scroller.js:217", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/core/virtual-scroller.js:217"}, "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-2d3eccdcfa33373d", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js: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-0c622f49fe84ec3e", "name": "Icon-only button without accessible name \u2014 frontend/src/features/history/history-page.js:1147", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/features/history/history-page.js:1147"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b30b3f2e20e6f983", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-firecrawl.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-firecrawl.js:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-469f5ef72e52cd75", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-and-validate.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-and-validate.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-985fc6ed441a249f", "name": "Stray `console.log` in TS/JS \u2014 scripts/scrape-example.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-example.js: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-c47bbce175fe08d1", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-add-role.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-add-role.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13991dbff3bc219e", "name": "Stray `console.log` in TS/JS \u2014 server/src/server.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/server.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-3e6178c17b62f395", "name": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.ts:35"}, "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-5b2346092029a029", "name": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.middleware.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.middleware.ts:108"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de31b93427b5acd8", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/database.config.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/database.config.ts:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6aa856a1158b116e", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/redis.config.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/redis.config.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-ee013c564848477c", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/test/global-setup.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/test/global-setup.ts:65"}, "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-d7e1d328e5856ad1", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/utils/metrics-cache.extension.ts:330", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/utils/metrics-cache.extension.ts:330"}, "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-b587fcbcf663de60", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/examples/query-cache-integration.example.ts:299", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/examples/query-cache-integration.example.ts:299"}, "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-8f0157770377d8b9", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/firecrawl.service.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/firecrawl.service.ts:101"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-757bfec029cbc5c6", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/scheduler.service.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/scheduler.service.ts:28"}, "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-52719319e41b8d30", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache-invalidator.service.ts:210", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache-invalidator.service.ts:210"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed6e68eaa0060dcf", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/cache.service.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/cache.service.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbc804f40513fd68", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/circuit-breaker.examples.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/circuit-breaker.examples.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-e2dd4cd36b00894a", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache.service.ts:265", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache.service.ts:265"}, "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-6193f5932df0f080", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/logging/security-event-logger.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/logging/security-event-logger.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-efe3ad1cde673b68", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/audit-flush.job.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/audit-flush.job.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-51c5c4cedc2213d1", "name": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/purge-accounts.job.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/purge-accounts.job.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-8e4860ad333cabd5", "name": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage1.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage1.ts:52"}, "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-0e9005b39625d16d", "name": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage2.ts:120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage2.ts:120"}, "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-345cc7af577181d1", "name": "Stray `console.log` in TS/JS \u2014 server/src/workers/affiliate.worker.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/workers/affiliate.worker.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76dcedc64feeac38", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/delete-settings-and-anonymize-consents-", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/delete-settings-and-anonymize-consents-on-user-purged.listener.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd307d7b43e9c562", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/create-settings-on-user-registered.list", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/create-settings-on-user-registered.listener.ts:41"}, "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-0bfa329071fb03a3", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/audit/application/listeners/anonymize-audit-logs-on-user-purged.listen", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/audit/application/listeners/anonymize-audit-logs-on-user-purged.listener.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-d4691e50e37aa76c", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/supplement.service.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/supplement.service.ts:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c486abfada019543", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/crawler.integration.test.ts:225", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/crawler.integration.test.ts:225"}, "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-e92c6c47cc1b7845", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/payments/application/payment.service.test.ts:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/payments/application/payment.service.test.ts:142"}, "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-cdc84c615a1882ba", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/create-profile-on-user-registered.listen", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/create-profile-on-user-registered.listener.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-42168687741c4592", "name": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/delete-profile-on-user-purged.listener.t", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/delete-profile-on-user-purged.listener.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-4c578b2ea32419ec", "name": "Stray `console.log` in TS/JS \u2014 server/src/queue/affiliate.queue.ts:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/queue/affiliate.queue.ts:140"}, "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-5999a92b93a2d960", "name": "Stray `console.log` in TS/JS \u2014 server/src/services/deduplication.service.ts:202", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/deduplication.service.ts:202"}, "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-1e3fa034bebd6a82", "name": "Stray `console.log` in TS/JS \u2014 server/src/services/filtering.service.ts:175", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/filtering.service.ts:175"}, "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-f793dc4aa67d96d8", "name": "TODO/FIXME marker in shipping code \u2014 backend/services/photo-storage.js:129", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/services/photo-storage.js:129"}, "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-404e85c1337f6e21", "name": "Stray `console.log` in TS/JS \u2014 e2e/complete-integration.test.ts:194", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/complete-integration.test.ts:194"}, "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-439099a24df43770", "name": "Stray `console.log` in TS/JS \u2014 e2e/checkin.spec.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/checkin.spec.ts:9"}, "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-3cf748d423194a8b", "name": "Stray `console.log` in TS/JS \u2014 e2e/my-stack.spec.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/my-stack.spec.ts:9"}, "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-1f18993f11c2d273", "name": "Docker base image is tag-pinned but not digest-pinned: node:20", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20"}, "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-d7158aa1e38492c6", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-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-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-2c482023445423a4", "name": "Runtime dotenv file present in repo: frontend/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "fullDescription": {"text": "`frontend/.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_FIREBASE_API_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-fec7442183f1189c", "name": "Insecure pattern 'direct_innerhtml_assignment' in setup-p2-files.js:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in setup-p2-files.js:111"}, "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-30f0d7514e7249fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/pwa-handler.js:102", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/pwa-handler.js:102"}, "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-a5b779e833592637", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/meta-manager.test.js:7", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/meta-manager.test.js:7"}, "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-d92354bc95a9198c", "name": "Possible secret in frontend/src/platform/form-validator.js", "shortDescription": {"text": "Possible secret in frontend/src/platform/form-validator.js"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6102d410f9fed1ac", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/platform/end-to-end-integration.test.js:37", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/platform/end-to-end-integration.test.js:37"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2d2bdf26866fa69", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/schema-manager.test.js:8", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/schema-manager.test.js:8"}, "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-77a20673d6718150", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/form-validator.test.js:340", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/form-validator.test.js:340"}, "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-759f77d1cdd4c26f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/global-error-modal.js:146", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/global-error-modal.js:146"}, "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-9a3b7a81b724bacd", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/error-boundary.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/error-boundary.js:52"}, "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-668b6ec089f56dd4", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/profile-page-grupo-b-integration.js:22", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/profile-page-grupo-b-integration.js:22"}, "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-add5ebcbdbb74ac5", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.test.js:10", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.test.js:10"}, "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-265452300ed71f39", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.test.js:160", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.test.js:160"}, "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-50deeaf0f49a3d25", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/nav.js:143", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/nav.js:143"}, "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-feb5213472dd580a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.js:166", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.js:166"}, "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-0008f50f254d3407", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.js:321", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.js:321"}, "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-0de5e408f8e4c514", "name": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/core/app.js:325", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/core/app.js:325"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b96717643182d89", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/router.js:108", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/router.js:108"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-265b214d9d0fe12e", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page.js:55"}, "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-924a2d3ef7125b05", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page-events.js:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page-events.js:41"}, "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-8965e6b8d30b706d", "name": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/features/settings/settings-page-utils.js:57", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/features/settings/settings-page-utils.js:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-537b3ed4a60188fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/legal-page.js:261", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/legal-page.js:261"}, "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-b4273787925aad5c", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/faq-page.js:221", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/faq-page.js:221"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5507261b1d7280e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/notifications/notification-preferences.js:145", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/notifications/notification-preferences.js:145"}, "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-a9a06f9d66255cf4", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/register-page.js:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/register-page.js:41"}, "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-897596d117c5618c", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/email-verification-banner.js:45", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/email-verification-banner.js:45"}, "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-ad52fd71b56872ae", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/forgot-password-page.js:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/forgot-password-page.js:23"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-662cff277a40d9c2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/reset-password-page.js:35", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/reset-password-page.js:35"}, "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-b2c663e13036c962", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-link-section.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-link-section.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b1053e6e269fc32", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/verify-email-page.js:62", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/verify-email-page.js:62"}, "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-049033058d11668d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/mfa-setup-modal.js:22", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/mfa-setup-modal.js:22"}, "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-c95b531c2600ae05", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-login-page.js:50", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-login-page.js:50"}, "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-0d7f581fce5a6421", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/features/auth/auth-error-recovery.e2e.test.js:262", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/features/auth/auth-error-recovery.e2e.test.js:262"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae621aa269d072a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/login-page.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/login-page.js:36"}, "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-4d681fd453587826", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/history-viewer.js:45", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/history-viewer.js:45"}, "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-86afb1f01af5c5dd", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/adherence-dashboard.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/adherence-dashboard.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-102b668d099f2d64", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-refactored.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-refactored.js:52"}, "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-2bf85a37e2e43346", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-list.js:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-list.js:23"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e3f27bc14b97293", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-replenishment.js:18", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-replenishment.js:18"}, "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-e1d3bd5a2b52feed", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page.js:52"}, "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-505c12474504f82d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-stats.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-stats.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f0372b47360b68ca", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.test.js:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.test.js:24"}, "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-c49545b9a880edf8", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.test.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.test.js:55"}, "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-24d536d47a67bef6", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/supplement-detail-modal.js:49", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/supplement-detail-modal.js:49"}, "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-198a0d80af29428c", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-modal.js:154", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-modal.js:154"}, "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-ec52a7951c8ead94", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-monolith-backup.js:99", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-monolith-backup.js:99"}, "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-7b0d57ff0d35ab1a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.test.js:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.test.js:44"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a45281e6cf4a52af", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.js:107", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.js:107"}, "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-ba0d480cc65bef49", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.js:66", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.js:66"}, "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-91cc129f68878428", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/advanced-search-page.js:137", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/advanced-search-page.js:137"}, "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-dcc91c1380884be9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.js:253", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.js:253"}, "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-2880bdd43dd180da", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.js:28", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.js:28"}, "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-05f2edb5c1dead13", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.test.js:61", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.test.js:61"}, "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-aba4e5c0dca297d7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-products-page.js:22", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-products-page.js:22"}, "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-ed15d2c89e19c143", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-orders-page.js:28", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-orders-page.js:28"}, "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-0c60ccc33f0d6ed7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/subscription-result-page.js:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/subscription-result-page.js:41"}, "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-9f10e42938f2c79a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/checkout-modal.js:56", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/checkout-modal.js:56"}, "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-32034497016b6f86", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/calculator/calculator-page.js:60", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/calculator/calculator-page.js:60"}, "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-64ba0e261807ed05", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/onboarding/onboarding-page.js:61", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/onboarding/onboarding-page.js:61"}, "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-26138d7a24f96d87", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.js:551", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.js:551"}, "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-eba353be84ed62c7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.test.js:98", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.test.js:98"}, "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-1286ba7998001df9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/photo-upload.js:262", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/photo-upload.js:262"}, "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-b573c02be3239d3b", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/profile-page.js:160", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/profile-page.js:160"}, "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-85e9fb3bc8b9f139", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.test.js:85", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.test.js:85"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18d9540f220fde3a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/streak-celebration.js:97", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/streak-celebration.js:97"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4976230b9aef7470", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.js:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.js:76"}, "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-e630a4ef94a0d306", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/reports/report-visualizer.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/reports/report-visualizer.js:55"}, "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-84cede5f2f36c2fc", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/favorites/favorites-page.js:69", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/favorites/favorites-page.js:69"}, "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-ab7a7e6286b2d998", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/price-comparison-page.js:32", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/price-comparison-page.js:32"}, "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-aadb7c4848c8a54b", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/integrated-price-page.js:45", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/integrated-price-page.js:45"}, "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-179e1a7d0cc043c7", "name": "Possible secret in e2e/auth.setup.ts", "shortDescription": {"text": "Possible secret in e2e/auth.setup.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b790b5dff379733e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-28c4a04bd807da0c", "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-ad6701f0a8405e22", "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-3d8d277ebd9de53e", "name": "Very large file: frontend/src/features/supplements/list-page.js (2073 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/supplements/list-page.js (2073 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-96875e47051eba08", "name": "Very large file: frontend/src/features/history/history-page.js (1207 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/history/history-page.js (1207 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-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-d7101ca1926e3342", "name": "Node manifest has dependencies but no lockfile: server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: server/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 344 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 116 placeholder/mock markers across 35 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-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-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-899007e905634086", "name": "Commented-code block (6 lines) in frontend/service-worker.js:171", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/service-worker.js:171"}, "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-e5fe8b199f5b0499", "name": "Commented-code block (6 lines) in frontend/src/state/state-manager.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/state/state-manager.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53c66bae456df3e1", "name": "Commented-code block (5 lines) in frontend/src/analytics/metrics-aggregator.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/analytics/metrics-aggregator.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca69b0ee961f4218", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/pwa-offline.js:218", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/pwa-offline.js:218"}, "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-39d3e5ce83548af3", "name": "Commented-code block (5 lines) in frontend/src/platform/firecrawl-scraper.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/platform/firecrawl-scraper.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab53a3fedb22d85a", "name": "Commented-code block (9 lines) in frontend/src/platform/schema-manager.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/platform/schema-manager.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7346c4e703c35641", "name": "Commented-code block (7 lines) in frontend/src/platform/storage-manager.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/platform/storage-manager.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a3b8a1d234037fd", "name": "Commented-code block (6 lines) in frontend/src/platform/notification-manager.js:159", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/platform/notification-manager.js:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33563b4093e79a33", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/end-to-end-integration.test.js:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/end-to-end-integration.test.js:58"}, "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-0787264567e125c2", "name": "Commented-code block (5 lines) in frontend/src/platform/meta-manager.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/platform/meta-manager.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a2eff9d98b5148c", "name": "Commented-code block (6 lines) in frontend/src/core/event-bus.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/core/event-bus.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3864ae66a4e02eb8", "name": "Commented-code block (5 lines) in frontend/src/core/nav.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/core/nav.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc707a923aa238df", "name": "Commented-code block (6 lines) in frontend/src/core/virtual-scroller.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/core/virtual-scroller.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7341c27b75f2369f", "name": "Commented-code block (6 lines) in frontend/src/core/app.js:224", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/core/app.js:224"}, "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-eef47f57e5c8d601", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/notifications/notification-preferences.js:200", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/notifications/notification-preferences.js:200"}, "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-344b180c81a8d4e8", "name": "Commented-code block (5 lines) in frontend/src/features/auth/auth-guard.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/auth/auth-guard.js:7"}, "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-d0429a8cbd49b295", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js:266", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js:266"}, "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-55d8a1fa286c0aa6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/supplements/list-page.js:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/supplements/list-page.js:71"}, "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-75e755cba9235e31", "name": "Commented-code block (5 lines) in frontend/src/features/calculator/dosage-calculator.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/calculator/dosage-calculator.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-048cd2cd1efcd680", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/profile/photo-upload.js:354", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/profile/photo-upload.js:354"}, "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-5d6cc0e36d13d8f6", "name": "Commented-code block (5 lines) in api/index.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in api/index.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-a7aa9d8b4ee548bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-firecrawl.js:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-firecrawl.js:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98b6460d8b7eb822", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-and-validate.js:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-and-validate.js:53"}, "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-fc91c8f5eaee1c3c", "name": "Commented-code block (5 lines) in server/src/shared/examples/query-cache-integration.example.ts:385", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/shared/examples/query-cache-integration.example.ts:385"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcdf48b26282f65e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/shared/services/circuit-breaker.examples.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/shared/services/circuit-breaker.examples.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9448772e7f66e865", "name": "Commented-code block (5 lines) in server/src/shared/infrastructure/redis/redis.client.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/shared/infrastructure/redis/redis.client.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdf1175cff3c659e", "name": "Commented-code block (6 lines) in server/src/modules/supplements/presentation/express/supplement.controller.ts:93", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/modules/supplements/presentation/express/supplement.controller.ts:93"}, "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-a58869d7fe1a8653", "name": "Commented-code block (5 lines) in server/src/modules/profile/infrastructure/mongoose/mongoose-profile.repository.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/modules/profile/infrastructure/mongoose/mongoose-profile.repository.ts:34"}, "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-c32dcb97ab599617", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/routes/profile.js:356", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/routes/profile.js:356"}, "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-5c41bb1a1f430bd6", "name": "39 env vars used in code but missing from .env.example", "shortDescription": {"text": "39 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAIL`, `AFFILIATE_KEY`, `AMAZON_API_KEY`, `ANALYZE`, `API_URL`, `AWS_LAMBDA_FUNCTION_NAME`, `CI`, `CRON_SECRET` + 31 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-a22248debd0f6fe3", "name": "Dangling fetch: GET /api/notifications/pending?userId=${userId} (frontend/public/sw.js:160)", "shortDescription": {"text": "Dangling fetch: GET /api/notifications/pending?userId=${userId} (frontend/public/sw.js:160)"}, "fullDescription": {"text": "`frontend/public/sw.js:160` calls `GET /api/notifications/pending?userId=${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/pending`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3d74c766d9d57494", "name": "Dangling fetch: POST /api/notifications/track (frontend/public/sw.js:187)", "shortDescription": {"text": "Dangling fetch: POST /api/notifications/track (frontend/public/sw.js:187)"}, "fullDescription": {"text": "`frontend/public/sw.js:187` calls `POST /api/notifications/track` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/track`\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-7dacb68e5c850dbb", "name": "Dangling fetch: POST /api/checkin (frontend/src/platform/pwa-offline.js:218)", "shortDescription": {"text": "Dangling fetch: POST /api/checkin (frontend/src/platform/pwa-offline.js:218)"}, "fullDescription": {"text": "`frontend/src/platform/pwa-offline.js:218` calls `POST /api/checkin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/checkin`\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-5abac4e6473bc601", "name": "Dangling fetch: POST /api/supplements (frontend/src/platform/pwa-offline.js:232)", "shortDescription": {"text": "Dangling fetch: POST /api/supplements (frontend/src/platform/pwa-offline.js:232)"}, "fullDescription": {"text": "`frontend/src/platform/pwa-offline.js:232` calls `POST /api/supplements` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/supplements`\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-0ed850efa450f902", "name": "Dangling fetch: PUT /api/profile/me (frontend/src/platform/pwa-offline.js:246)", "shortDescription": {"text": "Dangling fetch: PUT /api/profile/me (frontend/src/platform/pwa-offline.js:246)"}, "fullDescription": {"text": "`frontend/src/platform/pwa-offline.js:246` calls `PUT /api/profile/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profile/me`\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-f558edb6533f7151", "name": "Dangling fetch: GET /api/supplements (frontend/src/platform/end-to-end-integration.test.js:58)", "shortDescription": {"text": "Dangling fetch: GET /api/supplements (frontend/src/platform/end-to-end-integration.test.js:58)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:58` calls `GET /api/supplements` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/supplements`\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-214e92f2992d5513", "name": "Dangling fetch: POST /api/stack (frontend/src/platform/end-to-end-integration.test.js:70)", "shortDescription": {"text": "Dangling fetch: POST /api/stack (frontend/src/platform/end-to-end-integration.test.js:70)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:70` calls `POST /api/stack` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stack`\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-16f2e0006dee1d76", "name": "Dangling fetch: POST /api/subscriptions/checkout (frontend/src/platform/end-to-end-integration.test.js:127)", "shortDescription": {"text": "Dangling fetch: POST /api/subscriptions/checkout (frontend/src/platform/end-to-end-integration.test.js:127)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:127` calls `POST /api/subscriptions/checkout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/subscriptions/checkout`\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-f89004c00e92407b", "name": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:142)", "shortDescription": {"text": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:142)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:142` calls `POST /api/payments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payments`\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-919e49046ef3ab08", "name": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:160)", "shortDescription": {"text": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:160)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:160` calls `POST /api/payments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payments`\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-705945d17273a8e8", "name": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:199)", "shortDescription": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:199)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:199` calls `GET /api/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data`\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-5c434ecc0f3d5655", "name": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:202)", "shortDescription": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:202)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:202` calls `GET /api/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data`\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-2ea751e79887d2f9", "name": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:216)", "shortDescription": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:216)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:216` calls `GET /api/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data`\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-d95e3e0cb17df9d2", "name": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:221)", "shortDescription": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:221)"}, "fullDescription": {"text": "`frontend/src/platform/end-to-end-integration.test.js:221` calls `GET /api/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data`\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-badeb69917835fe9", "name": "Dangling fetch: GET /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:37)", "shortDescription": {"text": "Dangling fetch: GET /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:37)"}, "fullDescription": {"text": "`frontend/src/features/notifications/notification-preferences.js:37` calls `GET /api/notifications/preferences` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/preferences`\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-f242b63b5df75edf", "name": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:200)", "shortDescription": {"text": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:200)"}, "fullDescription": {"text": "`frontend/src/features/notifications/notification-preferences.js:200` calls `PUT /api/notifications/preferences` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/preferences`\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-f4e76329cbd7cb45", "name": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:232)", "shortDescription": {"text": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:232)"}, "fullDescription": {"text": "`frontend/src/features/notifications/notification-preferences.js:232` calls `PUT /api/notifications/preferences` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/preferences`\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-7c9465a0eb68c99f", "name": "Dangling fetch: POST /api/notifications/schedule (frontend/src/features/notifications/notification-preferences.js:252)", "shortDescription": {"text": "Dangling fetch: POST /api/notifications/schedule (frontend/src/features/notifications/notification-preferences.js:252)"}, "fullDescription": {"text": "`frontend/src/features/notifications/notification-preferences.js:252` calls `POST /api/notifications/schedule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/schedule`\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-4d941abef7fa4096", "name": "Dangling fetch: GET /api/notifications/analytics (frontend/src/features/notifications/notification-preferences.js:277)", "shortDescription": {"text": "Dangling fetch: GET /api/notifications/analytics (frontend/src/features/notifications/notification-preferences.js:277)"}, "fullDescription": {"text": "`frontend/src/features/notifications/notification-preferences.js:277` calls `GET /api/notifications/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notifications/analytics`\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-1b9336747c70e0ec", "name": "Dangling fetch: GET /data/prices.json (frontend/src/features/stack/my-stack-page-utils.js:19)", "shortDescription": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/stack/my-stack-page-utils.js:19)"}, "fullDescription": {"text": "`frontend/src/features/stack/my-stack-page-utils.js:19` calls `GET /data/prices.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/prices.json`\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-9958d3aacade6267", "name": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page-monolith-backup.js:64)", "shortDescription": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page-monolith-backup.js:64)"}, "fullDescription": {"text": "`frontend/src/features/supplements/list-page-monolith-backup.js:64` calls `GET /data/prices.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/prices.json`\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-3043eab833ff0339", "name": "Dangling fetch: GET /data/supplements-db.json (frontend/src/features/supplements/list-page.js:71)", "shortDescription": {"text": "Dangling fetch: GET /data/supplements-db.json (frontend/src/features/supplements/list-page.js:71)"}, "fullDescription": {"text": "`frontend/src/features/supplements/list-page.js:71` calls `GET /data/supplements-db.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/supplements-db.json`\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-3bc177418e696865", "name": "Dangling fetch: GET /api/supplements/prices?ids=${encodeURIComponent(supplementIds)} (frontend/src/features/supplements/", "shortDescription": {"text": "Dangling fetch: GET /api/supplements/prices?ids=${encodeURIComponent(supplementIds)} (frontend/src/features/supplements/list-page.js:103)"}, "fullDescription": {"text": "`frontend/src/features/supplements/list-page.js:103` calls `GET /api/supplements/prices?ids=${encodeURIComponent(supplementIds)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/supplements/prices`\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-c9ca51315e327cb5", "name": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page.js:143)", "shortDescription": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page.js:143)"}, "fullDescription": {"text": "`frontend/src/features/supplements/list-page.js:143` calls `GET /data/prices.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/prices.json`\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-f8fec6e0dab9f004", "name": "Dangling fetch: GET /api/reports/dashboard (frontend/src/features/reports/report-visualizer.js:32)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/dashboard (frontend/src/features/reports/report-visualizer.js:32)"}, "fullDescription": {"text": "`frontend/src/features/reports/report-visualizer.js:32` calls `GET /api/reports/dashboard` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/dashboard`\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-bf1b7ea3868aed4a", "name": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (server/src/shared/services/circuit-breaker.examples.ts:29)", "shortDescription": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (server/src/shared/services/circuit-breaker.examples.ts:29)"}, "fullDescription": {"text": "`server/src/shared/services/circuit-breaker.examples.ts:29` calls `POST https://api.firecrawl.dev/v1/scrape` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.firecrawl.dev/v1/scrape`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dbd8cce068578c3f", "name": "Dangling fetch: POST https://api.payment-gateway.com/process (server/src/shared/services/circuit-breaker.examples.ts:116", "shortDescription": {"text": "Dangling fetch: POST https://api.payment-gateway.com/process (server/src/shared/services/circuit-breaker.examples.ts:116)"}, "fullDescription": {"text": "`server/src/shared/services/circuit-breaker.examples.ts:116` calls `POST https://api.payment-gateway.com/process` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.payment-gateway.com/process`\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-b0ffb6584f642424", "name": "Dangling fetch: GET https://unreliable-api.com/data (server/src/shared/services/circuit-breaker.examples.ts:229)", "shortDescription": {"text": "Dangling fetch: GET https://unreliable-api.com/data (server/src/shared/services/circuit-breaker.examples.ts:229)"}, "fullDescription": {"text": "`server/src/shared/services/circuit-breaker.examples.ts:229` calls `GET https://unreliable-api.com/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/unreliable-api.com/data`\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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/routes/email.js` 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-52681d778ae5876a", "name": "Unused endpoint: POST /unsubscribe", "shortDescription": {"text": "Unused endpoint: POST /unsubscribe"}, "fullDescription": {"text": "`backend/routes/email.js` declares `POST /unsubscribe` 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-c7939d8970874fd5", "name": "Unused endpoint: POST /resubscribe", "shortDescription": {"text": "Unused endpoint: POST /resubscribe"}, "fullDescription": {"text": "`backend/routes/email.js` declares `POST /resubscribe` 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-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`backend/routes/email.js` declares `GET /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-b8764484f2d99e7b", "name": "Unused endpoint: GET /preferences", "shortDescription": {"text": "Unused endpoint: GET /preferences"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `GET /preferences` 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-0b6f3e56a23ece9a", "name": "Unused endpoint: PUT /preferences", "shortDescription": {"text": "Unused endpoint: PUT /preferences"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `PUT /preferences` 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-a61d8365b9281c84", "name": "Unused endpoint: POST /schedule", "shortDescription": {"text": "Unused endpoint: POST /schedule"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `POST /schedule` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f5d79195606d3fb", "name": "Unused endpoint: POST /track", "shortDescription": {"text": "Unused endpoint: POST /track"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `POST /track` 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-9de4cecd0e235584", "name": "Unused endpoint: GET /pending", "shortDescription": {"text": "Unused endpoint: GET /pending"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `GET /pending` 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-4629fc2f2a182ac9", "name": "Unused endpoint: GET /analytics", "shortDescription": {"text": "Unused endpoint: GET /analytics"}, "fullDescription": {"text": "`backend/routes/notifications.js` declares `GET /analytics` 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-8445b057f72d6ece", "name": "Unused endpoint: GET /heatmap", "shortDescription": {"text": "Unused endpoint: GET /heatmap"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /heatmap` 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-dad90d47f699ffbc", "name": "Unused endpoint: GET /trend", "shortDescription": {"text": "Unused endpoint: GET /trend"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /trend` 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-47571fd84219ca1d", "name": "Unused endpoint: GET /streak", "shortDescription": {"text": "Unused endpoint: GET /streak"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /streak` 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-3792b8bde6ca387b", "name": "Unused endpoint: GET /achievements", "shortDescription": {"text": "Unused endpoint: GET /achievements"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /achievements` 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-e82280e71bd6022c", "name": "Unused endpoint: GET /supplements/:supplementId", "shortDescription": {"text": "Unused endpoint: GET /supplements/:supplementId"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /supplements/:supplementId` 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-5ce4bd8d2c1abf63", "name": "Unused endpoint: GET /monthly", "shortDescription": {"text": "Unused endpoint: GET /monthly"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /monthly` 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-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`backend/routes/reports.js` declares `GET /dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/routes/profile.js` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`backend/routes/profile.js` declares `PUT /` 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-cd0d83d5e9fd3333", "name": "Unused endpoint: POST /photo", "shortDescription": {"text": "Unused endpoint: POST /photo"}, "fullDescription": {"text": "`backend/routes/profile.js` declares `POST /photo` 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-4f39b353617e66db", "name": "Unused endpoint: DELETE /photo", "shortDescription": {"text": "Unused endpoint: DELETE /photo"}, "fullDescription": {"text": "`backend/routes/profile.js` declares `DELETE /photo` 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-e9f356251d4143c5", "name": "Unused endpoint: GET /:userId/photo", "shortDescription": {"text": "Unused endpoint: GET /:userId/photo"}, "fullDescription": {"text": "`backend/routes/profile.js` declares `GET /:userId/photo` 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-203ec659ed8ada77", "name": "Unused endpoint: USE /api/webhooks", "shortDescription": {"text": "Unused endpoint: USE /api/webhooks"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/webhooks` 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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/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-2eeaf8c5695bbc33", "name": "Unused endpoint: USE /api/profile", "shortDescription": {"text": "Unused endpoint: USE /api/profile"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/profile` 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-8ca4664c9cda1cd6", "name": "Unused endpoint: USE /api/settings", "shortDescription": {"text": "Unused endpoint: USE /api/settings"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/settings` 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-ac2e8a1655395ddd", "name": "Unused endpoint: USE /api/audit", "shortDescription": {"text": "Unused endpoint: USE /api/audit"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/audit` 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-dea02ef19cb2e5d2", "name": "Unused endpoint: USE /api/stack", "shortDescription": {"text": "Unused endpoint: USE /api/stack"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/stack` 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-0d8f9140c98c351f", "name": "Unused endpoint: USE /api/favorites", "shortDescription": {"text": "Unused endpoint: USE /api/favorites"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/favorites` 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-05dab71137f3b04c", "name": "Unused endpoint: USE /api/checkin", "shortDescription": {"text": "Unused endpoint: USE /api/checkin"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/checkin` 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-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/notifications` 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-2a06e6d401449b82", "name": "Unused endpoint: USE /api/reports", "shortDescription": {"text": "Unused endpoint: USE /api/reports"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/reports` 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-2c65474321f2bad9", "name": "Unused endpoint: USE /api/supplements", "shortDescription": {"text": "Unused endpoint: USE /api/supplements"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/supplements` 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-f8242ba07247d2f8", "name": "Unused endpoint: USE /api/payments", "shortDescription": {"text": "Unused endpoint: USE /api/payments"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/payments` 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-8e8a172453f79b56", "name": "Unused endpoint: USE /api/subscriptions", "shortDescription": {"text": "Unused endpoint: USE /api/subscriptions"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/subscriptions` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`server/src/app.ts` declares `USE /api/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-d6d412ba6647f6cc", "name": "Unused endpoint: GET /live", "shortDescription": {"text": "Unused endpoint: GET /live"}, "fullDescription": {"text": "`server/src/routes/health.ts` declares `GET /live` 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-8c236625afb6a8cb", "name": "Unused endpoint: GET /ready", "shortDescription": {"text": "Unused endpoint: GET /ready"}, "fullDescription": {"text": "`server/src/routes/health.ts` declares `GET /ready` 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-0633bf0c760ca788", "name": "Unused endpoint: GET /detailed", "shortDescription": {"text": "Unused endpoint: GET /detailed"}, "fullDescription": {"text": "`server/src/routes/health.ts` declares `GET /detailed` 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-6ecd69835fb7d5cd", "name": "Unused endpoint: GET /:alertId", "shortDescription": {"text": "Unused endpoint: GET /:alertId"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `GET /:alertId` 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-be02d2b26b01bea8", "name": "Unused endpoint: PATCH /:alertId", "shortDescription": {"text": "Unused endpoint: PATCH /:alertId"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `PATCH /:alertId` 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-d05aff2b1bf7f93e", "name": "Unused endpoint: DELETE /:alertId", "shortDescription": {"text": "Unused endpoint: DELETE /:alertId"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `DELETE /:alertId` 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-3cb1106cb968b446", "name": "Unused endpoint: GET /history/:productId", "shortDescription": {"text": "Unused endpoint: GET /history/:productId"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `GET /history/:productId` 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-984cc260847a0c3b", "name": "Unused endpoint: POST /device-tokens", "shortDescription": {"text": "Unused endpoint: POST /device-tokens"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `POST /device-tokens` 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-8d39caadc9d4a859", "name": "Unused endpoint: DELETE /device-tokens/:tokenId", "shortDescription": {"text": "Unused endpoint: DELETE /device-tokens/:tokenId"}, "fullDescription": {"text": "`server/src/routes/price-alerts.routes.ts` declares `DELETE /device-tokens/:tokenId` 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-b127d7ad4b5d81c6", "name": "Unused endpoint: POST /out", "shortDescription": {"text": "Unused endpoint: POST /out"}, "fullDescription": {"text": "`server/src/routes/affiliate.routes.ts` declares `POST /out` 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-93f4ec62bae553ff", "name": "Unused endpoint: GET /api/admin/cache/stats", "shortDescription": {"text": "Unused endpoint: GET /api/admin/cache/stats"}, "fullDescription": {"text": "`server/src/routes/cache-admin.routes.ts` declares `GET /api/admin/cache/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-9dd3a52938f5501c", "name": "Unused endpoint: POST /api/admin/cache/flush", "shortDescription": {"text": "Unused endpoint: POST /api/admin/cache/flush"}, "fullDescription": {"text": "`server/src/routes/cache-admin.routes.ts` declares `POST /api/admin/cache/flush` 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-b243e567063b34d0", "name": "Unused endpoint: POST /api/admin/cache/invalidate", "shortDescription": {"text": "Unused endpoint: POST /api/admin/cache/invalidate"}, "fullDescription": {"text": "`server/src/routes/cache-admin.routes.ts` declares `POST /api/admin/cache/invalidate` 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-b9a31d970b6073f7", "name": "Unused endpoint: POST /api/admin/cache/invalidate/products", "shortDescription": {"text": "Unused endpoint: POST /api/admin/cache/invalidate/products"}, "fullDescription": {"text": "`server/src/routes/cache-admin.routes.ts` declares `POST /api/admin/cache/invalidate/products` 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/20203"}, "properties": {"repository": "SrUniverse/suplilist", "repoUrl": "https://github.com/SrUniverse/suplilist", "branch": "main"}, "results": [{"ruleId": "scanner-f7fd522094a3e315", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 setup-p2-files.js:593"}, "properties": {"repobilityId": "dd66e428b269eb9c", "scanner": "scanner-primary", "fingerprint": "f7fd522094a3e315", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a93d2b1c84d7aaac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/service-worker.js:22"}, "properties": {"repobilityId": "3ecefb00281523f6", "scanner": "scanner-primary", "fingerprint": "a93d2b1c84d7aaac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1efcbdd50b11ef7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/public/sw.js:23"}, "properties": {"repobilityId": "27dc6e6fcac3502d", "scanner": "scanner-primary", "fingerprint": "1efcbdd50b11ef7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-076c4cd9be71f1ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/state/state-manager.js:846"}, "properties": {"repobilityId": "bcdaacfb516aaa48", "scanner": "scanner-primary", "fingerprint": "076c4cd9be71f1ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cdc6740957026ddd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/utils/logger.js:9"}, "properties": {"repobilityId": "ae0a58671b6d0a9a", "scanner": "scanner-primary", "fingerprint": "cdc6740957026ddd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9e20ab1f98867fc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/platform/storage-manager-validation.test.js:232"}, "properties": {"repobilityId": "58fde9570cc01e37", "scanner": "scanner-primary", "fingerprint": "f9e20ab1f98867fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ab5960ea9a37351e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/platform/toast-service.js:12"}, "properties": {"repobilityId": "5911338a3c7ef09b", "scanner": "scanner-primary", "fingerprint": "ab5960ea9a37351e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94e3db112bf95ecb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/core/event-bus.js:217"}, "properties": {"repobilityId": "cda060b3310a59d9", "scanner": "scanner-primary", "fingerprint": "94e3db112bf95ecb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8da9afa9f5a7ac12", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/core/virtual-scroller.js:217"}, "properties": {"repobilityId": "77d4b248080e8107", "scanner": "scanner-primary", "fingerprint": "8da9afa9f5a7ac12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2d3eccdcfa33373d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js:144"}, "properties": {"repobilityId": "91ed38eef3071b8d", "scanner": "scanner-primary", "fingerprint": "2d3eccdcfa33373d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c622f49fe84ec3e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/features/history/history-page.js:1147"}, "properties": {"repobilityId": "315438529978d89c", "scanner": "scanner-primary", "fingerprint": "0c622f49fe84ec3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b30b3f2e20e6f983", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-firecrawl.js:17"}, "properties": {"repobilityId": "d73d20acb0060acb", "scanner": "scanner-primary", "fingerprint": "b30b3f2e20e6f983", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-469f5ef72e52cd75", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-and-validate.js:32"}, "properties": {"repobilityId": "56312a2b8e52b7bf", "scanner": "scanner-primary", "fingerprint": "469f5ef72e52cd75", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-985fc6ed441a249f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-example.js:23"}, "properties": {"repobilityId": "05b1e6fe2dcc2d95", "scanner": "scanner-primary", "fingerprint": "985fc6ed441a249f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c47bbce175fe08d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/migrate-add-role.ts:22"}, "properties": {"repobilityId": "9f7c0cff63570fbf", "scanner": "scanner-primary", "fingerprint": "c47bbce175fe08d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13991dbff3bc219e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/server.ts:32"}, "properties": {"repobilityId": "c877d8719ee3ec5f", "scanner": "scanner-primary", "fingerprint": "13991dbff3bc219e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e6178c17b62f395", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.ts:35"}, "properties": {"repobilityId": "d9b0eb0822f50573", "scanner": "scanner-primary", "fingerprint": "3e6178c17b62f395", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5b2346092029a029", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/middleware/tracing.middleware.ts:108"}, "properties": {"repobilityId": "6cab33855fe3b6de", "scanner": "scanner-primary", "fingerprint": "5b2346092029a029", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de31b93427b5acd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/database.config.ts:49"}, "properties": {"repobilityId": "0963956a18659af7", "scanner": "scanner-primary", "fingerprint": "de31b93427b5acd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6aa856a1158b116e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/config/redis.config.ts:44"}, "properties": {"repobilityId": "58a2922a802d5a60", "scanner": "scanner-primary", "fingerprint": "6aa856a1158b116e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee013c564848477c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/test/global-setup.ts:65"}, "properties": {"repobilityId": "3ae27f5f50445ddf", "scanner": "scanner-primary", "fingerprint": "ee013c564848477c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7e1d328e5856ad1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/utils/metrics-cache.extension.ts:330"}, "properties": {"repobilityId": "ce985a05392ae7b2", "scanner": "scanner-primary", "fingerprint": "d7e1d328e5856ad1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b587fcbcf663de60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/examples/query-cache-integration.example.ts:299"}, "properties": {"repobilityId": "1320e0bf7cbc2cc2", "scanner": "scanner-primary", "fingerprint": "b587fcbcf663de60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f0157770377d8b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/firecrawl.service.ts:101"}, "properties": {"repobilityId": "dbb23731f1a94cfb", "scanner": "scanner-primary", "fingerprint": "8f0157770377d8b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-757bfec029cbc5c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/scheduler.service.ts:28"}, "properties": {"repobilityId": "f4d51e9ed9d7d65d", "scanner": "scanner-primary", "fingerprint": "757bfec029cbc5c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52719319e41b8d30", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache-invalidator.service.ts:210"}, "properties": {"repobilityId": "d6fc04872725dcc3", "scanner": "scanner-primary", "fingerprint": "52719319e41b8d30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed6e68eaa0060dcf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/cache.service.ts:34"}, "properties": {"repobilityId": "ee6dfd481681f81b", "scanner": "scanner-primary", "fingerprint": "ed6e68eaa0060dcf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbc804f40513fd68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/circuit-breaker.examples.ts:20"}, "properties": {"repobilityId": "f11180046d655e01", "scanner": "scanner-primary", "fingerprint": "bbc804f40513fd68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2dd4cd36b00894a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/services/query-cache.service.ts:265"}, "properties": {"repobilityId": "4586b8921354d740", "scanner": "scanner-primary", "fingerprint": "e2dd4cd36b00894a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6193f5932df0f080", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/logging/security-event-logger.ts:32"}, "properties": {"repobilityId": "22f39c33ec51336d", "scanner": "scanner-primary", "fingerprint": "6193f5932df0f080", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efe3ad1cde673b68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/audit-flush.job.ts:23"}, "properties": {"repobilityId": "81ff569671272f72", "scanner": "scanner-primary", "fingerprint": "efe3ad1cde673b68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51c5c4cedc2213d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/shared/infrastructure/jobs/purge-accounts.job.ts:16"}, "properties": {"repobilityId": "36c482dac901b131", "scanner": "scanner-primary", "fingerprint": "51c5c4cedc2213d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e4860ad333cabd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage1.ts:52"}, "properties": {"repobilityId": "b316aab744e3eae3", "scanner": "scanner-primary", "fingerprint": "8e4860ad333cabd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e9005b39625d16d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/scripts/seed-stage2.ts:120"}, "properties": {"repobilityId": "963ad169b78bb208", "scanner": "scanner-primary", "fingerprint": "0e9005b39625d16d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-345cc7af577181d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/workers/affiliate.worker.ts:38"}, "properties": {"repobilityId": "bb2a1c85548f0f9b", "scanner": "scanner-primary", "fingerprint": "345cc7af577181d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76dcedc64feeac38", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/delete-settings-and-anonymize-consents-on-user-purged.listener.ts:21"}, "properties": {"repobilityId": "9412882e25430e70", "scanner": "scanner-primary", "fingerprint": "76dcedc64feeac38", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd307d7b43e9c562", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/settings/application/listeners/create-settings-on-user-registered.listener.ts:41"}, "properties": {"repobilityId": "9e9918548d242a5a", "scanner": "scanner-primary", "fingerprint": "cd307d7b43e9c562", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0bfa329071fb03a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/audit/application/listeners/anonymize-audit-logs-on-user-purged.listener.ts:12"}, "properties": {"repobilityId": "65d5575951ff96eb", "scanner": "scanner-primary", "fingerprint": "0bfa329071fb03a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4691e50e37aa76c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/supplement.service.ts:102"}, "properties": {"repobilityId": "0dad267831da596b", "scanner": "scanner-primary", "fingerprint": "d4691e50e37aa76c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c486abfada019543", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/supplements/application/crawler.integration.test.ts:225"}, "properties": {"repobilityId": "5066db0328e5291e", "scanner": "scanner-primary", "fingerprint": "c486abfada019543", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e92c6c47cc1b7845", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/payments/application/payment.service.test.ts:142"}, "properties": {"repobilityId": "ceb57ce998d672fb", "scanner": "scanner-primary", "fingerprint": "e92c6c47cc1b7845", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cdc84c615a1882ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/create-profile-on-user-registered.listener.ts:33"}, "properties": {"repobilityId": "280dc42c8822522f", "scanner": "scanner-primary", "fingerprint": "cdc84c615a1882ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42168687741c4592", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/modules/profile/application/listeners/delete-profile-on-user-purged.listener.ts:12"}, "properties": {"repobilityId": "8ddf024c72b0d437", "scanner": "scanner-primary", "fingerprint": "42168687741c4592", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c578b2ea32419ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/queue/affiliate.queue.ts:140"}, "properties": {"repobilityId": "aa209fb429edfc92", "scanner": "scanner-primary", "fingerprint": "4c578b2ea32419ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5999a92b93a2d960", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/deduplication.service.ts:202"}, "properties": {"repobilityId": "cf00169b7ae6580e", "scanner": "scanner-primary", "fingerprint": "5999a92b93a2d960", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e3fa034bebd6a82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/services/filtering.service.ts:175"}, "properties": {"repobilityId": "c3fc9ff6d803fac4", "scanner": "scanner-primary", "fingerprint": "1e3fa034bebd6a82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f793dc4aa67d96d8", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/services/photo-storage.js:129"}, "properties": {"repobilityId": "e695ee09e85b759a", "scanner": "scanner-primary", "fingerprint": "f793dc4aa67d96d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-404e85c1337f6e21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/complete-integration.test.ts:194"}, "properties": {"repobilityId": "654f428632068006", "scanner": "scanner-primary", "fingerprint": "404e85c1337f6e21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-439099a24df43770", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/checkin.spec.ts:9"}, "properties": {"repobilityId": "ec30951870b0b8f8", "scanner": "scanner-primary", "fingerprint": "439099a24df43770", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cf748d423194a8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/my-stack.spec.ts:9"}, "properties": {"repobilityId": "a5e2962d4236fd7d", "scanner": "scanner-primary", "fingerprint": "3cf748d423194a8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f18993f11c2d273", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20"}, "properties": {"repobilityId": "d70e6571673c88df", "scanner": "scanner-primary", "fingerprint": "1f18993f11c2d273", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-d7158aa1e38492c6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "fbf7e5c590a15ad8", "scanner": "scanner-primary", "fingerprint": "d7158aa1e38492c6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/Dockerfile"}, "region": {"startLine": 23}}}]}, {"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-2c482023445423a4", "level": "error", "message": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "properties": {"repobilityId": "f727d22a89e309c5", "scanner": "scanner-primary", "fingerprint": "2c482023445423a4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fec7442183f1189c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in setup-p2-files.js:111"}, "properties": {"repobilityId": "a888db3c154a93c4", "scanner": "scanner-primary", "fingerprint": "fec7442183f1189c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "setup-p2-files.js"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-30f0d7514e7249fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/pwa-handler.js:102"}, "properties": {"repobilityId": "807538ee8d83fe73", "scanner": "scanner-primary", "fingerprint": "30f0d7514e7249fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/pwa-handler.js"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-a5b779e833592637", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/meta-manager.test.js:7"}, "properties": {"repobilityId": "3aa6ee16a60fd897", "scanner": "scanner-primary", "fingerprint": "a5b779e833592637", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/meta-manager.test.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-d92354bc95a9198c", "level": "error", "message": {"text": "Possible secret in frontend/src/platform/form-validator.js"}, "properties": {"repobilityId": "50f44772ca71b180", "scanner": "scanner-primary", "fingerprint": "d92354bc95a9198c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/form-validator.js"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-d92354bc95a9198c", "level": "error", "message": {"text": "Possible secret in frontend/src/platform/form-validator.js"}, "properties": {"repobilityId": "50f44772ca71b180", "scanner": "scanner-primary", "fingerprint": "d92354bc95a9198c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/form-validator.js"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-6102d410f9fed1ac", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/platform/end-to-end-integration.test.js:37"}, "properties": {"repobilityId": "5064dde6fd4a77de", "scanner": "scanner-primary", "fingerprint": "6102d410f9fed1ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/end-to-end-integration.test.js"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-f2d2bdf26866fa69", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/schema-manager.test.js:8"}, "properties": {"repobilityId": "5519f1005e08faf3", "scanner": "scanner-primary", "fingerprint": "f2d2bdf26866fa69", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/schema-manager.test.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-77a20673d6718150", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/platform/form-validator.test.js:340"}, "properties": {"repobilityId": "4d36aaabfedaa4a1", "scanner": "scanner-primary", "fingerprint": "77a20673d6718150", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/platform/form-validator.test.js"}, "region": {"startLine": 340}}}]}, {"ruleId": "scanner-759f77d1cdd4c26f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/global-error-modal.js:146"}, "properties": {"repobilityId": "8b6473fadbf09c43", "scanner": "scanner-primary", "fingerprint": "759f77d1cdd4c26f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/global-error-modal.js"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-9a3b7a81b724bacd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/error-boundary.js:52"}, "properties": {"repobilityId": "45a6f459d9b0e572", "scanner": "scanner-primary", "fingerprint": "9a3b7a81b724bacd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/error-boundary.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-668b6ec089f56dd4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/profile-page-grupo-b-integration.js:22"}, "properties": {"repobilityId": "5110f20ed9f8454a", "scanner": "scanner-primary", "fingerprint": "668b6ec089f56dd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/profile-page-grupo-b-integration.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-add5ebcbdbb74ac5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.test.js:10"}, "properties": {"repobilityId": "93acae7e2f87f88d", "scanner": "scanner-primary", "fingerprint": "add5ebcbdbb74ac5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/app.test.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-265452300ed71f39", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.test.js:160"}, "properties": {"repobilityId": "edf5d4e5a36bf3ca", "scanner": "scanner-primary", "fingerprint": "265452300ed71f39", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/virtual-scroller.test.js"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-50deeaf0f49a3d25", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/nav.js:143"}, "properties": {"repobilityId": "6339a0dcf9e9a18b", "scanner": "scanner-primary", "fingerprint": "50deeaf0f49a3d25", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/nav.js"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-feb5213472dd580a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/virtual-scroller.js:166"}, "properties": {"repobilityId": "7e61db9240ce2352", "scanner": "scanner-primary", "fingerprint": "feb5213472dd580a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/virtual-scroller.js"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-0008f50f254d3407", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/app.js:321"}, "properties": {"repobilityId": "0197c7417b8c3fc2", "scanner": "scanner-primary", "fingerprint": "0008f50f254d3407", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/app.js"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-0de5e408f8e4c514", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/core/app.js:325"}, "properties": {"repobilityId": "0361ad8f4e6a1713", "scanner": "scanner-primary", "fingerprint": "0de5e408f8e4c514", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/app.js"}, "region": {"startLine": 325}}}]}, {"ruleId": "scanner-9b96717643182d89", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/core/router.js:108"}, "properties": {"repobilityId": "33e0e03b28a76725", "scanner": "scanner-primary", "fingerprint": "9b96717643182d89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/core/router.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-265b214d9d0fe12e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page.js:55"}, "properties": {"repobilityId": "02949be88e64a9b1", "scanner": "scanner-primary", "fingerprint": "265b214d9d0fe12e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/settings/settings-page.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-924a2d3ef7125b05", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/settings/settings-page-events.js:41"}, "properties": {"repobilityId": "bf024a73136f3687", "scanner": "scanner-primary", "fingerprint": "924a2d3ef7125b05", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/settings/settings-page-events.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-8965e6b8d30b706d", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in frontend/src/features/settings/settings-page-utils.js:57"}, "properties": {"repobilityId": "e3d06240e2b3a4d1", "scanner": "scanner-primary", "fingerprint": "8965e6b8d30b706d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/settings/settings-page-utils.js"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-537b3ed4a60188fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/legal-page.js:261"}, "properties": {"repobilityId": "af0efd03db68ff68", "scanner": "scanner-primary", "fingerprint": "537b3ed4a60188fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/legal/legal-page.js"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-b4273787925aad5c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/legal/faq-page.js:221"}, "properties": {"repobilityId": "a78506f9a541b771", "scanner": "scanner-primary", "fingerprint": "b4273787925aad5c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/legal/faq-page.js"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-5507261b1d7280e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/notifications/notification-preferences.js:145"}, "properties": {"repobilityId": "2621cbea8c4056f1", "scanner": "scanner-primary", "fingerprint": "5507261b1d7280e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/notifications/notification-preferences.js"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-a9a06f9d66255cf4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/register-page.js:41"}, "properties": {"repobilityId": "92507283e22aa24b", "scanner": "scanner-primary", "fingerprint": "a9a06f9d66255cf4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/register-page.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-897596d117c5618c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/email-verification-banner.js:45"}, "properties": {"repobilityId": "d00396a7760352c0", "scanner": "scanner-primary", "fingerprint": "897596d117c5618c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/email-verification-banner.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-ad52fd71b56872ae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/forgot-password-page.js:23"}, "properties": {"repobilityId": "61c867cfe576c105", "scanner": "scanner-primary", "fingerprint": "ad52fd71b56872ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/forgot-password-page.js"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-662cff277a40d9c2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/reset-password-page.js:35"}, "properties": {"repobilityId": "24bdd4a3fe1b4ad0", "scanner": "scanner-primary", "fingerprint": "662cff277a40d9c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/reset-password-page.js"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-b2c663e13036c962", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-link-section.js:39"}, "properties": {"repobilityId": "5775a2976cce794e", "scanner": "scanner-primary", "fingerprint": "b2c663e13036c962", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/phone-link-section.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-1b1053e6e269fc32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/verify-email-page.js:62"}, "properties": {"repobilityId": "e49748b80c5b3db7", "scanner": "scanner-primary", "fingerprint": "1b1053e6e269fc32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/verify-email-page.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-049033058d11668d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/mfa-setup-modal.js:22"}, "properties": {"repobilityId": "5d518becd8c2dab2", "scanner": "scanner-primary", "fingerprint": "049033058d11668d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/mfa-setup-modal.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-c95b531c2600ae05", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/phone-login-page.js:50"}, "properties": {"repobilityId": "7fc42d70fd413381", "scanner": "scanner-primary", "fingerprint": "c95b531c2600ae05", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/phone-login-page.js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-0d7f581fce5a6421", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/features/auth/auth-error-recovery.e2e.test.js:262"}, "properties": {"repobilityId": "0054c61bf50e9138", "scanner": "scanner-primary", "fingerprint": "0d7f581fce5a6421", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/auth-error-recovery.e2e.test.js"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-ae621aa269d072a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/auth/login-page.js:36"}, "properties": {"repobilityId": "4b6f07ca2f5d698c", "scanner": "scanner-primary", "fingerprint": "ae621aa269d072a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/auth/login-page.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-4d681fd453587826", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/history-viewer.js:45"}, "properties": {"repobilityId": "ffc068f36bfeb1e4", "scanner": "scanner-primary", "fingerprint": "4d681fd453587826", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/adherence/history-viewer.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-86afb1f01af5c5dd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/adherence/adherence-dashboard.js:39"}, "properties": {"repobilityId": "ff33b49f1db6afec", "scanner": "scanner-primary", "fingerprint": "86afb1f01af5c5dd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/adherence/adherence-dashboard.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-102b668d099f2d64", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-refactored.js:52"}, "properties": {"repobilityId": "c2bae1f870781be5", "scanner": "scanner-primary", "fingerprint": "102b668d099f2d64", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/stack/my-stack-page-refactored.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-2bf85a37e2e43346", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-list.js:23"}, "properties": {"repobilityId": "5699894d0ef61be3", "scanner": "scanner-primary", "fingerprint": "2bf85a37e2e43346", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/stack/my-stack-page-list.js"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-5e3f27bc14b97293", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-replenishment.js:18"}, "properties": {"repobilityId": "cf87b0b0ac112c30", "scanner": "scanner-primary", "fingerprint": "5e3f27bc14b97293", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/stack/my-stack-page-replenishment.js"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-e1d3bd5a2b52feed", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page.js:52"}, "properties": {"repobilityId": "509667c7e797333b", "scanner": "scanner-primary", "fingerprint": "e1d3bd5a2b52feed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/stack/my-stack-page.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-505c12474504f82d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/stack/my-stack-page-stats.js:31"}, "properties": {"repobilityId": "11909dd99c87333a", "scanner": "scanner-primary", "fingerprint": "505c12474504f82d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/stack/my-stack-page-stats.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-f0372b47360b68ca", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.test.js:24"}, "properties": {"repobilityId": "21a90c46b120bfc8", "scanner": "scanner-primary", "fingerprint": "f0372b47360b68ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-grid.test.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-c49545b9a880edf8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.test.js:55"}, "properties": {"repobilityId": "1d57371029f6b6a0", "scanner": "scanner-primary", "fingerprint": "c49545b9a880edf8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page.test.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-24d536d47a67bef6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/supplement-detail-modal.js:49"}, "properties": {"repobilityId": "d8e219d2d426b795", "scanner": "scanner-primary", "fingerprint": "24d536d47a67bef6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/supplement-detail-modal.js"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-198a0d80af29428c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-modal.js:154"}, "properties": {"repobilityId": "590a9d0d94aa5588", "scanner": "scanner-primary", "fingerprint": "198a0d80af29428c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-modal.js"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-ec52a7951c8ead94", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-monolith-backup.js:99"}, "properties": {"repobilityId": "73fefc1b76dd1e4f", "scanner": "scanner-primary", "fingerprint": "ec52a7951c8ead94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-monolith-backup.js"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-7b0d57ff0d35ab1a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.test.js:44"}, "properties": {"repobilityId": "14050c40030416eb", "scanner": "scanner-primary", "fingerprint": "7b0d57ff0d35ab1a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-search.test.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-a45281e6cf4a52af", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-grid.js:107"}, "properties": {"repobilityId": "5bfc56dd477c3ce2", "scanner": "scanner-primary", "fingerprint": "a45281e6cf4a52af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-grid.js"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-ba0d480cc65bef49", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page.js:66"}, "properties": {"repobilityId": "c03251f14a5242b9", "scanner": "scanner-primary", "fingerprint": "ba0d480cc65bef49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page.js"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-91cc129f68878428", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/advanced-search-page.js:137"}, "properties": {"repobilityId": "3863cb8b42beda3f", "scanner": "scanner-primary", "fingerprint": "91cc129f68878428", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/advanced-search-page.js"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-dcc91c1380884be9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/supplements/list-page-search.js:253"}, "properties": {"repobilityId": "84a75dc85e29bb8b", "scanner": "scanner-primary", "fingerprint": "dcc91c1380884be9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/supplements/list-page-search.js"}, "region": {"startLine": 253}}}]}, {"ruleId": "scanner-2880bdd43dd180da", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.js:28"}, "properties": {"repobilityId": "5c76b1349e922b3c", "scanner": "scanner-primary", "fingerprint": "2880bdd43dd180da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/home/home-page.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-05f2edb5c1dead13", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/home/home-page.test.js:61"}, "properties": {"repobilityId": "5b4a44aff80d4866", "scanner": "scanner-primary", "fingerprint": "05f2edb5c1dead13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/home/home-page.test.js"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-aba4e5c0dca297d7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-products-page.js:22"}, "properties": {"repobilityId": "10976b015a19b419", "scanner": "scanner-primary", "fingerprint": "aba4e5c0dca297d7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/admin/admin-products-page.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-ed15d2c89e19c143", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/admin/admin-orders-page.js:28"}, "properties": {"repobilityId": "4f90aca4a61c94c9", "scanner": "scanner-primary", "fingerprint": "ed15d2c89e19c143", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/admin/admin-orders-page.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-0c60ccc33f0d6ed7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/subscription-result-page.js:41"}, "properties": {"repobilityId": "6f5b9afb478beceb", "scanner": "scanner-primary", "fingerprint": "0c60ccc33f0d6ed7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/premium/subscription-result-page.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-9f10e42938f2c79a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/premium/checkout-modal.js:56"}, "properties": {"repobilityId": "ecbf6498f897814c", "scanner": "scanner-primary", "fingerprint": "9f10e42938f2c79a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/premium/checkout-modal.js"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-32034497016b6f86", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/calculator/calculator-page.js:60"}, "properties": {"repobilityId": "3a2fe38a6649c058", "scanner": "scanner-primary", "fingerprint": "32034497016b6f86", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/calculator/calculator-page.js"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-64ba0e261807ed05", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/onboarding/onboarding-page.js:61"}, "properties": {"repobilityId": "153906f24d93bc2d", "scanner": "scanner-primary", "fingerprint": "64ba0e261807ed05", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/onboarding/onboarding-page.js"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-26138d7a24f96d87", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.js:551"}, "properties": {"repobilityId": "0263694db70dec70", "scanner": "scanner-primary", "fingerprint": "26138d7a24f96d87", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/history/history-page.js"}, "region": {"startLine": 551}}}]}, {"ruleId": "scanner-eba353be84ed62c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/history/history-page.test.js:98"}, "properties": {"repobilityId": "644412777195311d", "scanner": "scanner-primary", "fingerprint": "eba353be84ed62c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/history/history-page.test.js"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-1286ba7998001df9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/photo-upload.js:262"}, "properties": {"repobilityId": "40c69672ea5fab39", "scanner": "scanner-primary", "fingerprint": "1286ba7998001df9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/profile/photo-upload.js"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-b573c02be3239d3b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/profile/profile-page.js:160"}, "properties": {"repobilityId": "faf6cd0d99ab0483", "scanner": "scanner-primary", "fingerprint": "b573c02be3239d3b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/profile/profile-page.js"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-85e9fb3bc8b9f139", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.test.js:85"}, "properties": {"repobilityId": "457988ecbfc845c0", "scanner": "scanner-primary", "fingerprint": "85e9fb3bc8b9f139", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/checkin/checkin-page.test.js"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-18d9540f220fde3a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/streak-celebration.js:97"}, "properties": {"repobilityId": "7ff6904a2950b8d2", "scanner": "scanner-primary", "fingerprint": "18d9540f220fde3a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/checkin/streak-celebration.js"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-4976230b9aef7470", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/checkin/checkin-page.js:76"}, "properties": {"repobilityId": "2a79a918b85c5223", "scanner": "scanner-primary", "fingerprint": "4976230b9aef7470", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/checkin/checkin-page.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-e630a4ef94a0d306", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/reports/report-visualizer.js:55"}, "properties": {"repobilityId": "32260b47377a7e61", "scanner": "scanner-primary", "fingerprint": "e630a4ef94a0d306", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/reports/report-visualizer.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-84cede5f2f36c2fc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/favorites/favorites-page.js:69"}, "properties": {"repobilityId": "27f568bf6f8a7c1e", "scanner": "scanner-primary", "fingerprint": "84cede5f2f36c2fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/favorites/favorites-page.js"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-ab7a7e6286b2d998", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/price-comparison-page.js:32"}, "properties": {"repobilityId": "b06cc0fa68e6dc47", "scanner": "scanner-primary", "fingerprint": "ab7a7e6286b2d998", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/pricing/price-comparison-page.js"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-aadb7c4848c8a54b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/features/pricing/integrated-price-page.js:45"}, "properties": {"repobilityId": "aeef23b6f523ddee", "scanner": "scanner-primary", "fingerprint": "aadb7c4848c8a54b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/pricing/integrated-price-page.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-179e1a7d0cc043c7", "level": "error", "message": {"text": "Possible secret in e2e/auth.setup.ts"}, "properties": {"repobilityId": "d007dd209ca40971", "scanner": "scanner-primary", "fingerprint": "179e1a7d0cc043c7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/auth.setup.ts"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784947de8ac6c5d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784947de8ac6c5d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1ad076502958ba2b", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "875a3fbbaf84852a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "784947de8ac6c5d3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6ea783e0ab27dbf3", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d8d277ebd9de53e", "level": "note", "message": {"text": "Very large file: frontend/src/features/supplements/list-page.js (2073 lines)"}, "properties": {"repobilityId": "9bbcbad6a996b648", "scanner": "scanner-primary", "fingerprint": "3d8d277ebd9de53e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-96875e47051eba08", "level": "note", "message": {"text": "Very large file: frontend/src/features/history/history-page.js (1207 lines)"}, "properties": {"repobilityId": "9dfb349a782aedf0", "scanner": "scanner-primary", "fingerprint": "96875e47051eba08", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "7d2e76ad6b8243bb", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-d7101ca1926e3342", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "properties": {"repobilityId": "bbcd0a89809ced91", "scanner": "scanner-primary", "fingerprint": "d7101ca1926e3342", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f1096e38382e5db2", "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": "fdebab4e4655aa51", "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": "d1b95656a4bec057", "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": "6155e9e28f204b52", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "dc1be5963538f58a", "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": "1d23bc2e3e1ae52a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-899007e905634086", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/service-worker.js:171"}, "properties": {"repobilityId": "9dbde428d76db7b2", "scanner": "scanner-primary", "fingerprint": "899007e905634086", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5fe8b199f5b0499", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/state/state-manager.js:1"}, "properties": {"repobilityId": "fb28d4eedff8bb15", "scanner": "scanner-primary", "fingerprint": "e5fe8b199f5b0499", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53c66bae456df3e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/analytics/metrics-aggregator.js:1"}, "properties": {"repobilityId": "3376e969d491a947", "scanner": "scanner-primary", "fingerprint": "53c66bae456df3e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca69b0ee961f4218", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/pwa-offline.js:218"}, "properties": {"repobilityId": "656d141a63fb674f", "scanner": "scanner-primary", "fingerprint": "ca69b0ee961f4218", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39d3e5ce83548af3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/platform/firecrawl-scraper.js:8"}, "properties": {"repobilityId": "3a98da820b0d1a5a", "scanner": "scanner-primary", "fingerprint": "39d3e5ce83548af3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab53a3fedb22d85a", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/platform/schema-manager.js:1"}, "properties": {"repobilityId": "783a8f807d26c510", "scanner": "scanner-primary", "fingerprint": "ab53a3fedb22d85a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7346c4e703c35641", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/platform/storage-manager.js:1"}, "properties": {"repobilityId": "4be52e06b76c70d1", "scanner": "scanner-primary", "fingerprint": "7346c4e703c35641", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a3b8a1d234037fd", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/platform/notification-manager.js:159"}, "properties": {"repobilityId": "938263541567b4b8", "scanner": "scanner-primary", "fingerprint": "6a3b8a1d234037fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33563b4093e79a33", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/platform/end-to-end-integration.test.js:58"}, "properties": {"repobilityId": "df638a9a4f935656", "scanner": "scanner-primary", "fingerprint": "33563b4093e79a33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0787264567e125c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/platform/meta-manager.js:1"}, "properties": {"repobilityId": "5984605bbc20f13a", "scanner": "scanner-primary", "fingerprint": "0787264567e125c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a2eff9d98b5148c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/core/event-bus.js:1"}, "properties": {"repobilityId": "0b9426b48dca066d", "scanner": "scanner-primary", "fingerprint": "7a2eff9d98b5148c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3864ae66a4e02eb8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/core/nav.js:1"}, "properties": {"repobilityId": "5a9d1d9eee6f0b8c", "scanner": "scanner-primary", "fingerprint": "3864ae66a4e02eb8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc707a923aa238df", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/core/virtual-scroller.js:1"}, "properties": {"repobilityId": "2ef41e80570719ac", "scanner": "scanner-primary", "fingerprint": "fc707a923aa238df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7341c27b75f2369f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/core/app.js:224"}, "properties": {"repobilityId": "8e65e0fc57e15ce3", "scanner": "scanner-primary", "fingerprint": "7341c27b75f2369f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eef47f57e5c8d601", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/notifications/notification-preferences.js:200"}, "properties": {"repobilityId": "e9b2c1504ee7b264", "scanner": "scanner-primary", "fingerprint": "eef47f57e5c8d601", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-344b180c81a8d4e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/auth/auth-guard.js:7"}, "properties": {"repobilityId": "7c09562623d089c4", "scanner": "scanner-primary", "fingerprint": "344b180c81a8d4e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0429a8cbd49b295", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/auth/auth-error-recovery.e2e.test.js:266"}, "properties": {"repobilityId": "bd5cba9796df96fd", "scanner": "scanner-primary", "fingerprint": "d0429a8cbd49b295", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55d8a1fa286c0aa6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/supplements/list-page.js:71"}, "properties": {"repobilityId": "69d3c1a5b5718634", "scanner": "scanner-primary", "fingerprint": "55d8a1fa286c0aa6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75e755cba9235e31", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/calculator/dosage-calculator.js:1"}, "properties": {"repobilityId": "aeaac6daf8167fea", "scanner": "scanner-primary", "fingerprint": "75e755cba9235e31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-048cd2cd1efcd680", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/profile/photo-upload.js:354"}, "properties": {"repobilityId": "6bd3130b0fc3b5fd", "scanner": "scanner-primary", "fingerprint": "048cd2cd1efcd680", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d6cc0e36d13d8f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/index.ts:37"}, "properties": {"repobilityId": "7525819b9c80132d", "scanner": "scanner-primary", "fingerprint": "5d6cc0e36d13d8f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7aa9d8b4ee548bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-firecrawl.js:43"}, "properties": {"repobilityId": "693c8cf86848e1b3", "scanner": "scanner-primary", "fingerprint": "a7aa9d8b4ee548bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98b6460d8b7eb822", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-and-validate.js:53"}, "properties": {"repobilityId": "5f8b0c6c372aca8a", "scanner": "scanner-primary", "fingerprint": "98b6460d8b7eb822", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc91c8f5eaee1c3c", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/shared/examples/query-cache-integration.example.ts:385"}, "properties": {"repobilityId": "c4e5bca41164d15a", "scanner": "scanner-primary", "fingerprint": "fc91c8f5eaee1c3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcdf48b26282f65e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/shared/services/circuit-breaker.examples.ts:29"}, "properties": {"repobilityId": "68576439575636a7", "scanner": "scanner-primary", "fingerprint": "dcdf48b26282f65e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9448772e7f66e865", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/shared/infrastructure/redis/redis.client.ts:3"}, "properties": {"repobilityId": "d7b81802a39419e1", "scanner": "scanner-primary", "fingerprint": "9448772e7f66e865", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdf1175cff3c659e", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/modules/supplements/presentation/express/supplement.controller.ts:93"}, "properties": {"repobilityId": "f9e9da13070e0abd", "scanner": "scanner-primary", "fingerprint": "fdf1175cff3c659e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a58869d7fe1a8653", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/modules/profile/infrastructure/mongoose/mongoose-profile.repository.ts:34"}, "properties": {"repobilityId": "890d93677c3b4868", "scanner": "scanner-primary", "fingerprint": "a58869d7fe1a8653", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c32dcb97ab599617", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/routes/profile.js:356"}, "properties": {"repobilityId": "6fa381792c661ef8", "scanner": "scanner-primary", "fingerprint": "c32dcb97ab599617", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c41bb1a1f430bd6", "level": "note", "message": {"text": "39 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "4a6a9acd19ef8277", "scanner": "scanner-primary", "fingerprint": "5c41bb1a1f430bd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-a22248debd0f6fe3", "level": "error", "message": {"text": "Dangling fetch: GET /api/notifications/pending?userId=${userId} (frontend/public/sw.js:160)"}, "properties": {"repobilityId": "72947d3518f3766e", "scanner": "scanner-primary", "fingerprint": "a22248debd0f6fe3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3d74c766d9d57494", "level": "error", "message": {"text": "Dangling fetch: POST /api/notifications/track (frontend/public/sw.js:187)"}, "properties": {"repobilityId": "ae0c04944be2ddda", "scanner": "scanner-primary", "fingerprint": "3d74c766d9d57494", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7dacb68e5c850dbb", "level": "error", "message": {"text": "Dangling fetch: POST /api/checkin (frontend/src/platform/pwa-offline.js:218)"}, "properties": {"repobilityId": "62168308986c075a", "scanner": "scanner-primary", "fingerprint": "7dacb68e5c850dbb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5abac4e6473bc601", "level": "error", "message": {"text": "Dangling fetch: POST /api/supplements (frontend/src/platform/pwa-offline.js:232)"}, "properties": {"repobilityId": "71bd4b5b70a9bbbf", "scanner": "scanner-primary", "fingerprint": "5abac4e6473bc601", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ed850efa450f902", "level": "error", "message": {"text": "Dangling fetch: PUT /api/profile/me (frontend/src/platform/pwa-offline.js:246)"}, "properties": {"repobilityId": "d93456d8c24dceff", "scanner": "scanner-primary", "fingerprint": "0ed850efa450f902", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f558edb6533f7151", "level": "error", "message": {"text": "Dangling fetch: GET /api/supplements (frontend/src/platform/end-to-end-integration.test.js:58)"}, "properties": {"repobilityId": "7c7accb8e1303ad0", "scanner": "scanner-primary", "fingerprint": "f558edb6533f7151", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-214e92f2992d5513", "level": "error", "message": {"text": "Dangling fetch: POST /api/stack (frontend/src/platform/end-to-end-integration.test.js:70)"}, "properties": {"repobilityId": "97b34fcf9048a636", "scanner": "scanner-primary", "fingerprint": "214e92f2992d5513", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16f2e0006dee1d76", "level": "error", "message": {"text": "Dangling fetch: POST /api/subscriptions/checkout (frontend/src/platform/end-to-end-integration.test.js:127)"}, "properties": {"repobilityId": "1b8e7982bcf6944b", "scanner": "scanner-primary", "fingerprint": "16f2e0006dee1d76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f89004c00e92407b", "level": "error", "message": {"text": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:142)"}, "properties": {"repobilityId": "7ff6a25a683ad785", "scanner": "scanner-primary", "fingerprint": "f89004c00e92407b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-919e49046ef3ab08", "level": "error", "message": {"text": "Dangling fetch: POST /api/payments (frontend/src/platform/end-to-end-integration.test.js:160)"}, "properties": {"repobilityId": "790dd1472dfbfcb7", "scanner": "scanner-primary", "fingerprint": "919e49046ef3ab08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-705945d17273a8e8", "level": "error", "message": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:199)"}, "properties": {"repobilityId": "f191ebeef6865e4c", "scanner": "scanner-primary", "fingerprint": "705945d17273a8e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c434ecc0f3d5655", "level": "error", "message": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:202)"}, "properties": {"repobilityId": "17b791a4fdb9ce0c", "scanner": "scanner-primary", "fingerprint": "5c434ecc0f3d5655", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ea751e79887d2f9", "level": "error", "message": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:216)"}, "properties": {"repobilityId": "132cdfc8680e7fcf", "scanner": "scanner-primary", "fingerprint": "2ea751e79887d2f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d95e3e0cb17df9d2", "level": "error", "message": {"text": "Dangling fetch: GET /api/data (frontend/src/platform/end-to-end-integration.test.js:221)"}, "properties": {"repobilityId": "2c7cda06aa9c2efe", "scanner": "scanner-primary", "fingerprint": "d95e3e0cb17df9d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-badeb69917835fe9", "level": "error", "message": {"text": "Dangling fetch: GET /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:37)"}, "properties": {"repobilityId": "797c556622055ffb", "scanner": "scanner-primary", "fingerprint": "badeb69917835fe9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f242b63b5df75edf", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:200)"}, "properties": {"repobilityId": "ebfd68fe05d74652", "scanner": "scanner-primary", "fingerprint": "f242b63b5df75edf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4e76329cbd7cb45", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notifications/preferences (frontend/src/features/notifications/notification-preferences.js:232)"}, "properties": {"repobilityId": "ae85730c85558e42", "scanner": "scanner-primary", "fingerprint": "f4e76329cbd7cb45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7c9465a0eb68c99f", "level": "error", "message": {"text": "Dangling fetch: POST /api/notifications/schedule (frontend/src/features/notifications/notification-preferences.js:252)"}, "properties": {"repobilityId": "cbe777b7bb79850b", "scanner": "scanner-primary", "fingerprint": "7c9465a0eb68c99f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d941abef7fa4096", "level": "error", "message": {"text": "Dangling fetch: GET /api/notifications/analytics (frontend/src/features/notifications/notification-preferences.js:277)"}, "properties": {"repobilityId": "d3724c3fba1b42e2", "scanner": "scanner-primary", "fingerprint": "4d941abef7fa4096", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b9336747c70e0ec", "level": "error", "message": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/stack/my-stack-page-utils.js:19)"}, "properties": {"repobilityId": "6fe80f267e946df1", "scanner": "scanner-primary", "fingerprint": "1b9336747c70e0ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9958d3aacade6267", "level": "error", "message": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page-monolith-backup.js:64)"}, "properties": {"repobilityId": "e832a88e4b20c849", "scanner": "scanner-primary", "fingerprint": "9958d3aacade6267", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3043eab833ff0339", "level": "error", "message": {"text": "Dangling fetch: GET /data/supplements-db.json (frontend/src/features/supplements/list-page.js:71)"}, "properties": {"repobilityId": "534729cd2f9335a2", "scanner": "scanner-primary", "fingerprint": "3043eab833ff0339", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3bc177418e696865", "level": "error", "message": {"text": "Dangling fetch: GET /api/supplements/prices?ids=${encodeURIComponent(supplementIds)} (frontend/src/features/supplements/list-page.js:103)"}, "properties": {"repobilityId": "5dda8adc051d6813", "scanner": "scanner-primary", "fingerprint": "3bc177418e696865", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c9ca51315e327cb5", "level": "error", "message": {"text": "Dangling fetch: GET /data/prices.json (frontend/src/features/supplements/list-page.js:143)"}, "properties": {"repobilityId": "ee721ffce8b5b675", "scanner": "scanner-primary", "fingerprint": "c9ca51315e327cb5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8fec6e0dab9f004", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/dashboard (frontend/src/features/reports/report-visualizer.js:32)"}, "properties": {"repobilityId": "ef5f535a8b0f598e", "scanner": "scanner-primary", "fingerprint": "f8fec6e0dab9f004", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf1b7ea3868aed4a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (server/src/shared/services/circuit-breaker.examples.ts:29)"}, "properties": {"repobilityId": "b1b5718ed02c863f", "scanner": "scanner-primary", "fingerprint": "bf1b7ea3868aed4a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbd8cce068578c3f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.payment-gateway.com/process (server/src/shared/services/circuit-breaker.examples.ts:116)"}, "properties": {"repobilityId": "da568a2d8df0c9d9", "scanner": "scanner-primary", "fingerprint": "dbd8cce068578c3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b0ffb6584f642424", "level": "error", "message": {"text": "Dangling fetch: GET https://unreliable-api.com/data (server/src/shared/services/circuit-breaker.examples.ts:229)"}, "properties": {"repobilityId": "1187bb07f2d7bc4a", "scanner": "scanner-primary", "fingerprint": "b0ffb6584f642424", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "04f6005b7caf4f79", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52681d778ae5876a", "level": "note", "message": {"text": "Unused endpoint: POST /unsubscribe"}, "properties": {"repobilityId": "e053147b1df32819", "scanner": "scanner-primary", "fingerprint": "52681d778ae5876a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7939d8970874fd5", "level": "note", "message": {"text": "Unused endpoint: POST /resubscribe"}, "properties": {"repobilityId": "9f88b38c2e51890d", "scanner": "scanner-primary", "fingerprint": "c7939d8970874fd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "7de92b7cb52f8cbf", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8764484f2d99e7b", "level": "note", "message": {"text": "Unused endpoint: GET /preferences"}, "properties": {"repobilityId": "67a2589f7de437cb", "scanner": "scanner-primary", "fingerprint": "b8764484f2d99e7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b6f3e56a23ece9a", "level": "note", "message": {"text": "Unused endpoint: PUT /preferences"}, "properties": {"repobilityId": "1a322f434e869e86", "scanner": "scanner-primary", "fingerprint": "0b6f3e56a23ece9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a61d8365b9281c84", "level": "note", "message": {"text": "Unused endpoint: POST /schedule"}, "properties": {"repobilityId": "9ea82538f5d1b79e", "scanner": "scanner-primary", "fingerprint": "a61d8365b9281c84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f5d79195606d3fb", "level": "note", "message": {"text": "Unused endpoint: POST /track"}, "properties": {"repobilityId": "69e71a7101ef1c65", "scanner": "scanner-primary", "fingerprint": "4f5d79195606d3fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9de4cecd0e235584", "level": "note", "message": {"text": "Unused endpoint: GET /pending"}, "properties": {"repobilityId": "591d1f32c2b7305c", "scanner": "scanner-primary", "fingerprint": "9de4cecd0e235584", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4629fc2f2a182ac9", "level": "note", "message": {"text": "Unused endpoint: GET /analytics"}, "properties": {"repobilityId": "c3796883c8ba5dfc", "scanner": "scanner-primary", "fingerprint": "4629fc2f2a182ac9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8445b057f72d6ece", "level": "note", "message": {"text": "Unused endpoint: GET /heatmap"}, "properties": {"repobilityId": "8fb6e5070fba8e9a", "scanner": "scanner-primary", "fingerprint": "8445b057f72d6ece", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dad90d47f699ffbc", "level": "note", "message": {"text": "Unused endpoint: GET /trend"}, "properties": {"repobilityId": "b2cdb3b7b9be344b", "scanner": "scanner-primary", "fingerprint": "dad90d47f699ffbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47571fd84219ca1d", "level": "note", "message": {"text": "Unused endpoint: GET /streak"}, "properties": {"repobilityId": "3f53b0b1b30e4f00", "scanner": "scanner-primary", "fingerprint": "47571fd84219ca1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3792b8bde6ca387b", "level": "note", "message": {"text": "Unused endpoint: GET /achievements"}, "properties": {"repobilityId": "ada72c9ad1b378c3", "scanner": "scanner-primary", "fingerprint": "3792b8bde6ca387b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e82280e71bd6022c", "level": "note", "message": {"text": "Unused endpoint: GET /supplements/:supplementId"}, "properties": {"repobilityId": "2f5a510371a49c1d", "scanner": "scanner-primary", "fingerprint": "e82280e71bd6022c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ce4bd8d2c1abf63", "level": "note", "message": {"text": "Unused endpoint: GET /monthly"}, "properties": {"repobilityId": "3118f42c569a765e", "scanner": "scanner-primary", "fingerprint": "5ce4bd8d2c1abf63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "7c7e07ec4ed33478", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "ee61c8852436a345", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "3497c63d8b121710", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd0d83d5e9fd3333", "level": "note", "message": {"text": "Unused endpoint: POST /photo"}, "properties": {"repobilityId": "441d3009d857db19", "scanner": "scanner-primary", "fingerprint": "cd0d83d5e9fd3333", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f39b353617e66db", "level": "note", "message": {"text": "Unused endpoint: DELETE /photo"}, "properties": {"repobilityId": "ed0cc9e1b470e9fd", "scanner": "scanner-primary", "fingerprint": "4f39b353617e66db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9f356251d4143c5", "level": "note", "message": {"text": "Unused endpoint: GET /:userId/photo"}, "properties": {"repobilityId": "9d12f21b2b0d3e29", "scanner": "scanner-primary", "fingerprint": "e9f356251d4143c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-203ec659ed8ada77", "level": "note", "message": {"text": "Unused endpoint: USE /api/webhooks"}, "properties": {"repobilityId": "5c333f8e77041f09", "scanner": "scanner-primary", "fingerprint": "203ec659ed8ada77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "4c21c6bc22d52f1c", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2eeaf8c5695bbc33", "level": "note", "message": {"text": "Unused endpoint: USE /api/profile"}, "properties": {"repobilityId": "c80f02ba677eb770", "scanner": "scanner-primary", "fingerprint": "2eeaf8c5695bbc33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ca4664c9cda1cd6", "level": "note", "message": {"text": "Unused endpoint: USE /api/settings"}, "properties": {"repobilityId": "e4ae9d55972aa457", "scanner": "scanner-primary", "fingerprint": "8ca4664c9cda1cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac2e8a1655395ddd", "level": "note", "message": {"text": "Unused endpoint: USE /api/audit"}, "properties": {"repobilityId": "d7eb5a57bc841825", "scanner": "scanner-primary", "fingerprint": "ac2e8a1655395ddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dea02ef19cb2e5d2", "level": "note", "message": {"text": "Unused endpoint: USE /api/stack"}, "properties": {"repobilityId": "7e5176bbd9ff8def", "scanner": "scanner-primary", "fingerprint": "dea02ef19cb2e5d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d8f9140c98c351f", "level": "note", "message": {"text": "Unused endpoint: USE /api/favorites"}, "properties": {"repobilityId": "f3f489eac4611147", "scanner": "scanner-primary", "fingerprint": "0d8f9140c98c351f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05dab71137f3b04c", "level": "note", "message": {"text": "Unused endpoint: USE /api/checkin"}, "properties": {"repobilityId": "08a6a316e19d5761", "scanner": "scanner-primary", "fingerprint": "05dab71137f3b04c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "6f72bbf0172cb9fd", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a06e6d401449b82", "level": "note", "message": {"text": "Unused endpoint: USE /api/reports"}, "properties": {"repobilityId": "48668c93441251e4", "scanner": "scanner-primary", "fingerprint": "2a06e6d401449b82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c65474321f2bad9", "level": "note", "message": {"text": "Unused endpoint: USE /api/supplements"}, "properties": {"repobilityId": "3579cce875f6cac5", "scanner": "scanner-primary", "fingerprint": "2c65474321f2bad9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8242ba07247d2f8", "level": "note", "message": {"text": "Unused endpoint: USE /api/payments"}, "properties": {"repobilityId": "52a4bf088cb51642", "scanner": "scanner-primary", "fingerprint": "f8242ba07247d2f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e8a172453f79b56", "level": "note", "message": {"text": "Unused endpoint: USE /api/subscriptions"}, "properties": {"repobilityId": "33b04cb2b7168dde", "scanner": "scanner-primary", "fingerprint": "8e8a172453f79b56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "e6043ca70dab8c1f", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6d412ba6647f6cc", "level": "note", "message": {"text": "Unused endpoint: GET /live"}, "properties": {"repobilityId": "788825981a004c7f", "scanner": "scanner-primary", "fingerprint": "d6d412ba6647f6cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c236625afb6a8cb", "level": "note", "message": {"text": "Unused endpoint: GET /ready"}, "properties": {"repobilityId": "527240241f5b2336", "scanner": "scanner-primary", "fingerprint": "8c236625afb6a8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0633bf0c760ca788", "level": "note", "message": {"text": "Unused endpoint: GET /detailed"}, "properties": {"repobilityId": "2051d027510728ea", "scanner": "scanner-primary", "fingerprint": "0633bf0c760ca788", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ecd69835fb7d5cd", "level": "note", "message": {"text": "Unused endpoint: GET /:alertId"}, "properties": {"repobilityId": "9c4fe8339a7e94ec", "scanner": "scanner-primary", "fingerprint": "6ecd69835fb7d5cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be02d2b26b01bea8", "level": "note", "message": {"text": "Unused endpoint: PATCH /:alertId"}, "properties": {"repobilityId": "5a84475ffda0f660", "scanner": "scanner-primary", "fingerprint": "be02d2b26b01bea8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d05aff2b1bf7f93e", "level": "note", "message": {"text": "Unused endpoint: DELETE /:alertId"}, "properties": {"repobilityId": "62399bf78d0fd274", "scanner": "scanner-primary", "fingerprint": "d05aff2b1bf7f93e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3cb1106cb968b446", "level": "note", "message": {"text": "Unused endpoint: GET /history/:productId"}, "properties": {"repobilityId": "2d7a54b528bc70f7", "scanner": "scanner-primary", "fingerprint": "3cb1106cb968b446", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-984cc260847a0c3b", "level": "note", "message": {"text": "Unused endpoint: POST /device-tokens"}, "properties": {"repobilityId": "40542ba4e84866c2", "scanner": "scanner-primary", "fingerprint": "984cc260847a0c3b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d39caadc9d4a859", "level": "note", "message": {"text": "Unused endpoint: DELETE /device-tokens/:tokenId"}, "properties": {"repobilityId": "c40afa3d69da6a55", "scanner": "scanner-primary", "fingerprint": "8d39caadc9d4a859", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b127d7ad4b5d81c6", "level": "note", "message": {"text": "Unused endpoint: POST /out"}, "properties": {"repobilityId": "81797f8fa8abcd1a", "scanner": "scanner-primary", "fingerprint": "b127d7ad4b5d81c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93f4ec62bae553ff", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/cache/stats"}, "properties": {"repobilityId": "535614818c81e6d0", "scanner": "scanner-primary", "fingerprint": "93f4ec62bae553ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9dd3a52938f5501c", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/cache/flush"}, "properties": {"repobilityId": "506ff4068ae54343", "scanner": "scanner-primary", "fingerprint": "9dd3a52938f5501c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b243e567063b34d0", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/cache/invalidate"}, "properties": {"repobilityId": "7a43ad1df284dff9", "scanner": "scanner-primary", "fingerprint": "b243e567063b34d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9a31d970b6073f7", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/cache/invalidate/products"}, "properties": {"repobilityId": "b38973746bf7dd34", "scanner": "scanner-primary", "fingerprint": "b9a31d970b6073f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}