{"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-ac02c2ea73da5e19", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-bw6-todos.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-bw6-todos.ts:75"}, "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-8b1c9b0d15fd2f39", "name": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260608.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260608.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6264cadf07145a80", "name": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260607.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260607.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc812a6c2ac43bc9", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrations/20260607_bcrypt_sessions.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrations/20260607_bcrypt_sessions.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-63995897e93d5a19", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:47"}, "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-c57d5758eb974d4a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:401", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:401"}, "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-367ceb7e3398e306", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/merch/page.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/merch/page.tsx:203"}, "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-28def1deee71e510", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performances/page.tsx:377", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performances/page.tsx:377"}, "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-f7d7062c10c3ee55", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/performance/[mId]/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/performance/[mId]/page.tsx:177"}, "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-d9859ad5b7ddfcce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/timetable/page.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/timetable/page.tsx:274"}, "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-24baa28d93916217", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/page.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/page.tsx:105"}, "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-c441d859854f969d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/page.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/page.tsx:96"}, "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-052f99bd94aa90c3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/[mId]/page.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/[mId]/page.tsx:87"}, "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-d9a25ee3e079631a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/insights/page.tsx:711", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/insights/page.tsx:711"}, "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-69a626a4cc05b8ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/expenses/page.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/expenses/page.tsx:254"}, "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-e493fe2d93ed3191", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/backstage/[token]/page.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/backstage/[token]/page.tsx:181"}, "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-71f58e31208ca392", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/page.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/page.tsx:440"}, "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-f383cc336d210123", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/lstep-update/page.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/lstep-update/page.tsx:325"}, "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-9d22621546060311", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/[token]/page.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/[token]/page.tsx:186"}, "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-84a46cb0f917a25d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/page.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/page.tsx:343"}, "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-3dda652d55f3e7b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/calendar/page.tsx:631", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/calendar/page.tsx:631"}, "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-9141793af3e9934c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/members/page.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/members/page.tsx:172"}, "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-526b45769ece18aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShopSection.tsx:1665", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShopSection.tsx:1665"}, "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-260a5776d672d0bf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ShopSection.tsx:305", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ShopSection.tsx:305"}, "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-f5f5d9c651a63596", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ScheduleSection.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ScheduleSection.tsx:224"}, "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-7625a2d846cb8a58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MerchSection.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MerchSection.tsx:123"}, "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-2150679103639a9e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/StaffPageHeader.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StaffPageHeader.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-903d19100afcc137", "name": "Privileged port 12 in use", "shortDescription": {"text": "Privileged port 12 in use"}, "fullDescription": {"text": "Port 12 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96cd61e43df92f4a", "name": "Privileged port 18 in use", "shortDescription": {"text": "Privileged port 18 in use"}, "fullDescription": {"text": "Port 18 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aafc967e7168ae34", "name": "Privileged port 24 in use", "shortDescription": {"text": "Privileged port 24 in use"}, "fullDescription": {"text": "Port 24 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1fbf2888d5260f72", "name": "Privileged port 21 in use", "shortDescription": {"text": "Privileged port 21 in use"}, "fullDescription": {"text": "Port 21 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc314a03080dd2cb", "name": "Privileged port 15 in use", "shortDescription": {"text": "Privileged port 15 in use"}, "fullDescription": {"text": "Port 15 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a734fcd1a8892a8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:47"}, "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-b63b4346f0d5a0c2", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ShopSection.tsx:305", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ShopSection.tsx:305"}, "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-0059d94457042ef6", "name": "Very large file: src/app/staff/schedule/calendar/page.tsx (1233 lines)", "shortDescription": {"text": "Very large file: src/app/staff/schedule/calendar/page.tsx (1233 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-cde84c161389c097", "name": "Very large file: src/components/ShopSection.tsx (1857 lines)", "shortDescription": {"text": "Very large file: src/components/ShopSection.tsx (1857 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": "4 test file(s) for 303 source file(s) (ratio 0.01). 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 78 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 127 placeholder/mock markers across 37 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-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. 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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e0317d3d906b50b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/rebuild-cast-and-photos.mjs:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/rebuild-cast-and-photos.mjs: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-4056a0a4413d4503", "name": "Commented-code block (5 lines) in src/app/api/photo/[id]/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/photo/[id]/route.ts:6"}, "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-71d49738d7ccea43", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/photo/[id]/route.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/photo/[id]/route.ts:64"}, "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-12df13f63a7a189f", "name": "Commented-code block (5 lines) in src/app/api/staff/operations/link-suggest/route.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/staff/operations/link-suggest/route.ts:10"}, "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-7bec988a3a689331", "name": "Commented-code block (5 lines) in src/app/api/staff/operations/sync/route.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/staff/operations/sync/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-2f5ce1f353a664d3", "name": "Commented-code block (6 lines) in src/app/api/staff/operations/lstep-batch/route.ts:15", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/staff/operations/lstep-batch/route.ts:15"}, "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-8865a121e1af5d78", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/hp-deploy/route.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/hp-deploy/route.ts:78"}, "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-7daa8f19a86db899", "name": "Commented-code block (6 lines) in src/app/api/staff/schedule/export/ics/route.ts:12", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/staff/schedule/export/ics/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-ced540929992f176", "name": "Commented-code block (10 lines) in src/app/api/staff/schedule/instances/route.ts:11", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/api/staff/schedule/instances/route.ts:11"}, "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-56b6baed0c07f159", "name": "Commented-code block (7 lines) in src/app/api/staff/schedule/instances/[id]/route.ts:54", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/staff/schedule/instances/[id]/route.ts:54"}, "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-33adcd0fcb6988dd", "name": "Legacy-named symbol `_prev_unused` in src/app/api/staff/kpi/dashboard/route.ts:363", "shortDescription": {"text": "Legacy-named symbol `_prev_unused` in src/app/api/staff/kpi/dashboard/route.ts:363"}, "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-741b0cc08d2a8812", "name": "Commented-code block (7 lines) in src/app/api/staff/kpi/dashboard/route.ts:131", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/staff/kpi/dashboard/route.ts:131"}, "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-34e046b1b20f954b", "name": "Commented-code block (6 lines) in src/app/api/staff/kpi/import-rs002/route.ts:12", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/staff/kpi/import-rs002/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-431f6b8d38d538b6", "name": "Commented-code block (7 lines) in src/app/api/staff/kpi/import-hacomono-billing/route.ts:31", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/staff/kpi/import-hacomono-billing/route.ts:31"}, "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-72b85fc791d43167", "name": "Commented-code block (5 lines) in src/app/api/lottery/route.ts:175", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/lottery/route.ts:175"}, "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-3e22b373b804f571", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/merch/page.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/merch/page.tsx:55"}, "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-eadbee051cfa61f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/sns/page.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/sns/page.tsx:15"}, "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-dafbc7c892ab5c42", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/_components/AdminLayoutClient.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/_components/AdminLayoutClient.tsx:39"}, "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-4dcba28fbbc7d55a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/video/page.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/video/page.tsx:15"}, "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-87e3779825affcce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/orders/page.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/orders/page.tsx:17"}, "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-a8884c8b2c88c26f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/settings/page.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/settings/page.tsx:14"}, "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-693f27de114a2f7d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/vote/page.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/vote/page.tsx: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-a6719f06e947dad8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/music/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/music/page.tsx:18"}, "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-ab4670f8cc3edfb1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/schedule/page.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/schedule/page.tsx: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-7192b7ae7a2d3199", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/page.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/page.tsx:20"}, "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-632e8e03b6cf939c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/dashboard/page.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/dashboard/page.tsx:14"}, "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-2652b293d2d1db49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/lessons/page.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/lessons/page.tsx: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-0134f58d5d271ef2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/setup/page.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/setup/page.tsx:17"}, "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-14bd380197797586", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/cancel/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/cancel/page.tsx:18"}, "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-b1d9770e64f25377", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/payroll/page.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/payroll/page.tsx:31"}, "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-f277eb7b44419ae4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/insights/page.tsx:343", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/insights/page.tsx:343"}, "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-69a78fdb26e96fae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/expenses/page.tsx:394", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/expenses/page.tsx:394"}, "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-ba1580e661438734", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/backstage/[token]/page.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/backstage/[token]/page.tsx:27"}, "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-a5b1370423f33da3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/operations/lstep-update/page.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/operations/lstep-update/page.tsx:133"}, "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-3d1d458462b846f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/page.tsx:252", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/page.tsx:252"}, "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-da39dc947520b79b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/[id]/print/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/[id]/print/page.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-127f5a0a3f17c092", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/page.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/page.tsx:80"}, "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-2aa36401fd74bc4e", "name": "Commented-code block (6 lines) in src/app/staff/schedule/sync/page.tsx:23", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/staff/schedule/sync/page.tsx:23"}, "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-0fc38e95da91bea4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/sync/page.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/sync/page.tsx:39"}, "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-bc01fa2e56f82747", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/hacomono-tasks/page.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/hacomono-tasks/page.tsx:158"}, "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-00874bb39a7dab5a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/calendar/page.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/calendar/page.tsx:126"}, "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-7b2140e7e0a6446f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/StudiosTab.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/StudiosTab.tsx:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65bfa63f1b638d17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/LessonsTab.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/LessonsTab.tsx:94"}, "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-87f7e747437dab49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/MastersClient.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/MastersClient.tsx:38"}, "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-4b29d1c73b665fd8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/InstructorsTab.tsx:223", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/InstructorsTab.tsx:223"}, "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-eb66ec1c542f44a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/studio-billing/page.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/studio-billing/page.tsx:126"}, "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-279ed5720d75dd44", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/events/[eventId]/todo/page.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/events/[eventId]/todo/page.tsx:60"}, "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-62441f6b329a14cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/members/page.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/members/page.tsx:59"}, "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-a9517f1652b71697", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/blog/page.tsx:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/blog/page.tsx:122"}, "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-6d4fef627dc0cca3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ShopSection.tsx:644", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ShopSection.tsx:644"}, "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-8b68c24588f80a02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/MerchSection.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/MerchSection.tsx: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-625b0e656863952e", "name": "Commented-code block (5 lines) in src/lib/studioBilling.ts:218", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/studioBilling.ts:218"}, "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-e5eae7a5a1bfa904", "name": "Commented-code block (5 lines) in src/lib/email.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/email.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-654af59645c07be6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gbp.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gbp.ts:32"}, "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-69e8eb499a31e04b", "name": "Commented-code block (6 lines) in src/lib/timetableData.ts:74", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/timetableData.ts:74"}, "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-6022cb3542376cfb", "name": "Commented-code block (5 lines) in src/lib/scheduleExport.ts:203", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/scheduleExport.ts:203"}, "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-2314fdb101d4fb9a", "name": "Commented-code block (5 lines) in src/lib/photoPhases.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/photoPhases.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4bd3afce82032f5", "name": "Commented-code block (6 lines) in src/lib/googleCalendar.ts:203", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/googleCalendar.ts:203"}, "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-47079b1d2ea8efa5", "name": "Commented-code block (7 lines) in src/lib/monthConfirm.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/monthConfirm.ts:10"}, "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-24c5b7ee9c59f1a7", "name": "Commented-code block (5 lines) in src/lib/lstepTransform.ts:91", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/lstepTransform.ts:91"}, "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-a9c0a36b8560fff1", "name": "Commented-code block (5 lines) in src/lib/ga4.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ga4.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2baa1b1c4c833e0e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/base.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/base.ts:44"}, "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-090b9eb8215d42dd", "name": "Commented-code block (5 lines) in src/lib/bankCsv.ts:89", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/bankCsv.ts:89"}, "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/24673"}, "properties": {"repository": "boomsendai-oss/bw5-app", "repoUrl": "https://github.com/boomsendai-oss/bw5-app", "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-ac02c2ea73da5e19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-bw6-todos.ts:75"}, "properties": {"repobilityId": "21224825318cae13", "scanner": "scanner-primary", "fingerprint": "ac02c2ea73da5e19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b1c9b0d15fd2f39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260608.js:33"}, "properties": {"repobilityId": "32bca3f37a517a5d", "scanner": "scanner-primary", "fingerprint": "8b1c9b0d15fd2f39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6264cadf07145a80", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run_migration_20260607.js:33"}, "properties": {"repobilityId": "4d408dad18054ed9", "scanner": "scanner-primary", "fingerprint": "6264cadf07145a80", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cc812a6c2ac43bc9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrations/20260607_bcrypt_sessions.js:32"}, "properties": {"repobilityId": "b08a75a9364ff42b", "scanner": "scanner-primary", "fingerprint": "cc812a6c2ac43bc9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63995897e93d5a19", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:47"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "63995897e93d5a19", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c57d5758eb974d4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:401"}, "properties": {"repobilityId": "e498d41b9221bfd3", "scanner": "scanner-primary", "fingerprint": "c57d5758eb974d4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-367ceb7e3398e306", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/merch/page.tsx:203"}, "properties": {"repobilityId": "48b308c8a324bce4", "scanner": "scanner-primary", "fingerprint": "367ceb7e3398e306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28def1deee71e510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performances/page.tsx:377"}, "properties": {"repobilityId": "1553ae0d7e84c8a8", "scanner": "scanner-primary", "fingerprint": "28def1deee71e510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7d7062c10c3ee55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/performance/[mId]/page.tsx:177"}, "properties": {"repobilityId": "a72cb378d153c692", "scanner": "scanner-primary", "fingerprint": "f7d7062c10c3ee55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9859ad5b7ddfcce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/timetable/page.tsx:274"}, "properties": {"repobilityId": "6c7ff7049b4629ae", "scanner": "scanner-primary", "fingerprint": "d9859ad5b7ddfcce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24baa28d93916217", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/page.tsx:105"}, "properties": {"repobilityId": "7d611900e14aec86", "scanner": "scanner-primary", "fingerprint": "24baa28d93916217", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c441d859854f969d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/page.tsx:96"}, "properties": {"repobilityId": "4aaba5653c123683", "scanner": "scanner-primary", "fingerprint": "c441d859854f969d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-052f99bd94aa90c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/photo/phase/[phaseNo]/[mId]/page.tsx:87"}, "properties": {"repobilityId": "35d9a2509d3dde0d", "scanner": "scanner-primary", "fingerprint": "052f99bd94aa90c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9a25ee3e079631a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/insights/page.tsx:711"}, "properties": {"repobilityId": "2cc4792bf256539c", "scanner": "scanner-primary", "fingerprint": "d9a25ee3e079631a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69a626a4cc05b8ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/expenses/page.tsx:254"}, "properties": {"repobilityId": "907cc53aa3e95ad9", "scanner": "scanner-primary", "fingerprint": "69a626a4cc05b8ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e493fe2d93ed3191", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/backstage/[token]/page.tsx:181"}, "properties": {"repobilityId": "9789176b137e332b", "scanner": "scanner-primary", "fingerprint": "e493fe2d93ed3191", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71f58e31208ca392", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/page.tsx:440"}, "properties": {"repobilityId": "508beae0983b431b", "scanner": "scanner-primary", "fingerprint": "71f58e31208ca392", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f383cc336d210123", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/operations/lstep-update/page.tsx:325"}, "properties": {"repobilityId": "5efd2229a08da1b3", "scanner": "scanner-primary", "fingerprint": "f383cc336d210123", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d22621546060311", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/orders/[token]/page.tsx:186"}, "properties": {"repobilityId": "c24c70def17432fe", "scanner": "scanner-primary", "fingerprint": "9d22621546060311", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84a46cb0f917a25d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/page.tsx:343"}, "properties": {"repobilityId": "6c3db5ae8a313d75", "scanner": "scanner-primary", "fingerprint": "84a46cb0f917a25d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3dda652d55f3e7b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/schedule/calendar/page.tsx:631"}, "properties": {"repobilityId": "35b0c63f0ed59694", "scanner": "scanner-primary", "fingerprint": "3dda652d55f3e7b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9141793af3e9934c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/staff/members/page.tsx:172"}, "properties": {"repobilityId": "d9cde5936e3e7443", "scanner": "scanner-primary", "fingerprint": "9141793af3e9934c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-526b45769ece18aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShopSection.tsx:1665"}, "properties": {"repobilityId": "9578fe7ac453df03", "scanner": "scanner-primary", "fingerprint": "526b45769ece18aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-260a5776d672d0bf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ShopSection.tsx:305"}, "properties": {"repobilityId": "5d66d2c1baac077f", "scanner": "scanner-primary", "fingerprint": "260a5776d672d0bf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f5f5d9c651a63596", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ScheduleSection.tsx:224"}, "properties": {"repobilityId": "0834778d71ffb662", "scanner": "scanner-primary", "fingerprint": "f5f5d9c651a63596", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7625a2d846cb8a58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MerchSection.tsx:123"}, "properties": {"repobilityId": "2d51fbed8fb66a0f", "scanner": "scanner-primary", "fingerprint": "7625a2d846cb8a58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2150679103639a9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StaffPageHeader.tsx:24"}, "properties": {"repobilityId": "8d43826dd78621cc", "scanner": "scanner-primary", "fingerprint": "2150679103639a9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-903d19100afcc137", "level": "warning", "message": {"text": "Privileged port 12 in use"}, "properties": {"repobilityId": "65e7eefa33f2def4", "scanner": "scanner-primary", "fingerprint": "903d19100afcc137", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gbp-reviews-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96cd61e43df92f4a", "level": "warning", "message": {"text": "Privileged port 18 in use"}, "properties": {"repobilityId": "2d7b5e7d9c158e43", "scanner": "scanner-primary", "fingerprint": "96cd61e43df92f4a", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gbp-reviews-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aafc967e7168ae34", "level": "warning", "message": {"text": "Privileged port 24 in use"}, "properties": {"repobilityId": "a6356ba91a17fcb8", "scanner": "scanner-primary", "fingerprint": "aafc967e7168ae34", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gbp-reviews-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1fbf2888d5260f72", "level": "warning", "message": {"text": "Privileged port 21 in use"}, "properties": {"repobilityId": "d920b7cd1b1a16dc", "scanner": "scanner-primary", "fingerprint": "1fbf2888d5260f72", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gbp-reviews-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc314a03080dd2cb", "level": "warning", "message": {"text": "Privileged port 15 in use"}, "properties": {"repobilityId": "3340f9a170f285cd", "scanner": "scanner-primary", "fingerprint": "dc314a03080dd2cb", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gbp-reviews-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a734fcd1a8892a8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:47"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "7a734fcd1a8892a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-b63b4346f0d5a0c2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ShopSection.tsx:305"}, "properties": {"repobilityId": "25681f4460e5b27f", "scanner": "scanner-primary", "fingerprint": "b63b4346f0d5a0c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ShopSection.tsx"}, "region": {"startLine": 305}}}]}, {"ruleId": "scanner-0059d94457042ef6", "level": "note", "message": {"text": "Very large file: src/app/staff/schedule/calendar/page.tsx (1233 lines)"}, "properties": {"repobilityId": "a16787e407616653", "scanner": "scanner-primary", "fingerprint": "0059d94457042ef6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cde84c161389c097", "level": "note", "message": {"text": "Very large file: src/components/ShopSection.tsx (1857 lines)"}, "properties": {"repobilityId": "02ef20b5e7ae75a1", "scanner": "scanner-primary", "fingerprint": "cde84c161389c097", "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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a1eb566a4d68e27b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "31a12b2a3501ad67", "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": "6a6c28207876c752", "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": "19ec42686078be3e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e6e29d3149254357", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-3e0317d3d906b50b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/rebuild-cast-and-photos.mjs:136"}, "properties": {"repobilityId": "680aff068f589f0d", "scanner": "scanner-primary", "fingerprint": "3e0317d3d906b50b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4056a0a4413d4503", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/photo/[id]/route.ts:6"}, "properties": {"repobilityId": "61bbe8546a45d415", "scanner": "scanner-primary", "fingerprint": "4056a0a4413d4503", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71d49738d7ccea43", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/photo/[id]/route.ts:64"}, "properties": {"repobilityId": "388644140b80caf0", "scanner": "scanner-primary", "fingerprint": "71d49738d7ccea43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12df13f63a7a189f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/staff/operations/link-suggest/route.ts:10"}, "properties": {"repobilityId": "6874c9033b7f2c75", "scanner": "scanner-primary", "fingerprint": "12df13f63a7a189f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7bec988a3a689331", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/staff/operations/sync/route.ts:12"}, "properties": {"repobilityId": "5d58166108f3351d", "scanner": "scanner-primary", "fingerprint": "7bec988a3a689331", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f5ce1f353a664d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/staff/operations/lstep-batch/route.ts:15"}, "properties": {"repobilityId": "2caee92b20e1f35f", "scanner": "scanner-primary", "fingerprint": "2f5ce1f353a664d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8865a121e1af5d78", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/staff/hp-deploy/route.ts:78"}, "properties": {"repobilityId": "f58f303867c02db4", "scanner": "scanner-primary", "fingerprint": "8865a121e1af5d78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7daa8f19a86db899", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/staff/schedule/export/ics/route.ts:12"}, "properties": {"repobilityId": "021b61898766623f", "scanner": "scanner-primary", "fingerprint": "7daa8f19a86db899", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ced540929992f176", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/api/staff/schedule/instances/route.ts:11"}, "properties": {"repobilityId": "a295f0d77e1f6ebd", "scanner": "scanner-primary", "fingerprint": "ced540929992f176", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56b6baed0c07f159", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/staff/schedule/instances/[id]/route.ts:54"}, "properties": {"repobilityId": "bd02044efdee311d", "scanner": "scanner-primary", "fingerprint": "56b6baed0c07f159", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33adcd0fcb6988dd", "level": "note", "message": {"text": "Legacy-named symbol `_prev_unused` in src/app/api/staff/kpi/dashboard/route.ts:363"}, "properties": {"repobilityId": "5f9a77324960d137", "scanner": "scanner-primary", "fingerprint": "33adcd0fcb6988dd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-741b0cc08d2a8812", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/staff/kpi/dashboard/route.ts:131"}, "properties": {"repobilityId": "0e2bf09ec0f2acf3", "scanner": "scanner-primary", "fingerprint": "741b0cc08d2a8812", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34e046b1b20f954b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/staff/kpi/import-rs002/route.ts:12"}, "properties": {"repobilityId": "2cd610c95362cf39", "scanner": "scanner-primary", "fingerprint": "34e046b1b20f954b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-431f6b8d38d538b6", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/staff/kpi/import-hacomono-billing/route.ts:31"}, "properties": {"repobilityId": "6221800c1b6c9ddc", "scanner": "scanner-primary", "fingerprint": "431f6b8d38d538b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72b85fc791d43167", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/lottery/route.ts:175"}, "properties": {"repobilityId": "618b13bfe2991c59", "scanner": "scanner-primary", "fingerprint": "72b85fc791d43167", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e22b373b804f571", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/merch/page.tsx:55"}, "properties": {"repobilityId": "52b84b9448560d64", "scanner": "scanner-primary", "fingerprint": "3e22b373b804f571", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eadbee051cfa61f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/sns/page.tsx:15"}, "properties": {"repobilityId": "d567001b9aeab550", "scanner": "scanner-primary", "fingerprint": "eadbee051cfa61f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dafbc7c892ab5c42", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/_components/AdminLayoutClient.tsx:39"}, "properties": {"repobilityId": "f90563592628a972", "scanner": "scanner-primary", "fingerprint": "dafbc7c892ab5c42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4dcba28fbbc7d55a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/video/page.tsx:15"}, "properties": {"repobilityId": "77c7e5efa1a4c5ac", "scanner": "scanner-primary", "fingerprint": "4dcba28fbbc7d55a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-87e3779825affcce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/orders/page.tsx:17"}, "properties": {"repobilityId": "bbee20c1e589f0f7", "scanner": "scanner-primary", "fingerprint": "87e3779825affcce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8884c8b2c88c26f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/settings/page.tsx:14"}, "properties": {"repobilityId": "13d59ca1f093bbb3", "scanner": "scanner-primary", "fingerprint": "a8884c8b2c88c26f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-693f27de114a2f7d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/vote/page.tsx:16"}, "properties": {"repobilityId": "7028d0e9941d6e34", "scanner": "scanner-primary", "fingerprint": "693f27de114a2f7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6719f06e947dad8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/music/page.tsx:18"}, "properties": {"repobilityId": "66833375d9e58d69", "scanner": "scanner-primary", "fingerprint": "a6719f06e947dad8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab4670f8cc3edfb1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/schedule/page.tsx:16"}, "properties": {"repobilityId": "8772d199d52ad7e0", "scanner": "scanner-primary", "fingerprint": "ab4670f8cc3edfb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7192b7ae7a2d3199", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/page.tsx:20"}, "properties": {"repobilityId": "8d2a810dd9785ba7", "scanner": "scanner-primary", "fingerprint": "7192b7ae7a2d3199", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-632e8e03b6cf939c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/dashboard/page.tsx:14"}, "properties": {"repobilityId": "f1966272da239743", "scanner": "scanner-primary", "fingerprint": "632e8e03b6cf939c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2652b293d2d1db49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/lessons/page.tsx:26"}, "properties": {"repobilityId": "dc31299df5beb1e0", "scanner": "scanner-primary", "fingerprint": "2652b293d2d1db49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0134f58d5d271ef2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/setup/page.tsx:17"}, "properties": {"repobilityId": "97d175f96625cdbf", "scanner": "scanner-primary", "fingerprint": "0134f58d5d271ef2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14bd380197797586", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/cancel/page.tsx:18"}, "properties": {"repobilityId": "378b5a1eaa721abf", "scanner": "scanner-primary", "fingerprint": "14bd380197797586", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1d9770e64f25377", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/instructor/payroll/page.tsx:31"}, "properties": {"repobilityId": "d255d09782d38bef", "scanner": "scanner-primary", "fingerprint": "b1d9770e64f25377", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f277eb7b44419ae4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/insights/page.tsx:343"}, "properties": {"repobilityId": "64e798ac22070e20", "scanner": "scanner-primary", "fingerprint": "f277eb7b44419ae4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69a78fdb26e96fae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/expenses/page.tsx:394"}, "properties": {"repobilityId": "ee152c3e8a445bff", "scanner": "scanner-primary", "fingerprint": "69a78fdb26e96fae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba1580e661438734", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/backstage/[token]/page.tsx:27"}, "properties": {"repobilityId": "04bacd161571304f", "scanner": "scanner-primary", "fingerprint": "ba1580e661438734", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5b1370423f33da3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/operations/lstep-update/page.tsx:133"}, "properties": {"repobilityId": "e2866fab7b3205ff", "scanner": "scanner-primary", "fingerprint": "a5b1370423f33da3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d1d458462b846f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/page.tsx:252"}, "properties": {"repobilityId": "e2518586df29dbe7", "scanner": "scanner-primary", "fingerprint": "3d1d458462b846f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-da39dc947520b79b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/payroll/[id]/print/page.tsx:29"}, "properties": {"repobilityId": "80b6775d21bf48ea", "scanner": "scanner-primary", "fingerprint": "da39dc947520b79b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-127f5a0a3f17c092", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/page.tsx:80"}, "properties": {"repobilityId": "2aed84069481c7db", "scanner": "scanner-primary", "fingerprint": "127f5a0a3f17c092", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2aa36401fd74bc4e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/staff/schedule/sync/page.tsx:23"}, "properties": {"repobilityId": "26e51ac3d940a40a", "scanner": "scanner-primary", "fingerprint": "2aa36401fd74bc4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fc38e95da91bea4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/sync/page.tsx:39"}, "properties": {"repobilityId": "f33c83a91900f329", "scanner": "scanner-primary", "fingerprint": "0fc38e95da91bea4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc01fa2e56f82747", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/hacomono-tasks/page.tsx:158"}, "properties": {"repobilityId": "9c7c691054eec232", "scanner": "scanner-primary", "fingerprint": "bc01fa2e56f82747", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00874bb39a7dab5a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/schedule/calendar/page.tsx:126"}, "properties": {"repobilityId": "1d18c141e23cb6b1", "scanner": "scanner-primary", "fingerprint": "00874bb39a7dab5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b2140e7e0a6446f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/StudiosTab.tsx:71"}, "properties": {"repobilityId": "797a6e636fdb079b", "scanner": "scanner-primary", "fingerprint": "7b2140e7e0a6446f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65bfa63f1b638d17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/LessonsTab.tsx:94"}, "properties": {"repobilityId": "495fc0d357e76a99", "scanner": "scanner-primary", "fingerprint": "65bfa63f1b638d17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-87f7e747437dab49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/MastersClient.tsx:38"}, "properties": {"repobilityId": "f7baa291047e265f", "scanner": "scanner-primary", "fingerprint": "87f7e747437dab49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b29d1c73b665fd8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/masters/_components/InstructorsTab.tsx:223"}, "properties": {"repobilityId": "93f00b71e6be9470", "scanner": "scanner-primary", "fingerprint": "4b29d1c73b665fd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb66ec1c542f44a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/studio-billing/page.tsx:126"}, "properties": {"repobilityId": "f74561af8c4322b3", "scanner": "scanner-primary", "fingerprint": "eb66ec1c542f44a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-279ed5720d75dd44", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/events/[eventId]/todo/page.tsx:60"}, "properties": {"repobilityId": "1da1b291f6c57006", "scanner": "scanner-primary", "fingerprint": "279ed5720d75dd44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62441f6b329a14cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/members/page.tsx:59"}, "properties": {"repobilityId": "20695da12d9c9e2e", "scanner": "scanner-primary", "fingerprint": "62441f6b329a14cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a9517f1652b71697", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/staff/blog/page.tsx:122"}, "properties": {"repobilityId": "6ffa3679e49d7999", "scanner": "scanner-primary", "fingerprint": "a9517f1652b71697", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d4fef627dc0cca3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ShopSection.tsx:644"}, "properties": {"repobilityId": "b6a804308244028a", "scanner": "scanner-primary", "fingerprint": "6d4fef627dc0cca3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b68c24588f80a02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/MerchSection.tsx:54"}, "properties": {"repobilityId": "07fe41a2836cd5c8", "scanner": "scanner-primary", "fingerprint": "8b68c24588f80a02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-625b0e656863952e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/studioBilling.ts:218"}, "properties": {"repobilityId": "a4bef5704b8c7ef6", "scanner": "scanner-primary", "fingerprint": "625b0e656863952e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5eae7a5a1bfa904", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/email.ts:3"}, "properties": {"repobilityId": "ff65f78e739dcec0", "scanner": "scanner-primary", "fingerprint": "e5eae7a5a1bfa904", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-654af59645c07be6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gbp.ts:32"}, "properties": {"repobilityId": "46e95618371174dd", "scanner": "scanner-primary", "fingerprint": "654af59645c07be6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69e8eb499a31e04b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/timetableData.ts:74"}, "properties": {"repobilityId": "20e81f17890b2bae", "scanner": "scanner-primary", "fingerprint": "69e8eb499a31e04b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6022cb3542376cfb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/scheduleExport.ts:203"}, "properties": {"repobilityId": "c1111071638af82c", "scanner": "scanner-primary", "fingerprint": "6022cb3542376cfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2314fdb101d4fb9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/photoPhases.ts:1"}, "properties": {"repobilityId": "8d241ebccf248de3", "scanner": "scanner-primary", "fingerprint": "2314fdb101d4fb9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4bd3afce82032f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/googleCalendar.ts:203"}, "properties": {"repobilityId": "79101ce9fcad4af2", "scanner": "scanner-primary", "fingerprint": "a4bd3afce82032f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47079b1d2ea8efa5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/monthConfirm.ts:10"}, "properties": {"repobilityId": "f39b525862c4ee80", "scanner": "scanner-primary", "fingerprint": "47079b1d2ea8efa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24c5b7ee9c59f1a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/lstepTransform.ts:91"}, "properties": {"repobilityId": "945036df6994726f", "scanner": "scanner-primary", "fingerprint": "24c5b7ee9c59f1a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9c0a36b8560fff1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ga4.ts:7"}, "properties": {"repobilityId": "7601cbbb6ef98ac6", "scanner": "scanner-primary", "fingerprint": "a9c0a36b8560fff1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2baa1b1c4c833e0e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/base.ts:44"}, "properties": {"repobilityId": "42f5e8585e2c6301", "scanner": "scanner-primary", "fingerprint": "2baa1b1c4c833e0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-090b9eb8215d42dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/bankCsv.ts:89"}, "properties": {"repobilityId": "70a1787b59ecedeb", "scanner": "scanner-primary", "fingerprint": "090b9eb8215d42dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}