{"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-2a318a71c757efa3", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/retention.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/retention.ts:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f673fbd9fe10cb00", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-dev.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-dev.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7a9eb88e1640f8d", "name": "Stray `console.log` in TS/JS \u2014 packages/cli/src/vite-plugin.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/vite-plugin.ts:43"}, "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-56e6d6a736ff88b1", "name": "Stray `console.log` in TS/JS \u2014 packages/cli/src/cli.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/cli.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-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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec82f9367de34433", "name": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/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-8c2e3196a4ef0cdd", "name": "Node manifest has dependencies but no lockfile: packages/cli/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/cli/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-ae014485ab255591", "name": "Node manifest has dependencies but no lockfile: packages/sdk/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/sdk/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 11 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-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, 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-7c8b918e1fee9558", "name": "20 env vars used in code but missing from .env.example", "shortDescription": {"text": "20 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ARTIFACT_RETENTION_DAYS`, `COOKIE_SECURE`, `DASHBOARD_URL`, `ERRTRACK_DSN`, `ERRTRACK_RELEASE`, `ERRTRACK_SECRET`, `MAX_QUEUE`, `NODE_ENV` + 12 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f535c308ffd7d658", "name": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 apps/dashboard/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-2bf17a30edb8f3fe", "name": "Frontend route `/projects/:projectId/alerts` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId/alerts` has no Link/navigate to it \u2014 apps/dashboard/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-ddfc7054f60d5bdd", "name": "Frontend route `/issues/:issueId` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx", "shortDescription": {"text": "Frontend route `/issues/:issueId` has no Link/navigate to it \u2014 apps/dashboard/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-27357e86410db4fe", "name": "Dangling fetch: GET /api/projects/${id} (apps/dashboard/src/api/client.ts:56)", "shortDescription": {"text": "Dangling fetch: GET /api/projects/${id} (apps/dashboard/src/api/client.ts:56)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:56` calls `GET /api/projects/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<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-0e4ebae1aebbc7c7", "name": "Dangling fetch: GET /api/issues/${issueId} (apps/dashboard/src/api/client.ts:88)", "shortDescription": {"text": "Dangling fetch: GET /api/issues/${issueId} (apps/dashboard/src/api/client.ts:88)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:88` calls `GET /api/issues/${issueId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/issues/<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-c87fd335af235d2a", "name": "Dangling fetch: GET /api/issues/${issueId}/stats?window=${window} (apps/dashboard/src/api/client.ts:90)", "shortDescription": {"text": "Dangling fetch: GET /api/issues/${issueId}/stats?window=${window} (apps/dashboard/src/api/client.ts:90)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:90` calls `GET /api/issues/${issueId}/stats?window=${window}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/issues/<p>/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e79b2bc7d8001fc6", "name": "Dangling fetch: GET /api/issues/${issueId}/tags (apps/dashboard/src/api/client.ts:92)", "shortDescription": {"text": "Dangling fetch: GET /api/issues/${issueId}/tags (apps/dashboard/src/api/client.ts:92)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:92` calls `GET /api/issues/${issueId}/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/issues/<p>/tags`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21c7d30170066307", "name": "Dangling fetch: PATCH /api/issues/${issueId} (apps/dashboard/src/api/client.ts:98)", "shortDescription": {"text": "Dangling fetch: PATCH /api/issues/${issueId} (apps/dashboard/src/api/client.ts:98)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:98` calls `PATCH /api/issues/${issueId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/issues/<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-5dd78a4e001557a0", "name": "Dangling fetch: GET /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:109)", "shortDescription": {"text": "Dangling fetch: GET /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:109)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:109` calls `GET /api/projects/${projectId}/alert-rule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/alert-rule`\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-3998c1e3f1bc6050", "name": "Dangling fetch: PUT /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:114)", "shortDescription": {"text": "Dangling fetch: PUT /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:114)"}, "fullDescription": {"text": "`apps/dashboard/src/api/client.ts:114` calls `PUT /api/projects/${projectId}/alert-rule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/alert-rule`\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}}]}}, "automationDetails": {"id": "repobility/20215"}, "properties": {"repository": "SSSunmin/errorTracking", "repoUrl": "https://github.com/SSSunmin/errorTracking", "branch": "main"}, "results": [{"ruleId": "scanner-2a318a71c757efa3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/retention.ts:6"}, "properties": {"repobilityId": "879723547398a956", "scanner": "scanner-primary", "fingerprint": "2a318a71c757efa3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f673fbd9fe10cb00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/seed-dev.ts:17"}, "properties": {"repobilityId": "e9c4ce140e6246fa", "scanner": "scanner-primary", "fingerprint": "f673fbd9fe10cb00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7a9eb88e1640f8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/vite-plugin.ts:43"}, "properties": {"repobilityId": "8e2050b7cd2a61c1", "scanner": "scanner-primary", "fingerprint": "e7a9eb88e1640f8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56e6d6a736ff88b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/cli.ts:49"}, "properties": {"repobilityId": "98b6d593cdd54b5c", "scanner": "scanner-primary", "fingerprint": "56e6d6a736ff88b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"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-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e7a3196995609997", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec82f9367de34433", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json"}, "properties": {"repobilityId": "4cf5ff15e81d6746", "scanner": "scanner-primary", "fingerprint": "ec82f9367de34433", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c2e3196a4ef0cdd", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/cli/package.json"}, "properties": {"repobilityId": "2faf23490612d7a6", "scanner": "scanner-primary", "fingerprint": "8c2e3196a4ef0cdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/cli/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ae014485ab255591", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/sdk/package.json"}, "properties": {"repobilityId": "666cbe5826d686db", "scanner": "scanner-primary", "fingerprint": "ae014485ab255591", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/sdk/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "8bcefdf9396d6887", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "93c58adae6123d8c", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "86f31e283049803a", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "3efbc74aad73958e", "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": "4956cdaff032532c", "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": "5645dc809c507fd8", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-7c8b918e1fee9558", "level": "note", "message": {"text": "20 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd1f6d44917e8105", "scanner": "scanner-primary", "fingerprint": "7c8b918e1fee9558", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-f535c308ffd7d658", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx"}, "properties": {"repobilityId": "75705db7b0360919", "scanner": "scanner-primary", "fingerprint": "f535c308ffd7d658", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2bf17a30edb8f3fe", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId/alerts` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx"}, "properties": {"repobilityId": "727e5c1e4b4e030c", "scanner": "scanner-primary", "fingerprint": "2bf17a30edb8f3fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ddfc7054f60d5bdd", "level": "warning", "message": {"text": "Frontend route `/issues/:issueId` has no Link/navigate to it \u2014 apps/dashboard/src/App.tsx"}, "properties": {"repobilityId": "3149ba5fc33e7b71", "scanner": "scanner-primary", "fingerprint": "ddfc7054f60d5bdd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27357e86410db4fe", "level": "error", "message": {"text": "Dangling fetch: GET /api/projects/${id} (apps/dashboard/src/api/client.ts:56)"}, "properties": {"repobilityId": "43c67fe2276e1102", "scanner": "scanner-primary", "fingerprint": "27357e86410db4fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0e4ebae1aebbc7c7", "level": "error", "message": {"text": "Dangling fetch: GET /api/issues/${issueId} (apps/dashboard/src/api/client.ts:88)"}, "properties": {"repobilityId": "db4b949fb2677034", "scanner": "scanner-primary", "fingerprint": "0e4ebae1aebbc7c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c87fd335af235d2a", "level": "error", "message": {"text": "Dangling fetch: GET /api/issues/${issueId}/stats?window=${window} (apps/dashboard/src/api/client.ts:90)"}, "properties": {"repobilityId": "f1db593442b34644", "scanner": "scanner-primary", "fingerprint": "c87fd335af235d2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e79b2bc7d8001fc6", "level": "error", "message": {"text": "Dangling fetch: GET /api/issues/${issueId}/tags (apps/dashboard/src/api/client.ts:92)"}, "properties": {"repobilityId": "af464f714a089314", "scanner": "scanner-primary", "fingerprint": "e79b2bc7d8001fc6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-21c7d30170066307", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/issues/${issueId} (apps/dashboard/src/api/client.ts:98)"}, "properties": {"repobilityId": "8c39c2b288735104", "scanner": "scanner-primary", "fingerprint": "21c7d30170066307", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5dd78a4e001557a0", "level": "error", "message": {"text": "Dangling fetch: GET /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:109)"}, "properties": {"repobilityId": "ce1dbdb3f3f80cdf", "scanner": "scanner-primary", "fingerprint": "5dd78a4e001557a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-3998c1e3f1bc6050", "level": "error", "message": {"text": "Dangling fetch: PUT /api/projects/${projectId}/alert-rule (apps/dashboard/src/api/client.ts:114)"}, "properties": {"repobilityId": "b4d1810b71d61b82", "scanner": "scanner-primary", "fingerprint": "3998c1e3f1bc6050", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}]}]}