{"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-2aa2c5a41bccb93e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:58", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:58"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b545f06b872ba91", "name": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:689", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:689"}, "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-d2470ed530ec9d37", "name": "Stray `console.log` in TS/JS \u2014 app/gtm/page.tsx:302", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/gtm/page.tsx:302"}, "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-a2976e50e359bdb4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/flight-schools/components/FilterBar.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/flight-schools/components/FilterBar.tsx:115"}, "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-5290e0e88ffbcf37", "name": "Stray `console.log` in TS/JS \u2014 app/api/summercamp/route.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/summercamp/route.ts:103"}, "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-96aa8397b1102824", "name": "Stray `console.log` in TS/JS \u2014 app/api/atc/route.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/atc/route.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a599087872debc9c", "name": "Stray `console.log` in TS/JS \u2014 app/api/leads/route.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/leads/route.ts:107"}, "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-b7799710f6c49ba7", "name": "Stray `console.log` in TS/JS \u2014 app/api/students/route.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/students/route.ts:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fe520ecbf2f9e5e", "name": "Stray `console.log` in TS/JS \u2014 app/api/nz-seminar/route.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/nz-seminar/route.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcee97c758ecc674", "name": "Stray `console.log` in TS/JS \u2014 app/api/open-house/route.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/open-house/route.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2332f72954be0e52", "name": "Stray `console.log` in TS/JS \u2014 app/api/booking/route.ts:189", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/booking/route.ts:189"}, "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-2d32f2b647a8bde7", "name": "Stray `console.log` in TS/JS \u2014 app/api/parents/route.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/parents/route.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9aa598d4a94f7c4c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/payments/page.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/payments/page.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-81b9d5d746bcb45c", "name": "TODO/FIXME marker in shipping code \u2014 app/admin/payments/page.tsx:55", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/admin/payments/page.tsx:55"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0dc9547a8336efa8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/components/FlightSchoolsAdmin.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/components/FlightSchoolsAdmin.tsx:197"}, "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-7f00e1c8812af622", "name": "TODO/FIXME marker in shipping code \u2014 app/admin/events/page.tsx:62", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/admin/events/page.tsx:62"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1186604a9911c67", "name": "`truncate` class without `title=` for hover reveal \u2014 app/stitch/page.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/stitch/page.tsx:239"}, "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-4b1b3f337948941f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/pilot-training/page.tsx:736", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/pilot-training/page.tsx:736"}, "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-6f5d9d19144512ed", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/pilot-training/page.tsx:1036", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/pilot-training/page.tsx:1036"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63aee2248c702018", "name": "Stray `console.log` in TS/JS \u2014 components/BookingForm.tsx:301", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/BookingForm.tsx:301"}, "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-1605b1029fff51d4", "name": "TODO/FIXME marker in shipping code \u2014 lib/analytics.ts:10", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/analytics.ts:10"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e498738fcf553af7", "name": "Stray `console.log` in TS/JS \u2014 lib/sheets.ts:179", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/sheets.ts:179"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8a5a34ccc1a9b4c", "name": "TODO/FIXME marker in shipping code \u2014 content/shared/events.ts:32", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 content/shared/events.ts:32"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-adf10c3979107026", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:58"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3dc1effac276845b", "name": "Insecure pattern 'dangerous_innerhtml' in app/pilot-training/page.tsx:1036", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/pilot-training/page.tsx:1036"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 236 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-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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 84 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 107 placeholder/mock markers across 27 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, tests, operator-readme. 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, tests, operator-readme. 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-e4f1089cd64f803b", "name": "Commented-code block (9 lines) in middleware.ts:18", "shortDescription": {"text": "Commented-code block (9 lines) in middleware.ts:18"}, "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-2fdc57281ed578d8", "name": "Commented-code block (6 lines) in app/flight-schools/components/LeafletMap.tsx:62", "shortDescription": {"text": "Commented-code block (6 lines) in app/flight-schools/components/LeafletMap.tsx:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-508781af619ca6c9", "name": "Commented-code block (5 lines) in app/flight-schools/components/GlobeLoader.tsx:106", "shortDescription": {"text": "Commented-code block (5 lines) in app/flight-schools/components/GlobeLoader.tsx:106"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-717762e7961ef426", "name": "Commented-code block (5 lines) in app/api/leads/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/leads/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42a60ce5d38ef504", "name": "Commented-code block (5 lines) in app/api/booking/route.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/booking/route.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a2c909e9cc06f46", "name": "Commented-code block (5 lines) in app/api/pat-backup/route.ts:56", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/pat-backup/route.ts:56"}, "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-3b49b5db81bb4987", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/summercamp/page.tsx:213", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/summercamp/page.tsx:213"}, "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-00a76ec0b010e146", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/atc/page.tsx:198", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/atc/page.tsx:198"}, "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-d3d8023c042e5738", "name": "Commented-code block (7 lines) in app/thank-you/layout.tsx:5", "shortDescription": {"text": "Commented-code block (7 lines) in app/thank-you/layout.tsx: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-a6aed337bcf2f417", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/cabin-crew/page.client.tsx:245", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/cabin-crew/page.client.tsx:245"}, "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-238b009bd802b450", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-google-places-flight-schools.mjs:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-google-places-flight-schools.mjs:182"}, "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-3944331c4ffb2801", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/unsplash-fetch.mjs:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/unsplash-fetch.mjs:33"}, "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-227e47a032ee8dde", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/build-school-summaries.mjs:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/build-school-summaries.mjs:182"}, "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-a92de4ca433664b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolve-google-photos.mjs:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolve-google-photos.mjs:62"}, "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-850695e58c4f55a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/BookingForm.tsx:303", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/BookingForm.tsx:303"}, "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-85221b08694f0b98", "name": "Commented-code block (5 lines) in components/Navbar.tsx:77", "shortDescription": {"text": "Commented-code block (5 lines) in components/Navbar.tsx:77"}, "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-895fe33c85428e38", "name": "Commented-code block (11 lines) in components/WhatsAppCaptureModal.tsx:100", "shortDescription": {"text": "Commented-code block (11 lines) in components/WhatsAppCaptureModal.tsx:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1b1ec970249f880", "name": "Commented-code block (6 lines) in components/AssessmentForm.tsx:315", "shortDescription": {"text": "Commented-code block (6 lines) in components/AssessmentForm.tsx:315"}, "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-a06b408082f67363", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/AssessmentForm.tsx:326", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/AssessmentForm.tsx:326"}, "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-6c2570e316a6eac0", "name": "Commented-code block (5 lines) in lib/tracking.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tracking.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-a3a44099e413b89d", "name": "Legacy-named symbol `pat_progress_v1` in lib/pat-storage.ts:5", "shortDescription": {"text": "Legacy-named symbol `pat_progress_v1` in lib/pat-storage.ts:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee6a0a800c67eb51", "name": "Commented-code block (5 lines) in lib/sheets.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in lib/sheets.ts:79"}, "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-abe20b6305c50678", "name": "Commented-code block (14 lines) in lib/pat-questions.ts:3", "shortDescription": {"text": "Commented-code block (14 lines) in lib/pat-questions.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-6e602ea6cc968854", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:26"}, "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-d61152e5f23158cf", "name": "Commented-code block (7 lines) in lib/analytics/events.ts:101", "shortDescription": {"text": "Commented-code block (7 lines) in lib/analytics/events.ts:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24509"}, "properties": {"repository": "bconclub/windchasers", "repoUrl": "https://github.com/bconclub/windchasers", "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-2aa2c5a41bccb93e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:58"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "2aa2c5a41bccb93e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0b545f06b872ba91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:689"}, "properties": {"repobilityId": "2a6638282026d4f9", "scanner": "scanner-primary", "fingerprint": "0b545f06b872ba91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2470ed530ec9d37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/gtm/page.tsx:302"}, "properties": {"repobilityId": "12fdd2bd2c511118", "scanner": "scanner-primary", "fingerprint": "d2470ed530ec9d37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2976e50e359bdb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/flight-schools/components/FilterBar.tsx:115"}, "properties": {"repobilityId": "0f113cb489efae70", "scanner": "scanner-primary", "fingerprint": "a2976e50e359bdb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5290e0e88ffbcf37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/summercamp/route.ts:103"}, "properties": {"repobilityId": "ecb6a7f5dcc9e3d4", "scanner": "scanner-primary", "fingerprint": "5290e0e88ffbcf37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96aa8397b1102824", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/atc/route.ts:38"}, "properties": {"repobilityId": "a904f5886f420ff5", "scanner": "scanner-primary", "fingerprint": "96aa8397b1102824", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a599087872debc9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/leads/route.ts:107"}, "properties": {"repobilityId": "2c5b9f0e9e6095dd", "scanner": "scanner-primary", "fingerprint": "a599087872debc9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7799710f6c49ba7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/students/route.ts:51"}, "properties": {"repobilityId": "1990326caa8baa8e", "scanner": "scanner-primary", "fingerprint": "b7799710f6c49ba7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5fe520ecbf2f9e5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/nz-seminar/route.ts:21"}, "properties": {"repobilityId": "4591db5dea250e81", "scanner": "scanner-primary", "fingerprint": "5fe520ecbf2f9e5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bcee97c758ecc674", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/open-house/route.ts:19"}, "properties": {"repobilityId": "8386a1c2d149f3dc", "scanner": "scanner-primary", "fingerprint": "bcee97c758ecc674", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2332f72954be0e52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/booking/route.ts:189"}, "properties": {"repobilityId": "7522a21cc13a44bf", "scanner": "scanner-primary", "fingerprint": "2332f72954be0e52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d32f2b647a8bde7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/parents/route.ts:50"}, "properties": {"repobilityId": "ab6f76d46c467dfe", "scanner": "scanner-primary", "fingerprint": "2d32f2b647a8bde7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9aa598d4a94f7c4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/payments/page.tsx:136"}, "properties": {"repobilityId": "02d3fca42301e594", "scanner": "scanner-primary", "fingerprint": "9aa598d4a94f7c4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81b9d5d746bcb45c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/admin/payments/page.tsx:55"}, "properties": {"repobilityId": "e5baf36e36bb7ac0", "scanner": "scanner-primary", "fingerprint": "81b9d5d746bcb45c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0dc9547a8336efa8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/components/FlightSchoolsAdmin.tsx:197"}, "properties": {"repobilityId": "a051c30fe3a0a6de", "scanner": "scanner-primary", "fingerprint": "0dc9547a8336efa8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f00e1c8812af622", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/admin/events/page.tsx:62"}, "properties": {"repobilityId": "afd772c70369c110", "scanner": "scanner-primary", "fingerprint": "7f00e1c8812af622", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d1186604a9911c67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/stitch/page.tsx:239"}, "properties": {"repobilityId": "3eaba17086772c2e", "scanner": "scanner-primary", "fingerprint": "d1186604a9911c67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b1b3f337948941f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/pilot-training/page.tsx:736"}, "properties": {"repobilityId": "8b096b3a1395ca9e", "scanner": "scanner-primary", "fingerprint": "4b1b3f337948941f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f5d9d19144512ed", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/pilot-training/page.tsx:1036"}, "properties": {"repobilityId": "733c79a516dc9811", "scanner": "scanner-primary", "fingerprint": "6f5d9d19144512ed", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-63aee2248c702018", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/BookingForm.tsx:301"}, "properties": {"repobilityId": "62aaefc47ef37d83", "scanner": "scanner-primary", "fingerprint": "63aee2248c702018", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1605b1029fff51d4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/analytics.ts:10"}, "properties": {"repobilityId": "33b13ccfa4af495a", "scanner": "scanner-primary", "fingerprint": "1605b1029fff51d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e498738fcf553af7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/sheets.ts:179"}, "properties": {"repobilityId": "ee9e5db8bff91154", "scanner": "scanner-primary", "fingerprint": "e498738fcf553af7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8a5a34ccc1a9b4c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 content/shared/events.ts:32"}, "properties": {"repobilityId": "0383ee0438881c02", "scanner": "scanner-primary", "fingerprint": "d8a5a34ccc1a9b4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-adf10c3979107026", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:58"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "adf10c3979107026", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-3dc1effac276845b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/pilot-training/page.tsx:1036"}, "properties": {"repobilityId": "25763b7c57b78950", "scanner": "scanner-primary", "fingerprint": "3dc1effac276845b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/pilot-training/page.tsx"}, "region": {"startLine": 1036}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0bc463708914950e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 22}}}]}, {"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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5ad0463910547f69", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "a2f8f441d4877484", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "054ef7812fe1ce07", "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": "179eb154a7078bdd", "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": "95f4fcd5fb9836eb", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "81609b3f50c8f32e", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0b5fb726e48b023c", "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": "7fa89b38ceb77391", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e4f1089cd64f803b", "level": "none", "message": {"text": "Commented-code block (9 lines) in middleware.ts:18"}, "properties": {"repobilityId": "e5f40dbae5d7c0e5", "scanner": "scanner-primary", "fingerprint": "e4f1089cd64f803b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fdc57281ed578d8", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/flight-schools/components/LeafletMap.tsx:62"}, "properties": {"repobilityId": "0a975d6e92e1089f", "scanner": "scanner-primary", "fingerprint": "2fdc57281ed578d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-508781af619ca6c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/flight-schools/components/GlobeLoader.tsx:106"}, "properties": {"repobilityId": "1d914b1f660ddf18", "scanner": "scanner-primary", "fingerprint": "508781af619ca6c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-717762e7961ef426", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/leads/route.ts:9"}, "properties": {"repobilityId": "cae068f73613e8b0", "scanner": "scanner-primary", "fingerprint": "717762e7961ef426", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42a60ce5d38ef504", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/booking/route.ts:12"}, "properties": {"repobilityId": "1e72432769d50330", "scanner": "scanner-primary", "fingerprint": "42a60ce5d38ef504", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a2c909e9cc06f46", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/pat-backup/route.ts:56"}, "properties": {"repobilityId": "eeb94a58d7a2509d", "scanner": "scanner-primary", "fingerprint": "3a2c909e9cc06f46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b49b5db81bb4987", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/summercamp/page.tsx:213"}, "properties": {"repobilityId": "53ea17ce36139e5f", "scanner": "scanner-primary", "fingerprint": "3b49b5db81bb4987", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00a76ec0b010e146", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/atc/page.tsx:198"}, "properties": {"repobilityId": "25c4cbeb8789aa52", "scanner": "scanner-primary", "fingerprint": "00a76ec0b010e146", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3d8023c042e5738", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/thank-you/layout.tsx:5"}, "properties": {"repobilityId": "3feee5e5036a9f45", "scanner": "scanner-primary", "fingerprint": "d3d8023c042e5738", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6aed337bcf2f417", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/cabin-crew/page.client.tsx:245"}, "properties": {"repobilityId": "c7bc0b2506b53f71", "scanner": "scanner-primary", "fingerprint": "a6aed337bcf2f417", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-238b009bd802b450", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-google-places-flight-schools.mjs:182"}, "properties": {"repobilityId": "f0b5bf7733dd434f", "scanner": "scanner-primary", "fingerprint": "238b009bd802b450", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3944331c4ffb2801", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/unsplash-fetch.mjs:33"}, "properties": {"repobilityId": "87f536034c702d83", "scanner": "scanner-primary", "fingerprint": "3944331c4ffb2801", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-227e47a032ee8dde", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/build-school-summaries.mjs:182"}, "properties": {"repobilityId": "822fb2115f58443c", "scanner": "scanner-primary", "fingerprint": "227e47a032ee8dde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a92de4ca433664b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/resolve-google-photos.mjs:62"}, "properties": {"repobilityId": "10d5e1df6f37830e", "scanner": "scanner-primary", "fingerprint": "a92de4ca433664b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-850695e58c4f55a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/BookingForm.tsx:303"}, "properties": {"repobilityId": "89cb6ec303f9a6cc", "scanner": "scanner-primary", "fingerprint": "850695e58c4f55a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-85221b08694f0b98", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/Navbar.tsx:77"}, "properties": {"repobilityId": "e71ecacacfd11f1d", "scanner": "scanner-primary", "fingerprint": "85221b08694f0b98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-895fe33c85428e38", "level": "none", "message": {"text": "Commented-code block (11 lines) in components/WhatsAppCaptureModal.tsx:100"}, "properties": {"repobilityId": "53de619eb0fdd37b", "scanner": "scanner-primary", "fingerprint": "895fe33c85428e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1b1ec970249f880", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/AssessmentForm.tsx:315"}, "properties": {"repobilityId": "f206d9d50a18de71", "scanner": "scanner-primary", "fingerprint": "d1b1ec970249f880", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a06b408082f67363", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/AssessmentForm.tsx:326"}, "properties": {"repobilityId": "d51020def36005d0", "scanner": "scanner-primary", "fingerprint": "a06b408082f67363", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c2570e316a6eac0", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tracking.ts:3"}, "properties": {"repobilityId": "e435017968caf9fb", "scanner": "scanner-primary", "fingerprint": "6c2570e316a6eac0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3a44099e413b89d", "level": "note", "message": {"text": "Legacy-named symbol `pat_progress_v1` in lib/pat-storage.ts:5"}, "properties": {"repobilityId": "385736686a16542b", "scanner": "scanner-primary", "fingerprint": "a3a44099e413b89d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ee6a0a800c67eb51", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/sheets.ts:79"}, "properties": {"repobilityId": "6a8aebe8e84e0750", "scanner": "scanner-primary", "fingerprint": "ee6a0a800c67eb51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abe20b6305c50678", "level": "none", "message": {"text": "Commented-code block (14 lines) in lib/pat-questions.ts:3"}, "properties": {"repobilityId": "29a2eb579e4ebccc", "scanner": "scanner-primary", "fingerprint": "abe20b6305c50678", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e602ea6cc968854", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:26"}, "properties": {"repobilityId": "0fb947e34163ee12", "scanner": "scanner-primary", "fingerprint": "6e602ea6cc968854", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d61152e5f23158cf", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/analytics/events.ts:101"}, "properties": {"repobilityId": "f5c6107825bd6416", "scanner": "scanner-primary", "fingerprint": "d61152e5f23158cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}