{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52b12ca88c082a3d", "name": "Stray `console.log` in TS/JS \u2014 scripts/register-edc-assets.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-edc-assets.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbd85dd56d897a06", "name": "Stray `console.log` in TS/JS \u2014 scripts/fetch-pdc.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-pdc.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-34f627c734df2330", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:273"}, "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-1562c406085ef3fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/feature-panel.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/feature-panel.tsx:216"}, "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-29bebe25d6909551", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/address-search.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/address-search.tsx:193"}, "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-e8b356a9574ee7d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dataspace/consumer-view.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dataspace/consumer-view.tsx:218"}, "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-de2f26eabd7ba426", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/api-gateway/endpoint-display.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/api-gateway/endpoint-display.tsx:24"}, "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-cf20630f5045c3a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/assistant/assistant-panel.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/assistant/assistant-panel.tsx:288"}, "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-af8151b2e94ed172", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dekking/dekking-overview-client.tsx:351", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dekking/dekking-overview-client.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-169757f29ac27d32", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[city]/dekking/dekking-client.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[city]/dekking/dekking-client.tsx:315"}, "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-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-3323f37e87d0fe6e", "name": "Insecure pattern 'cors_wildcard' in src/app/api/v1/openapi.json/route.ts:8", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/openapi.json/route.ts:8"}, "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-730977c72a38c749", "name": "Insecure pattern 'cors_wildcard' in src/app/api/ndw/tiles/[...path]/route.ts:35", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/ndw/tiles/[...path]/route.ts:35"}, "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-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-dc5eb0b8752ee486", "name": "Very large file: src/lib/data-sources/national.ts (2723 lines)", "shortDescription": {"text": "Very large file: src/lib/data-sources/national.ts (2723 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-845c2f34ff3ec71d", "name": "Very large file: src/lib/data-sources/cities/rotterdam.ts (1126 lines)", "shortDescription": {"text": "Very large file: src/lib/data-sources/cities/rotterdam.ts (1126 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5626f5c43629de8", "name": "Very large file: src/lib/data-sources/cities/zwolle.ts (1489 lines)", "shortDescription": {"text": "Very large file: src/lib/data-sources/cities/zwolle.ts (1489 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 118 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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 18 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 14 placeholder/mock markers across 10 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: ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6d4526c135d1b42", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-edc-assets.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-edc-assets.ts:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99882b40e669fd23", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/map-view.tsx:246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/map-view.tsx:246"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-652d6755b002f1cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dataspace/consumer-view.tsx:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dataspace/consumer-view.tsx:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a3bdeca52ce5c66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ov-haltes/route.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ov-haltes/route.ts:57"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3122392a734c98c", "name": "Commented-code block (5 lines) in src/app/api/dso/plannen/route.ts:115", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/dso/plannen/route.ts:115"}, "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-8aa38db9d02cb56a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/proxy/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/proxy/route.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-679369ba9f8aabb1", "name": "Commented-code block (5 lines) in src/app/api/energielabels-pand/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/energielabels-pand/route.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7d0ab616026e76f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/energielabels-pand/route.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/energielabels-pand/route.ts:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7437925c1ffaf1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/assistant/chat/route.ts:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/assistant/chat/route.ts:86"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-206170b96220a087", "name": "Commented-code block (5 lines) in src/app/api/ndw/[dataset]/route.ts:184", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ndw/[dataset]/route.ts:184"}, "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-6478f435bf2d0eb8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api-gateway/page.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api-gateway/page.tsx:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39cc18acafc8d006", "name": "Commented-code block (6 lines) in src/lib/gltf-dequantize.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/gltf-dequantize.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a3c5624061477ff", "name": "Commented-code block (6 lines) in src/lib/gltf-recolor.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/gltf-recolor.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9925ceca212da0b", "name": "Commented-code block (7 lines) in src/lib/gltf-ground.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/gltf-ground.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfa1304c2b0a93be", "name": "Commented-code block (6 lines) in src/lib/glb-meshopt-offsets.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/glb-meshopt-offsets.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cf42bc36bc9c86a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pdc.ts:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pdc.ts:136"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d513587f8e0098f", "name": "Commented-code block (6 lines) in src/lib/pdok-3d-buildings.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/pdok-3d-buildings.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e537122b19c4f3a", "name": "Commented-code block (8 lines) in src/lib/ndw-xml.ts:351", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/ndw-xml.ts:351"}, "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-27b3447717525cc3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ndw-xml.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ndw-xml.ts:100"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfcc23c72e007f39", "name": "Commented-code block (5 lines) in src/lib/data-sources/fetchers.ts:255", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/data-sources/fetchers.ts:255"}, "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-f8e52403ee73e73c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/fetchers.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/fetchers.ts:12"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48841247c57ab9a0", "name": "Commented-code block (6 lines) in src/lib/data-sources/national.ts:1610", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/data-sources/national.ts:1610"}, "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-49008b95cf2e5236", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/national.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/national.ts:51"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18273"}, "properties": {"repository": "robbertj85/zwolleviewer", "repoUrl": "https://github.com/robbertj85/zwolleviewer", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-52b12ca88c082a3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-edc-assets.ts:34"}, "properties": {"repobilityId": "60dd3845286dbe0d", "scanner": "scanner-primary", "fingerprint": "52b12ca88c082a3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbd85dd56d897a06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-pdc.ts:36"}, "properties": {"repobilityId": "bc9c37660ddc0a03", "scanner": "scanner-primary", "fingerprint": "bbd85dd56d897a06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34f627c734df2330", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:273"}, "properties": {"repobilityId": "b6d9ddc60e182673", "scanner": "scanner-primary", "fingerprint": "34f627c734df2330", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1562c406085ef3fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/feature-panel.tsx:216"}, "properties": {"repobilityId": "651eacdcbea3e640", "scanner": "scanner-primary", "fingerprint": "1562c406085ef3fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29bebe25d6909551", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/address-search.tsx:193"}, "properties": {"repobilityId": "9603b2dcc286ebb8", "scanner": "scanner-primary", "fingerprint": "29bebe25d6909551", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8b356a9574ee7d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dataspace/consumer-view.tsx:218"}, "properties": {"repobilityId": "78eb4d1da82886f0", "scanner": "scanner-primary", "fingerprint": "e8b356a9574ee7d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de2f26eabd7ba426", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/api-gateway/endpoint-display.tsx:24"}, "properties": {"repobilityId": "ebe8fb4cdeccf9a4", "scanner": "scanner-primary", "fingerprint": "de2f26eabd7ba426", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf20630f5045c3a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/assistant/assistant-panel.tsx:288"}, "properties": {"repobilityId": "d81712d5a5f550ea", "scanner": "scanner-primary", "fingerprint": "cf20630f5045c3a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af8151b2e94ed172", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dekking/dekking-overview-client.tsx:351"}, "properties": {"repobilityId": "9dcfbdc34ee0a545", "scanner": "scanner-primary", "fingerprint": "af8151b2e94ed172", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-169757f29ac27d32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[city]/dekking/dekking-client.tsx:315"}, "properties": {"repobilityId": "60d44952c578a35b", "scanner": "scanner-primary", "fingerprint": "169757f29ac27d32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"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-3323f37e87d0fe6e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/openapi.json/route.ts:8"}, "properties": {"repobilityId": "0908d4c4ee02482e", "scanner": "scanner-primary", "fingerprint": "3323f37e87d0fe6e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/v1/openapi.json/route.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-730977c72a38c749", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/ndw/tiles/[...path]/route.ts:35"}, "properties": {"repobilityId": "f3b9155bc2c18897", "scanner": "scanner-primary", "fingerprint": "730977c72a38c749", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/ndw/tiles/[...path]/route.ts"}, "region": {"startLine": 35}}}]}, {"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-dc5eb0b8752ee486", "level": "note", "message": {"text": "Very large file: src/lib/data-sources/national.ts (2723 lines)"}, "properties": {"repobilityId": "1b0a94f9bdb6af1e", "scanner": "scanner-primary", "fingerprint": "dc5eb0b8752ee486", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-845c2f34ff3ec71d", "level": "note", "message": {"text": "Very large file: src/lib/data-sources/cities/rotterdam.ts (1126 lines)"}, "properties": {"repobilityId": "70cb67d0cae40cc8", "scanner": "scanner-primary", "fingerprint": "845c2f34ff3ec71d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5626f5c43629de8", "level": "note", "message": {"text": "Very large file: src/lib/data-sources/cities/zwolle.ts (1489 lines)"}, "properties": {"repobilityId": "c74813b9033f5f42", "scanner": "scanner-primary", "fingerprint": "e5626f5c43629de8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "425e0f021ac31e30", "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": "be7b9fd3a527d0e2", "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": "4fd3f86b6f846a40", "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": "e23efc334828ee7e", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "fbcae5e0ab04132c", "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": "df9fd36e57063489", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-b6d4526c135d1b42", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-edc-assets.ts:16"}, "properties": {"repobilityId": "a5cd45d506d6ad85", "scanner": "scanner-primary", "fingerprint": "b6d4526c135d1b42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-99882b40e669fd23", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/map-view.tsx:246"}, "properties": {"repobilityId": "6abbf7baf7a14aef", "scanner": "scanner-primary", "fingerprint": "99882b40e669fd23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-652d6755b002f1cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dataspace/consumer-view.tsx:99"}, "properties": {"repobilityId": "b8c5d8bf78ca1897", "scanner": "scanner-primary", "fingerprint": "652d6755b002f1cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a3bdeca52ce5c66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ov-haltes/route.ts:57"}, "properties": {"repobilityId": "678319cb5555e66c", "scanner": "scanner-primary", "fingerprint": "3a3bdeca52ce5c66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3122392a734c98c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/dso/plannen/route.ts:115"}, "properties": {"repobilityId": "777a95734870bde1", "scanner": "scanner-primary", "fingerprint": "d3122392a734c98c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aa38db9d02cb56a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/proxy/route.ts:22"}, "properties": {"repobilityId": "78add1f9217070e4", "scanner": "scanner-primary", "fingerprint": "8aa38db9d02cb56a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-679369ba9f8aabb1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/energielabels-pand/route.ts:5"}, "properties": {"repobilityId": "8d1e24742f32d2a9", "scanner": "scanner-primary", "fingerprint": "679369ba9f8aabb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7d0ab616026e76f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/energielabels-pand/route.ts:54"}, "properties": {"repobilityId": "0ba97ca832cbe589", "scanner": "scanner-primary", "fingerprint": "c7d0ab616026e76f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7437925c1ffaf1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/assistant/chat/route.ts:86"}, "properties": {"repobilityId": "70e2fe07c2e87f78", "scanner": "scanner-primary", "fingerprint": "c7437925c1ffaf1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-206170b96220a087", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ndw/[dataset]/route.ts:184"}, "properties": {"repobilityId": "52ed84defa097095", "scanner": "scanner-primary", "fingerprint": "206170b96220a087", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6478f435bf2d0eb8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api-gateway/page.tsx:36"}, "properties": {"repobilityId": "c5ceeeda10ce05dd", "scanner": "scanner-primary", "fingerprint": "6478f435bf2d0eb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39cc18acafc8d006", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/gltf-dequantize.ts:3"}, "properties": {"repobilityId": "d798f34b230a5388", "scanner": "scanner-primary", "fingerprint": "39cc18acafc8d006", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a3c5624061477ff", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/gltf-recolor.ts:3"}, "properties": {"repobilityId": "8451144bb80a8a05", "scanner": "scanner-primary", "fingerprint": "4a3c5624061477ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9925ceca212da0b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/gltf-ground.ts:3"}, "properties": {"repobilityId": "0ee7a0eb283fdcfa", "scanner": "scanner-primary", "fingerprint": "a9925ceca212da0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfa1304c2b0a93be", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/glb-meshopt-offsets.ts:3"}, "properties": {"repobilityId": "11188c3ae897c7f0", "scanner": "scanner-primary", "fingerprint": "bfa1304c2b0a93be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cf42bc36bc9c86a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/pdc.ts:136"}, "properties": {"repobilityId": "65f2288dd9d85cd2", "scanner": "scanner-primary", "fingerprint": "7cf42bc36bc9c86a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d513587f8e0098f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/pdok-3d-buildings.ts:3"}, "properties": {"repobilityId": "152ef587f078a5ed", "scanner": "scanner-primary", "fingerprint": "2d513587f8e0098f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e537122b19c4f3a", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/ndw-xml.ts:351"}, "properties": {"repobilityId": "47baa6a23ed5fe6f", "scanner": "scanner-primary", "fingerprint": "1e537122b19c4f3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27b3447717525cc3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ndw-xml.ts:100"}, "properties": {"repobilityId": "421759a8ed91ce8c", "scanner": "scanner-primary", "fingerprint": "27b3447717525cc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dfcc23c72e007f39", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/data-sources/fetchers.ts:255"}, "properties": {"repobilityId": "767793991b3b3343", "scanner": "scanner-primary", "fingerprint": "dfcc23c72e007f39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8e52403ee73e73c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/fetchers.ts:12"}, "properties": {"repobilityId": "3cf91e668fb25194", "scanner": "scanner-primary", "fingerprint": "f8e52403ee73e73c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-48841247c57ab9a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/data-sources/national.ts:1610"}, "properties": {"repobilityId": "5973dc411e60a261", "scanner": "scanner-primary", "fingerprint": "48841247c57ab9a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49008b95cf2e5236", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/data-sources/national.ts:51"}, "properties": {"repobilityId": "ceb09422fc32921f", "scanner": "scanner-primary", "fingerprint": "49008b95cf2e5236", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}