{"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-c1a6621d0c2dc81a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/MonitorCard.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/MonitorCard.tsx:48"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d53227d0a5deb753", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/RegionsCard.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/RegionsCard.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12877f9373894184", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CertTransparencyCard.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CertTransparencyCard.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10a97f3de0bcd1b8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/NotificationBell.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/NotificationBell.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-408d145cfed6d7a2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/Sidebar.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/Sidebar.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14f2753ce10d1ce9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/HeadersCard.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/HeadersCard.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6881772f4b266167", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/landing/previews.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/landing/previews.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e57de150a7aea3bb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-page-public.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-page-public.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f36d4c1c8a7b2db", "name": "Icon-only button without accessible name \u2014 apps/frontend/src/routes/monitors.tsx:294", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/frontend/src/routes/monitors.tsx:294"}, "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-1b97f44c0dbfa89f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitors.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitors.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-103cfcf04afc36cf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitor-detail.tsx:351", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitor-detail.tsx:351"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee413b4f46c9e8a8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/dashboard.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/dashboard.tsx:56"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f477f770e1748725", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-pages.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-pages.tsx:159"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33e335f3ab8c8cd8", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.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-26f8dcf4c86d3428", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/worker.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/worker.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-362bf3b63675916a", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/health-check.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/health-check.ts:74"}, "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-52dcdf4f0c30495c", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/demo-app.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/demo-app.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5eee6ef81091e161", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/agent-runner.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/agent-runner.ts:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-96f00acd94727d60", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/mock-webhook.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/mock-webhook.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-fb655ff8847fb30e", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ct.worker.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ct.worker.ts:66"}, "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-e13d510fae8241ba", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/headers.worker.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/headers.worker.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dd16041c0567d05", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/dns.worker.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/dns.worker.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6de3bebff288a70c", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ssl.worker.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ssl.worker.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f5bb2e14f116f71", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/uptime.worker.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/uptime.worker.ts:58"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d3d993367eec1d1d", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/synthetic.worker.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/synthetic.worker.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-192998cfc9ad0d87", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/exposure.worker.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/exposure.worker.ts:30"}, "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-0ce895fa8ede6a60", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/blocklist.worker.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/blocklist.worker.ts:46"}, "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-9bd32d82e43efe1c", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/anomaly-detection.worker.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/anomaly-detection.worker.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f56ba4315e4dcb26", "name": "Stray `console.log` in TS/JS \u2014 apps/backend/src/db/seed.ts:236", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/db/seed.ts:236"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0dd22f6064959bc9", "name": "Dockerfile runs as root: apps/frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/frontend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2fc45f4330be1076", "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-9462b6a262a13141", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx: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-a3cc189187aa9616", "name": "Dockerfile runs as root: apps/backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b93146e8746d43a", "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-32df342a586d929f", "name": "Insecure pattern 'node_child_process' in apps/backend/src/index.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/index.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-487856b6c049e097", "name": "Insecure pattern 'node_child_process' in apps/backend/src/__tests__/agents-install.test.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/__tests__/agents-install.test.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-676ad7fa834d0829", "name": "Insecure pattern 'node_child_process' in apps/backend/src/scripts/health-check.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/scripts/health-check.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9681c9c01d67d575", "name": "Insecure pattern 'node_child_process' in .claude/skills/railway-deploy/SKILL.md:80", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/railway-deploy/SKILL.md:80"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3c54e285aaaead7", "name": "Insecure pattern 'cors_wildcard' in .claude/skills/railway-deploy/SKILL.md:96", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in .claude/skills/railway-deploy/SKILL.md:96"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c357926d3839681", "name": "Possible secret in .claude/skills/express-backend/SKILL.md", "shortDescription": {"text": "Possible secret in .claude/skills/express-backend/SKILL.md"}, "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-186a27508423ad77", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "22 tests / 126 src (ratio 0.17)."}, "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-3f02143ce17b7bf9", "name": "Node manifest has dependencies but no lockfile: apps/frontend/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/frontend/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-53a7af2536f80bd8", "name": "Node manifest has dependencies but no lockfile: apps/backend/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/backend/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-526a53ac2db6e202", "name": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 39 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 55 placeholder/mock markers across 13 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24f2ea4bd14badc1", "name": "Agent instruction contains unpinned remote install: CLAUDE.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-12fd4077925c1557", "name": "Agent instruction/config may expose a secret: .claude/skills/railway-deploy/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/railway-deploy/SKILL.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f0a42d1b87069cc", "name": "Agent instruction contains unpinned remote install: .claude/skills/railway-deploy/SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/railway-deploy/SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6f0e8f425b7a536", "name": "Agent instruction/config may expose a secret: .claude/skills/express-backend/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/express-backend/SKILL.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bc8f79bd25e94f0", "name": "Agent authority lacks a verifier contract: .claude/skills/watchdog-feature/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/watchdog-feature/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a1fdd48ba3f6bb3", "name": "Agent authority lacks a verifier contract: .claude/skills/doc-check/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/doc-check/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d396487d556f7db1", "name": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2c86ec5d10d2f7b", "name": "Commented-code block (5 lines) in apps/frontend/src/components/ResponseTimeChart.tsx:78", "shortDescription": {"text": "Commented-code block (5 lines) in apps/frontend/src/components/ResponseTimeChart.tsx:78"}, "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-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `VITE_API_URL`, `WATCHDOG_AGENT_KEY`, `WATCHDOG_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eea581a5e20994dc", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a95d8c8788c159a", "name": "Frontend route `/verify-email` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbf268dc057b13ed", "name": "Frontend route `/monitors/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/monitors/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c36d0c133eae7a0", "name": "Frontend route `/agents` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/agents` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa706042f23b13e4", "name": "Frontend route `/status/:slug` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/status/:slug` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-045e64093a036be9", "name": "Dangling fetch: GET http://localhost:3001/health (apps/backend/src/scripts/health-check.ts:28)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3001/health (apps/backend/src/scripts/health-check.ts:28)"}, "fullDescription": {"text": "`apps/backend/src/scripts/health-check.ts:28` calls `GET http://localhost:3001/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/http:/localhost:3001/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e51adfb9f530c612", "name": "Dangling fetch: GET http://localhost:${port} (apps/backend/src/scripts/health-check.ts:40)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:${port} (apps/backend/src/scripts/health-check.ts:40)"}, "fullDescription": {"text": "`apps/backend/src/scripts/health-check.ts:40` calls `GET http://localhost:${port}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/http:/localhost:/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0da967e333b41375", "name": "Dangling fetch: GET http://localhost:3002/webhook/history (apps/backend/src/scripts/health-check.ts:53)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3002/webhook/history (apps/backend/src/scripts/health-check.ts:53)"}, "fullDescription": {"text": "`apps/backend/src/scripts/health-check.ts:53` calls `GET http://localhost:3002/webhook/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/http:/localhost:3002/webhook/history`\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-2f9a44da5cef1c31", "name": "Dangling fetch: GET http://localhost:4000/status (apps/backend/src/scripts/health-check.ts:64)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:4000/status (apps/backend/src/scripts/health-check.ts:64)"}, "fullDescription": {"text": "`apps/backend/src/scripts/health-check.ts:64` calls `GET http://localhost:4000/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/http:/localhost:4000/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dea78b0d71735251", "name": "Dangling fetch: GET https://crt.sh/?q=${encodeURIComponent( (apps/backend/src/lib/crtsh.ts:19)", "shortDescription": {"text": "Dangling fetch: GET https://crt.sh/?q=${encodeURIComponent( (apps/backend/src/lib/crtsh.ts:19)"}, "fullDescription": {"text": "`apps/backend/src/lib/crtsh.ts:19` calls `GET https://crt.sh/?q=${encodeURIComponent(` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/crt.sh`\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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`apps/backend/src/index.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-dc73e93b5d14f5bd", "name": "Unused endpoint: USE /api/monitors", "shortDescription": {"text": "Unused endpoint: USE /api/monitors"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/monitors` 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-9233b4b862b7b2c0", "name": "Unused endpoint: USE /api/monitors/:id", "shortDescription": {"text": "Unused endpoint: USE /api/monitors/:id"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/monitors/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ff40cb10f7c8519", "name": "Unused endpoint: USE /api/users", "shortDescription": {"text": "Unused endpoint: USE /api/users"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b2d8c6f7346cbb0", "name": "Unused endpoint: USE /api/users/me/settings", "shortDescription": {"text": "Unused endpoint: USE /api/users/me/settings"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/users/me/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-094608bf688f5d04", "name": "Unused endpoint: USE /api/agents", "shortDescription": {"text": "Unused endpoint: USE /api/agents"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/agents` 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-5ec82a0b9c52b976", "name": "Unused endpoint: USE /api/status-pages", "shortDescription": {"text": "Unused endpoint: USE /api/status-pages"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/status-pages` 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-960df6d706f011a7", "name": "Unused endpoint: USE /api/status", "shortDescription": {"text": "Unused endpoint: USE /api/status"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-543d95c67dd7656f", "name": "Unused endpoint: USE /api/monitors/:id/maintenance", "shortDescription": {"text": "Unused endpoint: USE /api/monitors/:id/maintenance"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/monitors/:id/maintenance` 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-dbdbc13210e7149b", "name": "Unused endpoint: USE /api/dashboard", "shortDescription": {"text": "Unused endpoint: USE /api/dashboard"}, "fullDescription": {"text": "`apps/backend/src/index.ts` declares `USE /api/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-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`apps/backend/src/index.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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`apps/backend/src/scripts/demo-app.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-197605c99cd9dc38", "name": "Unused endpoint: POST /break", "shortDescription": {"text": "Unused endpoint: POST /break"}, "fullDescription": {"text": "`apps/backend/src/scripts/demo-app.ts` declares `POST /break` 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-09af20d1e141da70", "name": "Unused endpoint: POST /fix", "shortDescription": {"text": "Unused endpoint: POST /fix"}, "fullDescription": {"text": "`apps/backend/src/scripts/demo-app.ts` declares `POST /fix` 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-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`apps/backend/src/scripts/mock-webhook.ts` declares `POST /webhook` 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-e44356b85c15142a", "name": "Unused endpoint: GET /webhook/history", "shortDescription": {"text": "Unused endpoint: GET /webhook/history"}, "fullDescription": {"text": "`apps/backend/src/scripts/mock-webhook.ts` declares `GET /webhook/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `GET /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `PATCH /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4df06abf30ff0452", "name": "Unused endpoint: POST /:id/agents/:agentId", "shortDescription": {"text": "Unused endpoint: POST /:id/agents/:agentId"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `POST /:id/agents/:agentId` 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-08f49b63fbc11bd4", "name": "Unused endpoint: DELETE /:id/agents/:agentId", "shortDescription": {"text": "Unused endpoint: DELETE /:id/agents/:agentId"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `DELETE /:id/agents/:agentId` 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-4d77867b4b6c7040", "name": "Unused endpoint: GET /:id/regions", "shortDescription": {"text": "Unused endpoint: GET /:id/regions"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `GET /:id/regions` 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-cfb0d0a1f210cd8f", "name": "Unused endpoint: POST /:id/snooze-content-change", "shortDescription": {"text": "Unused endpoint: POST /:id/snooze-content-change"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `POST /:id/snooze-content-change` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`apps/backend/src/routes/monitors.route.ts` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`apps/backend/src/routes/users.route.ts` declares `GET /me` 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-dd71dfa1d0356c5b", "name": "Unused endpoint: GET /:slug", "shortDescription": {"text": "Unused endpoint: GET /:slug"}, "fullDescription": {"text": "`apps/backend/src/routes/status.route.ts` declares `GET /:slug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16cf547bb33955b0", "name": "Unused endpoint: GET /checks", "shortDescription": {"text": "Unused endpoint: GET /checks"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /checks` 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": "`apps/backend/src/routes/checks.route.ts` 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-ed9730b55b9ee052", "name": "Unused endpoint: GET /incidents", "shortDescription": {"text": "Unused endpoint: GET /incidents"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /incidents` 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-6f99a3c044b4f97b", "name": "Unused endpoint: GET /ssl", "shortDescription": {"text": "Unused endpoint: GET /ssl"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /ssl` 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-1acb9568b5c30984", "name": "Unused endpoint: GET /response-times", "shortDescription": {"text": "Unused endpoint: GET /response-times"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /response-times` 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-e218fbd16e8e8c2a", "name": "Unused endpoint: GET /headers", "shortDescription": {"text": "Unused endpoint: GET /headers"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /headers` 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-78245fe58b1569f4", "name": "Unused endpoint: GET /dns", "shortDescription": {"text": "Unused endpoint: GET /dns"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /dns` 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-f7947429c871f11f", "name": "Unused endpoint: GET /exposure", "shortDescription": {"text": "Unused endpoint: GET /exposure"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /exposure` 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-98ab172ea0e7ad52", "name": "Unused endpoint: GET /blocklist", "shortDescription": {"text": "Unused endpoint: GET /blocklist"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /blocklist` 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-b4ddfbbd75dc2b1c", "name": "Unused endpoint: GET /content-change", "shortDescription": {"text": "Unused endpoint: GET /content-change"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /content-change` 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-0a6110c06cfd2789", "name": "Unused endpoint: GET /certs", "shortDescription": {"text": "Unused endpoint: GET /certs"}, "fullDescription": {"text": "`apps/backend/src/routes/checks.route.ts` declares `GET /certs` 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-1b7d67da71fdec80", "name": "Unused endpoint: GET /runner", "shortDescription": {"text": "Unused endpoint: GET /runner"}, "fullDescription": {"text": "`apps/backend/src/routes/agents.route.ts` declares `GET /runner` 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-6a30438a9a658c26", "name": "Unused endpoint: GET /install.sh", "shortDescription": {"text": "Unused endpoint: GET /install.sh"}, "fullDescription": {"text": "`apps/backend/src/routes/agents.route.ts` declares `GET /install.sh` 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-a6f48e60c30777ab", "name": "Unused endpoint: GET /config", "shortDescription": {"text": "Unused endpoint: GET /config"}, "fullDescription": {"text": "`apps/backend/src/routes/agents.route.ts` declares `GET /config` 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-4b803b1011000a22", "name": "Unused endpoint: POST /checkin", "shortDescription": {"text": "Unused endpoint: POST /checkin"}, "fullDescription": {"text": "`apps/backend/src/routes/agents.route.ts` declares `POST /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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4257ec01219aa99a", "name": "Unused endpoint: POST /forgot-password", "shortDescription": {"text": "Unused endpoint: POST /forgot-password"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `POST /forgot-password` 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-68a5d356c0cac9e3", "name": "Unused endpoint: POST /reset-password", "shortDescription": {"text": "Unused endpoint: POST /reset-password"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `POST /reset-password` 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-5b3531962b36673e", "name": "Unused endpoint: GET /verify-email", "shortDescription": {"text": "Unused endpoint: GET /verify-email"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `GET /verify-email` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0afae4bfd1ff1c08", "name": "Unused endpoint: POST /resend-verification", "shortDescription": {"text": "Unused endpoint: POST /resend-verification"}, "fullDescription": {"text": "`apps/backend/src/routes/auth.route.ts` declares `POST /resend-verification` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92b7885ed6f0a249", "name": "Unused endpoint: DELETE /:windowId", "shortDescription": {"text": "Unused endpoint: DELETE /:windowId"}, "fullDescription": {"text": "`apps/backend/src/routes/maintenance.route.ts` declares `DELETE /:windowId` 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": "`apps/backend/src/routes/settings.route.ts` 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-3462aeb0da015b4f", "name": "Unused endpoint: POST /test-webhook", "shortDescription": {"text": "Unused endpoint: POST /test-webhook"}, "fullDescription": {"text": "`apps/backend/src/routes/settings.route.ts` declares `POST /test-webhook` 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/18705"}, "properties": {"repository": "saad-r10/watchdog", "repoUrl": "https://github.com/saad-r10/watchdog", "branch": "main"}, "results": [{"ruleId": "scanner-c1a6621d0c2dc81a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/MonitorCard.tsx:48"}, "properties": {"repobilityId": "c647eb99d5515824", "scanner": "scanner-primary", "fingerprint": "c1a6621d0c2dc81a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d53227d0a5deb753", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/RegionsCard.tsx:68"}, "properties": {"repobilityId": "0c22d01e976518d1", "scanner": "scanner-primary", "fingerprint": "d53227d0a5deb753", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12877f9373894184", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/CertTransparencyCard.tsx:65"}, "properties": {"repobilityId": "4fc6583c6cbb7fb6", "scanner": "scanner-primary", "fingerprint": "12877f9373894184", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10a97f3de0bcd1b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/NotificationBell.tsx:55"}, "properties": {"repobilityId": "25d184141f9c74d3", "scanner": "scanner-primary", "fingerprint": "10a97f3de0bcd1b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-408d145cfed6d7a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/Sidebar.tsx:92"}, "properties": {"repobilityId": "ff542e005d0319f8", "scanner": "scanner-primary", "fingerprint": "408d145cfed6d7a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14f2753ce10d1ce9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/HeadersCard.tsx:136"}, "properties": {"repobilityId": "025f51e9be37e7c4", "scanner": "scanner-primary", "fingerprint": "14f2753ce10d1ce9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6881772f4b266167", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/components/landing/previews.tsx:59"}, "properties": {"repobilityId": "e7832c53b42b9d44", "scanner": "scanner-primary", "fingerprint": "6881772f4b266167", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e57de150a7aea3bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-page-public.tsx:135"}, "properties": {"repobilityId": "d650d78492a35321", "scanner": "scanner-primary", "fingerprint": "e57de150a7aea3bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f36d4c1c8a7b2db", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/frontend/src/routes/monitors.tsx:294"}, "properties": {"repobilityId": "104f31f38ddb7fb7", "scanner": "scanner-primary", "fingerprint": "4f36d4c1c8a7b2db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-1b97f44c0dbfa89f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitors.tsx:126"}, "properties": {"repobilityId": "7616e159420b53da", "scanner": "scanner-primary", "fingerprint": "1b97f44c0dbfa89f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-103cfcf04afc36cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/monitor-detail.tsx:351"}, "properties": {"repobilityId": "99e383837c1c1f28", "scanner": "scanner-primary", "fingerprint": "103cfcf04afc36cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee413b4f46c9e8a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/dashboard.tsx:56"}, "properties": {"repobilityId": "1841534cb3ea541d", "scanner": "scanner-primary", "fingerprint": "ee413b4f46c9e8a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f477f770e1748725", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/frontend/src/routes/status-pages.tsx:159"}, "properties": {"repobilityId": "b0f53ab2c46c04d7", "scanner": "scanner-primary", "fingerprint": "f477f770e1748725", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33e335f3ab8c8cd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/index.ts:49"}, "properties": {"repobilityId": "71ca2f20da7b1e52", "scanner": "scanner-primary", "fingerprint": "33e335f3ab8c8cd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26f8dcf4c86d3428", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/worker.ts:22"}, "properties": {"repobilityId": "d5bab43e6cfad892", "scanner": "scanner-primary", "fingerprint": "26f8dcf4c86d3428", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-362bf3b63675916a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/health-check.ts:74"}, "properties": {"repobilityId": "6e12d110fc21b27e", "scanner": "scanner-primary", "fingerprint": "362bf3b63675916a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52dcdf4f0c30495c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/demo-app.ts:18"}, "properties": {"repobilityId": "cca2f366bd53d8f9", "scanner": "scanner-primary", "fingerprint": "52dcdf4f0c30495c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5eee6ef81091e161", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/agent-runner.ts:85"}, "properties": {"repobilityId": "bf21a98c0501f012", "scanner": "scanner-primary", "fingerprint": "5eee6ef81091e161", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96f00acd94727d60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/scripts/mock-webhook.ts:12"}, "properties": {"repobilityId": "6e8e3ad6c16a6d6e", "scanner": "scanner-primary", "fingerprint": "96f00acd94727d60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb655ff8847fb30e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ct.worker.ts:66"}, "properties": {"repobilityId": "1ff8f210345ee9c3", "scanner": "scanner-primary", "fingerprint": "fb655ff8847fb30e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e13d510fae8241ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/headers.worker.ts:39"}, "properties": {"repobilityId": "3b8d19b37727eab7", "scanner": "scanner-primary", "fingerprint": "e13d510fae8241ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7dd16041c0567d05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/dns.worker.ts:31"}, "properties": {"repobilityId": "317ad92053cd8cf6", "scanner": "scanner-primary", "fingerprint": "7dd16041c0567d05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6de3bebff288a70c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/ssl.worker.ts:59"}, "properties": {"repobilityId": "fde14a48f592f93b", "scanner": "scanner-primary", "fingerprint": "6de3bebff288a70c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f5bb2e14f116f71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/uptime.worker.ts:58"}, "properties": {"repobilityId": "84c1d628aa7d0a12", "scanner": "scanner-primary", "fingerprint": "1f5bb2e14f116f71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3d993367eec1d1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/synthetic.worker.ts:40"}, "properties": {"repobilityId": "1a2867f28217c736", "scanner": "scanner-primary", "fingerprint": "d3d993367eec1d1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-192998cfc9ad0d87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/exposure.worker.ts:30"}, "properties": {"repobilityId": "81e71951d123595e", "scanner": "scanner-primary", "fingerprint": "192998cfc9ad0d87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ce895fa8ede6a60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/blocklist.worker.ts:46"}, "properties": {"repobilityId": "681991d4ef6d4477", "scanner": "scanner-primary", "fingerprint": "0ce895fa8ede6a60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9bd32d82e43efe1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/workers/anomaly-detection.worker.ts:10"}, "properties": {"repobilityId": "6fbf64f3e7c87cc5", "scanner": "scanner-primary", "fingerprint": "9bd32d82e43efe1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f56ba4315e4dcb26", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/backend/src/db/seed.ts:236"}, "properties": {"repobilityId": "27969ebf7dfcdabd", "scanner": "scanner-primary", "fingerprint": "f56ba4315e4dcb26", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0dd22f6064959bc9", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/frontend/Dockerfile"}, "properties": {"repobilityId": "44322e6df6742bbb", "scanner": "scanner-primary", "fingerprint": "0dd22f6064959bc9", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-2fc45f4330be1076", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "89fbc0f7fe1c8b12", "scanner": "scanner-primary", "fingerprint": "2fc45f4330be1076", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9462b6a262a13141", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "properties": {"repobilityId": "670b40716185c889", "scanner": "scanner-primary", "fingerprint": "9462b6a262a13141", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-a3cc189187aa9616", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/backend/Dockerfile"}, "properties": {"repobilityId": "57e37b5555b6c91a", "scanner": "scanner-primary", "fingerprint": "a3cc189187aa9616", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-9b93146e8746d43a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "dc7e9ed1e2093e75", "scanner": "scanner-primary", "fingerprint": "9b93146e8746d43a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b93146e8746d43a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "4a4cc61675a60270", "scanner": "scanner-primary", "fingerprint": "9b93146e8746d43a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/Dockerfile"}, "region": {"startLine": 14}}}]}, {"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-32df342a586d929f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/index.ts:2"}, "properties": {"repobilityId": "46abdc1fa0450e7c", "scanner": "scanner-primary", "fingerprint": "32df342a586d929f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/src/index.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-487856b6c049e097", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/__tests__/agents-install.test.ts:1"}, "properties": {"repobilityId": "18c8113d9252a00d", "scanner": "scanner-primary", "fingerprint": "487856b6c049e097", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/src/__tests__/agents-install.test.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-676ad7fa834d0829", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/backend/src/scripts/health-check.ts:2"}, "properties": {"repobilityId": "cabdf66abe39229f", "scanner": "scanner-primary", "fingerprint": "676ad7fa834d0829", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/src/scripts/health-check.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-9681c9c01d67d575", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/railway-deploy/SKILL.md:80"}, "properties": {"repobilityId": "4895aa4fa1bba328", "scanner": "scanner-primary", "fingerprint": "9681c9c01d67d575", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/railway-deploy/SKILL.md"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-a3c54e285aaaead7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in .claude/skills/railway-deploy/SKILL.md:96"}, "properties": {"repobilityId": "69da0023f5dcb0a4", "scanner": "scanner-primary", "fingerprint": "a3c54e285aaaead7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/railway-deploy/SKILL.md"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-6c357926d3839681", "level": "error", "message": {"text": "Possible secret in .claude/skills/express-backend/SKILL.md"}, "properties": {"repobilityId": "923b469c98ba2201", "scanner": "scanner-primary", "fingerprint": "6c357926d3839681", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/express-backend/SKILL.md"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-186a27508423ad77", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "173faf94bea2783c", "scanner": "scanner-primary", "fingerprint": "186a27508423ad77", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "be3895263fb9b087", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3f02143ce17b7bf9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/frontend/package.json"}, "properties": {"repobilityId": "8293ac8b769dc370", "scanner": "scanner-primary", "fingerprint": "3f02143ce17b7bf9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/frontend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-53a7af2536f80bd8", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/backend/package.json"}, "properties": {"repobilityId": "637f248c83215574", "scanner": "scanner-primary", "fingerprint": "53a7af2536f80bd8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-526a53ac2db6e202", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json"}, "properties": {"repobilityId": "72479dbac9b1ad66", "scanner": "scanner-primary", "fingerprint": "526a53ac2db6e202", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared-types/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9755d1cd62e106dd", "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": "9f81b6a8df8d34f0", "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": "0dccf1bc1b7b533f", "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": "cb3650852ad7f1dd", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4a9c0062b0da8a08", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "9b32647f5a5cff22", "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": "985f70a6a3739a75", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-24f2ea4bd14badc1", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "properties": {"repobilityId": "0f6049734704e537", "scanner": "scanner-primary", "fingerprint": "24f2ea4bd14badc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-12fd4077925c1557", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/railway-deploy/SKILL.md"}, "properties": {"repobilityId": "725101d861506367", "scanner": "scanner-primary", "fingerprint": "12fd4077925c1557", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/railway-deploy/SKILL.md"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-3f0a42d1b87069cc", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/railway-deploy/SKILL.md"}, "properties": {"repobilityId": "7cce5e560acbf28b", "scanner": "scanner-primary", "fingerprint": "3f0a42d1b87069cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/railway-deploy/SKILL.md"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-e6f0e8f425b7a536", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/express-backend/SKILL.md"}, "properties": {"repobilityId": "051f81915ebd898d", "scanner": "scanner-primary", "fingerprint": "e6f0e8f425b7a536", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/express-backend/SKILL.md"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-7bc8f79bd25e94f0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/watchdog-feature/SKILL.md"}, "properties": {"repobilityId": "a3c53bfa22efdd16", "scanner": "scanner-primary", "fingerprint": "7bc8f79bd25e94f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/watchdog-feature/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a1fdd48ba3f6bb3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/doc-check/SKILL.md"}, "properties": {"repobilityId": "f96a280f1a7787c5", "scanner": "scanner-primary", "fingerprint": "2a1fdd48ba3f6bb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/doc-check/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d396487d556f7db1", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md"}, "properties": {"repobilityId": "031ad1bd99d7a696", "scanner": "scanner-primary", "fingerprint": "d396487d556f7db1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/dev-setup/SKILL.md"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-f2c86ec5d10d2f7b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/frontend/src/components/ResponseTimeChart.tsx:78"}, "properties": {"repobilityId": "4268c05cc5e736b6", "scanner": "scanner-primary", "fingerprint": "f2c86ec5d10d2f7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-eea581a5e20994dc", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "4340d451c0fc4eb1", "scanner": "scanner-primary", "fingerprint": "eea581a5e20994dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5a95d8c8788c159a", "level": "warning", "message": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "439f92716057b8ed", "scanner": "scanner-primary", "fingerprint": "5a95d8c8788c159a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cbf268dc057b13ed", "level": "warning", "message": {"text": "Frontend route `/monitors/:id` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "a6c9dfc54fd73636", "scanner": "scanner-primary", "fingerprint": "cbf268dc057b13ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1c36d0c133eae7a0", "level": "warning", "message": {"text": "Frontend route `/agents` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "0261635caae6f1d2", "scanner": "scanner-primary", "fingerprint": "1c36d0c133eae7a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aa706042f23b13e4", "level": "warning", "message": {"text": "Frontend route `/status/:slug` has no Link/navigate to it \u2014 apps/frontend/src/App.tsx"}, "properties": {"repobilityId": "9340d146c5fcc701", "scanner": "scanner-primary", "fingerprint": "aa706042f23b13e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-045e64093a036be9", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3001/health (apps/backend/src/scripts/health-check.ts:28)"}, "properties": {"repobilityId": "95513e43eef54c5e", "scanner": "scanner-primary", "fingerprint": "045e64093a036be9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-e51adfb9f530c612", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:${port} (apps/backend/src/scripts/health-check.ts:40)"}, "properties": {"repobilityId": "2b9feaff8637ad3f", "scanner": "scanner-primary", "fingerprint": "e51adfb9f530c612", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-0da967e333b41375", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3002/webhook/history (apps/backend/src/scripts/health-check.ts:53)"}, "properties": {"repobilityId": "e9f29c86bd90c55d", "scanner": "scanner-primary", "fingerprint": "0da967e333b41375", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2f9a44da5cef1c31", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:4000/status (apps/backend/src/scripts/health-check.ts:64)"}, "properties": {"repobilityId": "53dc926f9d76a3db", "scanner": "scanner-primary", "fingerprint": "2f9a44da5cef1c31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-dea78b0d71735251", "level": "error", "message": {"text": "Dangling fetch: GET https://crt.sh/?q=${encodeURIComponent( (apps/backend/src/lib/crtsh.ts:19)"}, "properties": {"repobilityId": "694904424e565150", "scanner": "scanner-primary", "fingerprint": "dea78b0d71735251", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "e47dfc64fc23a947", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc73e93b5d14f5bd", "level": "note", "message": {"text": "Unused endpoint: USE /api/monitors"}, "properties": {"repobilityId": "1d37ef51770dc6b4", "scanner": "scanner-primary", "fingerprint": "dc73e93b5d14f5bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9233b4b862b7b2c0", "level": "note", "message": {"text": "Unused endpoint: USE /api/monitors/:id"}, "properties": {"repobilityId": "f5cb3dc29f7dcb20", "scanner": "scanner-primary", "fingerprint": "9233b4b862b7b2c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff40cb10f7c8519", "level": "note", "message": {"text": "Unused endpoint: USE /api/users"}, "properties": {"repobilityId": "b5e8b8be4f4b6da1", "scanner": "scanner-primary", "fingerprint": "4ff40cb10f7c8519", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b2d8c6f7346cbb0", "level": "note", "message": {"text": "Unused endpoint: USE /api/users/me/settings"}, "properties": {"repobilityId": "d405a616d61ffeef", "scanner": "scanner-primary", "fingerprint": "4b2d8c6f7346cbb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-094608bf688f5d04", "level": "note", "message": {"text": "Unused endpoint: USE /api/agents"}, "properties": {"repobilityId": "03f151b6839b767a", "scanner": "scanner-primary", "fingerprint": "094608bf688f5d04", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ec82a0b9c52b976", "level": "note", "message": {"text": "Unused endpoint: USE /api/status-pages"}, "properties": {"repobilityId": "e136fc25f43115c4", "scanner": "scanner-primary", "fingerprint": "5ec82a0b9c52b976", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-960df6d706f011a7", "level": "note", "message": {"text": "Unused endpoint: USE /api/status"}, "properties": {"repobilityId": "914ffcec7de3bbe5", "scanner": "scanner-primary", "fingerprint": "960df6d706f011a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-543d95c67dd7656f", "level": "note", "message": {"text": "Unused endpoint: USE /api/monitors/:id/maintenance"}, "properties": {"repobilityId": "168f0c29d130f902", "scanner": "scanner-primary", "fingerprint": "543d95c67dd7656f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbdbc13210e7149b", "level": "note", "message": {"text": "Unused endpoint: USE /api/dashboard"}, "properties": {"repobilityId": "6e7da9ab9f475d95", "scanner": "scanner-primary", "fingerprint": "dbdbc13210e7149b", "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": "51058b096eacbdca", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "b2712654ccd172c8", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-197605c99cd9dc38", "level": "note", "message": {"text": "Unused endpoint: POST /break"}, "properties": {"repobilityId": "d659e7d682178725", "scanner": "scanner-primary", "fingerprint": "197605c99cd9dc38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-09af20d1e141da70", "level": "note", "message": {"text": "Unused endpoint: POST /fix"}, "properties": {"repobilityId": "7be8eb9ae9f2c5c3", "scanner": "scanner-primary", "fingerprint": "09af20d1e141da70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "cd16869a16f731e8", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e44356b85c15142a", "level": "note", "message": {"text": "Unused endpoint: GET /webhook/history"}, "properties": {"repobilityId": "664f52e5c3cd0cdd", "scanner": "scanner-primary", "fingerprint": "e44356b85c15142a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "fdceac78d20f4888", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "89608298e9ad880c", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "ef5eb00ce58d4c87", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4df06abf30ff0452", "level": "note", "message": {"text": "Unused endpoint: POST /:id/agents/:agentId"}, "properties": {"repobilityId": "6aafb182546bf3f6", "scanner": "scanner-primary", "fingerprint": "4df06abf30ff0452", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08f49b63fbc11bd4", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id/agents/:agentId"}, "properties": {"repobilityId": "6e557751829559d4", "scanner": "scanner-primary", "fingerprint": "08f49b63fbc11bd4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d77867b4b6c7040", "level": "note", "message": {"text": "Unused endpoint: GET /:id/regions"}, "properties": {"repobilityId": "ffb821dc0cef36a2", "scanner": "scanner-primary", "fingerprint": "4d77867b4b6c7040", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfb0d0a1f210cd8f", "level": "note", "message": {"text": "Unused endpoint: POST /:id/snooze-content-change"}, "properties": {"repobilityId": "9a34db7c39e4028d", "scanner": "scanner-primary", "fingerprint": "cfb0d0a1f210cd8f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "fa6941f4dd1e1e81", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "4f94fd993efc7339", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd71dfa1d0356c5b", "level": "note", "message": {"text": "Unused endpoint: GET /:slug"}, "properties": {"repobilityId": "929ff679d840455f", "scanner": "scanner-primary", "fingerprint": "dd71dfa1d0356c5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16cf547bb33955b0", "level": "note", "message": {"text": "Unused endpoint: GET /checks"}, "properties": {"repobilityId": "2c422da5c96d9018", "scanner": "scanner-primary", "fingerprint": "16cf547bb33955b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "a6ea87eb78c0696e", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed9730b55b9ee052", "level": "note", "message": {"text": "Unused endpoint: GET /incidents"}, "properties": {"repobilityId": "d269d3f8f0d1d8db", "scanner": "scanner-primary", "fingerprint": "ed9730b55b9ee052", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f99a3c044b4f97b", "level": "note", "message": {"text": "Unused endpoint: GET /ssl"}, "properties": {"repobilityId": "edd0b3fa85265b80", "scanner": "scanner-primary", "fingerprint": "6f99a3c044b4f97b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1acb9568b5c30984", "level": "note", "message": {"text": "Unused endpoint: GET /response-times"}, "properties": {"repobilityId": "1c56da7a219107e8", "scanner": "scanner-primary", "fingerprint": "1acb9568b5c30984", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e218fbd16e8e8c2a", "level": "note", "message": {"text": "Unused endpoint: GET /headers"}, "properties": {"repobilityId": "4abcb9b0e4724ea9", "scanner": "scanner-primary", "fingerprint": "e218fbd16e8e8c2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78245fe58b1569f4", "level": "note", "message": {"text": "Unused endpoint: GET /dns"}, "properties": {"repobilityId": "4bbb237fdfc4854d", "scanner": "scanner-primary", "fingerprint": "78245fe58b1569f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7947429c871f11f", "level": "note", "message": {"text": "Unused endpoint: GET /exposure"}, "properties": {"repobilityId": "20254fb687ca2420", "scanner": "scanner-primary", "fingerprint": "f7947429c871f11f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98ab172ea0e7ad52", "level": "note", "message": {"text": "Unused endpoint: GET /blocklist"}, "properties": {"repobilityId": "5cbd6828106e3f96", "scanner": "scanner-primary", "fingerprint": "98ab172ea0e7ad52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4ddfbbd75dc2b1c", "level": "note", "message": {"text": "Unused endpoint: GET /content-change"}, "properties": {"repobilityId": "378956d8fda6424e", "scanner": "scanner-primary", "fingerprint": "b4ddfbbd75dc2b1c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a6110c06cfd2789", "level": "note", "message": {"text": "Unused endpoint: GET /certs"}, "properties": {"repobilityId": "6815210a47c6cdd2", "scanner": "scanner-primary", "fingerprint": "0a6110c06cfd2789", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b7d67da71fdec80", "level": "note", "message": {"text": "Unused endpoint: GET /runner"}, "properties": {"repobilityId": "b18bffb06863bb98", "scanner": "scanner-primary", "fingerprint": "1b7d67da71fdec80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a30438a9a658c26", "level": "note", "message": {"text": "Unused endpoint: GET /install.sh"}, "properties": {"repobilityId": "4265c088a3777414", "scanner": "scanner-primary", "fingerprint": "6a30438a9a658c26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f48e60c30777ab", "level": "note", "message": {"text": "Unused endpoint: GET /config"}, "properties": {"repobilityId": "8c7add4419ee60b5", "scanner": "scanner-primary", "fingerprint": "a6f48e60c30777ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b803b1011000a22", "level": "note", "message": {"text": "Unused endpoint: POST /checkin"}, "properties": {"repobilityId": "cc33cd8cb04200ea", "scanner": "scanner-primary", "fingerprint": "4b803b1011000a22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "35e283b695c26b52", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "ff413b2e8b637ed5", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4257ec01219aa99a", "level": "note", "message": {"text": "Unused endpoint: POST /forgot-password"}, "properties": {"repobilityId": "c6408ac46d1462c3", "scanner": "scanner-primary", "fingerprint": "4257ec01219aa99a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a5d356c0cac9e3", "level": "note", "message": {"text": "Unused endpoint: POST /reset-password"}, "properties": {"repobilityId": "380ff9cb751aa125", "scanner": "scanner-primary", "fingerprint": "68a5d356c0cac9e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b3531962b36673e", "level": "note", "message": {"text": "Unused endpoint: GET /verify-email"}, "properties": {"repobilityId": "f299d11e02e77cf7", "scanner": "scanner-primary", "fingerprint": "5b3531962b36673e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0afae4bfd1ff1c08", "level": "note", "message": {"text": "Unused endpoint: POST /resend-verification"}, "properties": {"repobilityId": "dd1430c183a21d83", "scanner": "scanner-primary", "fingerprint": "0afae4bfd1ff1c08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92b7885ed6f0a249", "level": "note", "message": {"text": "Unused endpoint: DELETE /:windowId"}, "properties": {"repobilityId": "164bca51b61104d5", "scanner": "scanner-primary", "fingerprint": "92b7885ed6f0a249", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "8347ae3d3caf4d6e", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3462aeb0da015b4f", "level": "note", "message": {"text": "Unused endpoint: POST /test-webhook"}, "properties": {"repobilityId": "dd6b0ee0fef2b2f0", "scanner": "scanner-primary", "fingerprint": "3462aeb0da015b4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}