{"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": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: withdoron/locallane", "shortDescription": {"text": "Foundry mined blueprint gap alignment: withdoron/locallane"}, "fullDescription": {"text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: withdoron/locallane#2\nRepo: withdoron/locallane\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 25\nEdges: 40\nNode types: {'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': "}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_test_ci_gap", "name": "Foundry mined test ci gap after feedback: withdoron/locallane", "shortDescription": {"text": "Foundry mined test ci gap after feedback: withdoron/locallane"}, "fullDescription": {"text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: withdoron/locallane#2\nRepo: withdoron/locallane\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 25\nEdges: 40\nNode types: {'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': "}, "properties": {"scanner": "foundry_dataset", "category": "testing", "severity": "high", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"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-7ae089d37b7083ae", "name": "`truncate` class without `title=` for hover reveal \u2014 components/shell/avatar-menu.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/shell/avatar-menu.tsx:268"}, "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-b976038c5a56b847", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:80"}, "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-7af5339cc8f9dd52", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/global-error.tsx:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/global-error.tsx:36"}, "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-01147b30c90c2952", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/events/_components/events-room.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/events/_components/events-room.tsx:266"}, "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-25431b5db5a8aa53", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/schedule/_components/sched", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/schedule/_components/scheduler.tsx:340"}, "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-9c486f5c08da1bc4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/page.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/page.tsx:166"}, "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-5377845ddddeb22f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/line", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/line-item-editor.tsx:634"}, "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-34c9132f34c4cf7b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/clie", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/client-picker.tsx:82"}, "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-bc3032b79439bc72", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/page.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/page.tsx:154"}, "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-6c12c2fe05c43b16", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/line-", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/line-item-picker.tsx:148"}, "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-5c8d303309eaaa8d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/proje", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/project-documents.tsx:208"}, "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-3d0c598f63ca5b19", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/payme", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/payment-form.tsx:399"}, "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-558f636c31842784", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/proje", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/project-change-orders.tsx:77"}, "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-04dd27afb702c1c0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/members", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/members-section.tsx:78"}, "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-550ccca39767681f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/clients", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/clients-section.tsx:206"}, "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-de7ceb2d36b99ade", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-documents.tsx:49"}, "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-e1a708a58e4e00ac", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-projects.tsx:83"}, "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-b7e3303a2eb2ed2c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/crew-se", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/crew-section.tsx:342"}, "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-b8aafa8fc91ddc34", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:400", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:400"}, "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-95a9687bb09a655e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/books/_components/txn-r", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/books/_components/txn-row.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4cdd173ce7616c1d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/activity/page.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/activity/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-d38815a29fc519c7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/unattribute", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/unattributed-income.tsx:100"}, "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-cbd126312edb03c8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/envelopes-c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/envelopes-card.tsx:185"}, "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-b0578a68aff834d7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:210"}, "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-2893d9513b6147c2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/movement/activity-card.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/movement/activity-card.tsx:61"}, "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-146268ddf60845cb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/tower/_components/city-pane.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/tower/_components/city-pane.tsx:48"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-298284e4625844bf", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(public)/parts.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(public)/parts.tsx:47"}, "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-06db9629f64f86de", "name": "Stray `console.log` in TS/JS \u2014 lib/timing.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/timing.ts:52"}, "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-a2ccd0689db53c7d", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:80"}, "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-596449c2dd150c12", "name": "Insecure pattern 'dangerous_innerhtml' in app/global-error.tsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/global-error.tsx:36"}, "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-421fd63f7d898116", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:18", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e8bfd446a7b2298e", "name": "Insecure pattern 'direct_innerhtml_assignment' in mockups/scheduler/index.html:371", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/scheduler/index.html:371"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "28 test file(s) for 327 source file(s) (ratio 0.09). 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 383 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 174 placeholder/mock markers across 50 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-450eda2c24b0b238", "name": "Commented-code block (5 lines) in middleware.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in middleware.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-6cfbfe2c4efea701", "name": "Commented-code block (6 lines) in next.config.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.ts:8"}, "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-03565ed22a18b39a", "name": "Commented-code block (7 lines) in scripts/replay-accept-as-test.mjs:7", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/replay-accept-as-test.mjs: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-8b2ef5399c39d48d", "name": "Commented-code block (6 lines) in scripts/verify-client-projects.mjs:6", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/verify-client-projects.mjs: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-d2f896135c3043df", "name": "Commented-code block (25 lines) in scripts/smoke-test-create-invitation.mjs:15", "shortDescription": {"text": "Commented-code block (25 lines) in scripts/smoke-test-create-invitation.mjs: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-50c21aa5697b45bf", "name": "Commented-code block (7 lines) in scripts/verify-6-4b-2-ledger-tiles.mjs:4", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/verify-6-4b-2-ledger-tiles.mjs:4"}, "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-2e9aba5580a3991d", "name": "Commented-code block (12 lines) in scripts/verify-scheduler.mjs:7", "shortDescription": {"text": "Commented-code block (12 lines) in scripts/verify-scheduler.mjs: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-564b43860a8dbb3b", "name": "Commented-code block (5 lines) in scripts/verify-estimate-write-path.mjs:6", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/verify-estimate-write-path.mjs: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-1e84c6733e83f72e", "name": "Commented-code block (15 lines) in scripts/verify-trade-taxonomy.mjs:9", "shortDescription": {"text": "Commented-code block (15 lines) in scripts/verify-trade-taxonomy.mjs:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3b5c14826cd4d6a", "name": "Commented-code block (14 lines) in scripts/verify-change-orders.mjs:4", "shortDescription": {"text": "Commented-code block (14 lines) in scripts/verify-change-orders.mjs:4"}, "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-a2e8216281525356", "name": "Commented-code block (7 lines) in scripts/verify-6-4b-1-payments.mjs:4", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/verify-6-4b-1-payments.mjs:4"}, "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-2d31f840a7f25302", "name": "Commented-code block (6 lines) in scripts/diagnose-cross-user-accept.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/diagnose-cross-user-accept.mjs:4"}, "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-2b7c3907ead00b04", "name": "Commented-code block (7 lines) in scripts/verify-6-4c-daily-log.mjs:4", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/verify-6-4c-daily-log.mjs:4"}, "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-fc51d3b05c9c64a9", "name": "Commented-code block (5 lines) in scripts/verify-6-4b-3-permits-documents.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/verify-6-4b-3-permits-documents.mjs:4"}, "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-11b809e015b75087", "name": "Commented-code block (10 lines) in scripts/verify-co-trade-set-inheritance.mjs:4", "shortDescription": {"text": "Commented-code block (10 lines) in scripts/verify-co-trade-set-inheritance.mjs:4"}, "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-8a658b771046a69f", "name": "Commented-code block (5 lines) in app/sign/[token]/sign-action.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in app/sign/[token]/sign-action.ts:55"}, "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-efba6915be14148a", "name": "Commented-code block (5 lines) in app/(authenticated)/layout.tsx:87", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/layout.tsx:87"}, "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-924d9b219013534f", "name": "Commented-code block (6 lines) in app/(authenticated)/businesses/actions.ts:78", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/actions.ts:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf063dda2833fc46", "name": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_actions/send-estimate-document.tsx", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_actions/send-estimate-document.tsx:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-accde33c129dce77", "name": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/[estimateId]/document/pdf/route.ts:", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/[estimateId]/document/pdf/route.ts:61"}, "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-4603da486f551ed0", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/line-item-editor.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/line-item-editor.tsx:142"}, "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-5bf422909388117a", "name": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/estimate-form.tsx:174", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/estimate-form.tsx:174"}, "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-2ff5ff1b25b61cdc", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/page.tsx:176", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/page.tsx:176"}, "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-41f57da8687a1342", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/change-orders/new/page.t", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/change-orders/new/page.tsx:55"}, "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-0e1b6501291d09ca", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/labor-entry-form.tsx:161", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/labor-entry-form.tsx:161"}, "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-e882d30e32288f4e", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/payment-form.tsx:202", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/payment-form.tsx:202"}, "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-b5d21ad6bc24c61c", "name": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/_components/home-wizard.tsx:166", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/_components/home-wizard.tsx:166"}, "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-a22cadae72eb7353", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/people/_components/client-detail-form.tsx:48", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/people/_components/client-detail-form.tsx:48"}, "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-a093c2bb71b767e3", "name": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/finance/page.tsx:138", "shortDescription": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/finance/page.tsx:138"}, "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-c382bb197da3193b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:73"}, "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-f3b9817c09462d53", "name": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/layout.tsx:56", "shortDescription": {"text": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/layout.tsx:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-afa8889aec3f897b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/books/page.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/books/page.tsx:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47fcd8c5b309ad3f", "name": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:114", "shortDescription": {"text": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:114"}, "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-17568afe24b6dc64", "name": "Commented-code block (6 lines) in app/(authenticated)/dev/invites/create-invitation-form.tsx:76", "shortDescription": {"text": "Commented-code block (6 lines) in app/(authenticated)/dev/invites/create-invitation-form.tsx:76"}, "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-c09d3e2e528fd548", "name": "Commented-code block (5 lines) in app/i/[token]/page.tsx:138", "shortDescription": {"text": "Commented-code block (5 lines) in app/i/[token]/page.tsx:138"}, "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-c69a5d1a16fb71f5", "name": "Commented-code block (7 lines) in app/i/[token]/_actions/lobby.ts:169", "shortDescription": {"text": "Commented-code block (7 lines) in app/i/[token]/_actions/lobby.ts:169"}, "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-37248bb14bf9f6e4", "name": "Commented-code block (6 lines) in app/i/[token]/_components/lobby.tsx:76", "shortDescription": {"text": "Commented-code block (6 lines) in app/i/[token]/_components/lobby.tsx:76"}, "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-f66ce72c8a3d3426", "name": "Commented-code block (6 lines) in app/(auth)/auth/callback/route.ts:75", "shortDescription": {"text": "Commented-code block (6 lines) in app/(auth)/auth/callback/route.ts:75"}, "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-0bd1cdb0f6e52880", "name": "Commented-code block (5 lines) in app/(auth)/login/page.tsx:27", "shortDescription": {"text": "Commented-code block (5 lines) in app/(auth)/login/page.tsx:27"}, "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-72f1b22cd4ca08e6", "name": "Commented-code block (5 lines) in lib/desk/client-document.ts:56", "shortDescription": {"text": "Commented-code block (5 lines) in lib/desk/client-document.ts:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed46457da61692b6", "name": "Commented-code block (5 lines) in lib/desk/rooms.ts:120", "shortDescription": {"text": "Commented-code block (5 lines) in lib/desk/rooms.ts:120"}, "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-c923bc3a02f3e504", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/desk/crew.ts:239", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/desk/crew.ts:239"}, "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-aa8356b8a901e7ed", "name": "Commented-code block (6 lines) in lib/desk/trade-sets.ts:597", "shortDescription": {"text": "Commented-code block (6 lines) in lib/desk/trade-sets.ts:597"}, "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-eba06dccefd5f57e", "name": "Commented-code block (10 lines) in lib/desk/financials.ts:141", "shortDescription": {"text": "Commented-code block (10 lines) in lib/desk/financials.ts:141"}, "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-d89813d8d07d436a", "name": "Commented-code block (5 lines) in lib/finance/invoices.test.ts:145", "shortDescription": {"text": "Commented-code block (5 lines) in lib/finance/invoices.test.ts:145"}, "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-70d76dd3450e5c54", "name": "Commented-code block (5 lines) in lib/finance/ledger.ts:59", "shortDescription": {"text": "Commented-code block (5 lines) in lib/finance/ledger.ts:59"}, "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-1763b37328e05057", "name": "Commented-code block (5 lines) in lib/movement/activity.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in lib/movement/activity.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-51ab37ffea85afa7", "name": "Commented-code block (9 lines) in supabase/functions/accept_invitation/index.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/accept_invitation/index.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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `NEXT_PUBLIC_ROOT_DOMAIN`, `NEXT_PUBLIC_SITE_URL`, `NEXT_RUNTIME`, `NODE_ENV`, `VERCEL_ENV`, `VERCEL_PROJECT_PRODUCTION_URL`, `VERCEL_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22805"}, "properties": {"repository": "withdoron/locallane", "repoUrl": "https://github.com/withdoron/locallane", "branch": "main"}, "results": [{"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: withdoron/locallane"}, "properties": {"repobilityId": 405432, "scanner": "foundry_dataset", "fingerprint": "870567141737f835bed13ad82cb8b057e64f91494ed65f39e89f7e8bff3f233b", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 2, "test_ci_gap": 1, "ci_success_signal": 1, "deployment_env_gap": 1, "dependency_or_build": 3, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "blueprint_human_gap_alignment": 2, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 4, "human_reported_issue_then_verified_fix_attempt": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"claimed_resolved_with_verification_signal": 8}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {"ci_success_signal": 4}, "synthetic": false, "edge_count": 40, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 1, "comment_chain_has_ci": 2, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 1, "thread_has_comment_chain": 2, "comment_chain_links_commit": 10, "comment_chain_touches_file": 2, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 25, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 1, "alignment": 2, "ci_summary": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "withdoron/locallane#2", "issue_number": "2", "quality_tiers": {"high_confidence": 3, "assumption_check": 2, "weak_supervision": 1}, "repo_full_name": "withdoron/locallane", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-eaf21f51fad2dd9d", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"dependency_or_build": 5}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: withdoron/locallane#2\nRepo: withdoron/locallane\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 25\nEdges: 40\nNode types: {'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'pr_file': 1, 'ci_summary': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_links_commit': 10, 'chain_has_link_quality': 6, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'comment_chain_has_ci': 2, 'comment_chain_touches_file': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_touches_file': 1, 'thread_has_issue_chain': 1, 'issue_chain_touches_file': 1, 'thread_has_fix_outcome': 1}\nLabels: {'claimed_resolved_with_verification_signal': 4, 'dependency_or_build': 3, 'human_reported_issue_then_verified_fix_attempt': 2, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'deployment_env_gap': 1, 'ci_success_signal': 1, 'verification_or_tests': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 8}\nQuality tiers: {'high_confidence': 3, 'assumption_check': 2, 'weak_supervision': 1}\nCI labels: {'ci_success_signal': 4}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/withdoron/locallane", "source_id": "graph-query-motif_query-b422d90c0b3828c6", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "withdoron/locallane", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: withdoron/locallane"}, "properties": {"repobilityId": 420862, "scanner": "foundry_dataset", "fingerprint": "9356566526c994d4f3c919e642a5a379445563e94502aef781b07cce83bc800d", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"bug_fix": 2, "test_ci_gap": 1, "ci_success_signal": 1, "deployment_env_gap": 1, "dependency_or_build": 3, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "blueprint_human_gap_alignment": 2, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 4, "human_reported_issue_then_verified_fix_attempt": 2}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"claimed_resolved_with_verification_signal": 8}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {"ci_success_signal": 4}, "synthetic": false, "edge_count": 40, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 1, "comment_chain_has_ci": 2, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 1, "thread_has_comment_chain": 2, "comment_chain_links_commit": 10, "comment_chain_touches_file": 2, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 25, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 1, "alignment": 2, "ci_summary": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "withdoron/locallane#2", "issue_number": "2", "quality_tiers": {"high_confidence": 3, "assumption_check": 2, "weak_supervision": 1}, "repo_full_name": "withdoron/locallane", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-f9bbbb7843301b06", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"dependency_or_build": 5}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: withdoron/locallane\nThread: withdoron/locallane#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: withdoron/locallane#2\nRepo: withdoron/locallane\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 25\nEdges: 40\nNode types: {'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'pr_file': 1, 'ci_summary': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_links_commit': 10, 'chain_has_link_quality': 6, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'comment_chain_has_ci': 2, 'comment_chain_touches_file': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_touches_file': 1, 'thread_has_issue_chain': 1, 'issue_chain_touches_file': 1, 'thread_has_fix_outcome': 1}\nLabels: {'claimed_resolved_with_verification_signal': 4, 'dependency_or_build': 3, 'human_reported_issue_then_verified_fix_attempt': 2, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'deployment_env_gap': 1, 'ci_success_signal': 1, 'verification_or_tests': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 8}\nQuality tiers: {'high_confidence': 3, 'assumption_check': 2, 'weak_supervision': 1}\nCI labels: {'ci_success_signal': 4}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/withdoron/locallane", "source_id": "graph-query-motif_query-d2521e29160f1f6b", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "withdoron/locallane", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"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-7ae089d37b7083ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/shell/avatar-menu.tsx:268"}, "properties": {"repobilityId": "c1abf934ed15898e", "scanner": "scanner-primary", "fingerprint": "7ae089d37b7083ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b976038c5a56b847", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:80"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "b976038c5a56b847", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7af5339cc8f9dd52", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/global-error.tsx:36"}, "properties": {"repobilityId": "2dfffc080d64d151", "scanner": "scanner-primary", "fingerprint": "7af5339cc8f9dd52", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-01147b30c90c2952", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/events/_components/events-room.tsx:266"}, "properties": {"repobilityId": "1e835ea8eaf38233", "scanner": "scanner-primary", "fingerprint": "01147b30c90c2952", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25431b5db5a8aa53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/schedule/_components/scheduler.tsx:340"}, "properties": {"repobilityId": "7301be443f46f330", "scanner": "scanner-primary", "fingerprint": "25431b5db5a8aa53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c486f5c08da1bc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/page.tsx:166"}, "properties": {"repobilityId": "ed003a4a4fd457a6", "scanner": "scanner-primary", "fingerprint": "9c486f5c08da1bc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5377845ddddeb22f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/line-item-editor.tsx:634"}, "properties": {"repobilityId": "669abff26921464d", "scanner": "scanner-primary", "fingerprint": "5377845ddddeb22f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34c9132f34c4cf7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/estimates/_components/client-picker.tsx:82"}, "properties": {"repobilityId": "efd2a2678423c640", "scanner": "scanner-primary", "fingerprint": "34c9132f34c4cf7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc3032b79439bc72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/page.tsx:154"}, "properties": {"repobilityId": "3c398c433e40f33e", "scanner": "scanner-primary", "fingerprint": "bc3032b79439bc72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c12c2fe05c43b16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/line-item-picker.tsx:148"}, "properties": {"repobilityId": "9766704ce0bab7d4", "scanner": "scanner-primary", "fingerprint": "6c12c2fe05c43b16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c8d303309eaaa8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/project-documents.tsx:208"}, "properties": {"repobilityId": "73990a6c0d238faa", "scanner": "scanner-primary", "fingerprint": "5c8d303309eaaa8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d0c598f63ca5b19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/payment-form.tsx:399"}, "properties": {"repobilityId": "9c91c4af6f41c2b9", "scanner": "scanner-primary", "fingerprint": "3d0c598f63ca5b19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-558f636c31842784", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/projects/_components/project-change-orders.tsx:77"}, "properties": {"repobilityId": "259d6275be78cd76", "scanner": "scanner-primary", "fingerprint": "558f636c31842784", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04dd27afb702c1c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/members-section.tsx:78"}, "properties": {"repobilityId": "87e11de2a6ebe7ae", "scanner": "scanner-primary", "fingerprint": "04dd27afb702c1c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-550ccca39767681f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/clients-section.tsx:206"}, "properties": {"repobilityId": "ae9ce8ce16ba14b4", "scanner": "scanner-primary", "fingerprint": "550ccca39767681f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de7ceb2d36b99ade", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-documents.tsx:49"}, "properties": {"repobilityId": "e62677770a7d0736", "scanner": "scanner-primary", "fingerprint": "de7ceb2d36b99ade", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1a708a58e4e00ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/client-projects.tsx:83"}, "properties": {"repobilityId": "57118cec4dd0258c", "scanner": "scanner-primary", "fingerprint": "e1a708a58e4e00ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7e3303a2eb2ed2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/desk/people/_components/crew-section.tsx:342"}, "properties": {"repobilityId": "32c1473a56273b27", "scanner": "scanner-primary", "fingerprint": "b7e3303a2eb2ed2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8aafa8fc91ddc34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:400"}, "properties": {"repobilityId": "5f1fbabb13f81831", "scanner": "scanner-primary", "fingerprint": "b8aafa8fc91ddc34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95a9687bb09a655e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/books/_components/txn-row.tsx:55"}, "properties": {"repobilityId": "f4c352fdde4fc06f", "scanner": "scanner-primary", "fingerprint": "95a9687bb09a655e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4cdd173ce7616c1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/activity/page.tsx:203"}, "properties": {"repobilityId": "6b34862bd8a9d96d", "scanner": "scanner-primary", "fingerprint": "4cdd173ce7616c1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d38815a29fc519c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/unattributed-income.tsx:100"}, "properties": {"repobilityId": "7058ea911ac2e0b6", "scanner": "scanner-primary", "fingerprint": "d38815a29fc519c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbd126312edb03c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/_components/envelopes-card.tsx:185"}, "properties": {"repobilityId": "d83db482c1430447", "scanner": "scanner-primary", "fingerprint": "cbd126312edb03c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0578a68aff834d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:210"}, "properties": {"repobilityId": "a2a44f5c649a2fd7", "scanner": "scanner-primary", "fingerprint": "b0578a68aff834d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2893d9513b6147c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/movement/activity-card.tsx:61"}, "properties": {"repobilityId": "9fb532b648d7a838", "scanner": "scanner-primary", "fingerprint": "2893d9513b6147c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-146268ddf60845cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(authenticated)/tower/_components/city-pane.tsx:48"}, "properties": {"repobilityId": "706730ca536810b7", "scanner": "scanner-primary", "fingerprint": "146268ddf60845cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-298284e4625844bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(public)/parts.tsx:47"}, "properties": {"repobilityId": "9ec5dd86a0de7f91", "scanner": "scanner-primary", "fingerprint": "298284e4625844bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06db9629f64f86de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/timing.ts:52"}, "properties": {"repobilityId": "c34d45d1b171e73c", "scanner": "scanner-primary", "fingerprint": "06db9629f64f86de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2ccd0689db53c7d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:80"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "a2ccd0689db53c7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-596449c2dd150c12", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/global-error.tsx:36"}, "properties": {"repobilityId": "b04e7395e70f9116", "scanner": "scanner-primary", "fingerprint": "596449c2dd150c12", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/global-error.tsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-421fd63f7d898116", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:18"}, "properties": {"repobilityId": "7c8e268f4e944077", "scanner": "scanner-primary", "fingerprint": "421fd63f7d898116", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/_shared/cors.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-e8bfd446a7b2298e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/scheduler/index.html:371"}, "properties": {"repobilityId": "d2eb77bfff8ac882", "scanner": "scanner-primary", "fingerprint": "e8bfd446a7b2298e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mockups/scheduler/index.html"}, "region": {"startLine": 371}}}]}, {"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": "e62db05b492f8883", "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": "7e8d9c9101007245", "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": "7d67e440ad085b65", "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": "eeb7c3045759b73b", "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": "05c53d9f6c1c611f", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "18ada76ea11baaec", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "de46ae2ca31d0a41", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "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-450eda2c24b0b238", "level": "none", "message": {"text": "Commented-code block (5 lines) in middleware.ts:74"}, "properties": {"repobilityId": "113c267f35fc6e47", "scanner": "scanner-primary", "fingerprint": "450eda2c24b0b238", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6cfbfe2c4efea701", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.ts:8"}, "properties": {"repobilityId": "d6df206be1ad2af9", "scanner": "scanner-primary", "fingerprint": "6cfbfe2c4efea701", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03565ed22a18b39a", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/replay-accept-as-test.mjs:7"}, "properties": {"repobilityId": "24bdc1b5de497a52", "scanner": "scanner-primary", "fingerprint": "03565ed22a18b39a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b2ef5399c39d48d", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/verify-client-projects.mjs:6"}, "properties": {"repobilityId": "6e221f513b270109", "scanner": "scanner-primary", "fingerprint": "8b2ef5399c39d48d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2f896135c3043df", "level": "none", "message": {"text": "Commented-code block (25 lines) in scripts/smoke-test-create-invitation.mjs:15"}, "properties": {"repobilityId": "372d3d25afd8563b", "scanner": "scanner-primary", "fingerprint": "d2f896135c3043df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50c21aa5697b45bf", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/verify-6-4b-2-ledger-tiles.mjs:4"}, "properties": {"repobilityId": "7c08934df80b32a9", "scanner": "scanner-primary", "fingerprint": "50c21aa5697b45bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e9aba5580a3991d", "level": "none", "message": {"text": "Commented-code block (12 lines) in scripts/verify-scheduler.mjs:7"}, "properties": {"repobilityId": "7c3a104e95660804", "scanner": "scanner-primary", "fingerprint": "2e9aba5580a3991d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-564b43860a8dbb3b", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/verify-estimate-write-path.mjs:6"}, "properties": {"repobilityId": "99f9c21dc63e2797", "scanner": "scanner-primary", "fingerprint": "564b43860a8dbb3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e84c6733e83f72e", "level": "none", "message": {"text": "Commented-code block (15 lines) in scripts/verify-trade-taxonomy.mjs:9"}, "properties": {"repobilityId": "adfaf24e6a9a6120", "scanner": "scanner-primary", "fingerprint": "1e84c6733e83f72e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3b5c14826cd4d6a", "level": "none", "message": {"text": "Commented-code block (14 lines) in scripts/verify-change-orders.mjs:4"}, "properties": {"repobilityId": "cef12878afa41128", "scanner": "scanner-primary", "fingerprint": "f3b5c14826cd4d6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2e8216281525356", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/verify-6-4b-1-payments.mjs:4"}, "properties": {"repobilityId": "21231702e0f8bacc", "scanner": "scanner-primary", "fingerprint": "a2e8216281525356", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d31f840a7f25302", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/diagnose-cross-user-accept.mjs:4"}, "properties": {"repobilityId": "ce2a5dd1aa9732a8", "scanner": "scanner-primary", "fingerprint": "2d31f840a7f25302", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b7c3907ead00b04", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/verify-6-4c-daily-log.mjs:4"}, "properties": {"repobilityId": "0b5540e3ccad2b69", "scanner": "scanner-primary", "fingerprint": "2b7c3907ead00b04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc51d3b05c9c64a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/verify-6-4b-3-permits-documents.mjs:4"}, "properties": {"repobilityId": "fa685d4db803fc9e", "scanner": "scanner-primary", "fingerprint": "fc51d3b05c9c64a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11b809e015b75087", "level": "none", "message": {"text": "Commented-code block (10 lines) in scripts/verify-co-trade-set-inheritance.mjs:4"}, "properties": {"repobilityId": "7b792b53f7dc43c7", "scanner": "scanner-primary", "fingerprint": "11b809e015b75087", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a658b771046a69f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/sign/[token]/sign-action.ts:55"}, "properties": {"repobilityId": "13e4eb29ec4714a4", "scanner": "scanner-primary", "fingerprint": "8a658b771046a69f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efba6915be14148a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/layout.tsx:87"}, "properties": {"repobilityId": "30b967e6de3833f2", "scanner": "scanner-primary", "fingerprint": "efba6915be14148a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-924d9b219013534f", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/actions.ts:78"}, "properties": {"repobilityId": "88d15d89450b7c46", "scanner": "scanner-primary", "fingerprint": "924d9b219013534f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf063dda2833fc46", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_actions/send-estimate-document.tsx:100"}, "properties": {"repobilityId": "18e8291430dc767e", "scanner": "scanner-primary", "fingerprint": "cf063dda2833fc46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-accde33c129dce77", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/[estimateId]/document/pdf/route.ts:61"}, "properties": {"repobilityId": "4ed837a35f9677e1", "scanner": "scanner-primary", "fingerprint": "accde33c129dce77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4603da486f551ed0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/line-item-editor.tsx:142"}, "properties": {"repobilityId": "374212606644a1e4", "scanner": "scanner-primary", "fingerprint": "4603da486f551ed0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bf422909388117a", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/estimates/_components/estimate-form.tsx:174"}, "properties": {"repobilityId": "c2859c0f03174e0e", "scanner": "scanner-primary", "fingerprint": "5bf422909388117a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ff5ff1b25b61cdc", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/page.tsx:176"}, "properties": {"repobilityId": "348022706b36f31b", "scanner": "scanner-primary", "fingerprint": "2ff5ff1b25b61cdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41f57da8687a1342", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/[projectId]/change-orders/new/page.tsx:55"}, "properties": {"repobilityId": "84ba836850416160", "scanner": "scanner-primary", "fingerprint": "41f57da8687a1342", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e1b6501291d09ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/labor-entry-form.tsx:161"}, "properties": {"repobilityId": "17fa3908a567a718", "scanner": "scanner-primary", "fingerprint": "0e1b6501291d09ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e882d30e32288f4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/projects/_components/payment-form.tsx:202"}, "properties": {"repobilityId": "e1218f0ec1e2a217", "scanner": "scanner-primary", "fingerprint": "e882d30e32288f4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5d21ad6bc24c61c", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/businesses/[id]/desk/_components/home-wizard.tsx:166"}, "properties": {"repobilityId": "98a7628f3dafc109", "scanner": "scanner-primary", "fingerprint": "b5d21ad6bc24c61c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a22cadae72eb7353", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/desk/people/_components/client-detail-form.tsx:48"}, "properties": {"repobilityId": "dcacbce5bdf47171", "scanner": "scanner-primary", "fingerprint": "a22cadae72eb7353", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a093c2bb71b767e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(authenticated)/businesses/[id]/finance/page.tsx:138"}, "properties": {"repobilityId": "7aa1860d69c9492d", "scanner": "scanner-primary", "fingerprint": "a093c2bb71b767e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c382bb197da3193b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/page.tsx:73"}, "properties": {"repobilityId": "49925fab19fc1366", "scanner": "scanner-primary", "fingerprint": "c382bb197da3193b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f3b9817c09462d53", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/layout.tsx:56"}, "properties": {"repobilityId": "f32f2f06174f97b8", "scanner": "scanner-primary", "fingerprint": "f3b9817c09462d53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afa8889aec3f897b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(authenticated)/businesses/[id]/finance/books/page.tsx:22"}, "properties": {"repobilityId": "ae84faa45f94f72e", "scanner": "scanner-primary", "fingerprint": "afa8889aec3f897b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47fcd8c5b309ad3f", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/(authenticated)/businesses/[id]/finance/invoices/new/page.tsx:114"}, "properties": {"repobilityId": "f04b09559e169c8f", "scanner": "scanner-primary", "fingerprint": "47fcd8c5b309ad3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17568afe24b6dc64", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(authenticated)/dev/invites/create-invitation-form.tsx:76"}, "properties": {"repobilityId": "d7825785c1678418", "scanner": "scanner-primary", "fingerprint": "17568afe24b6dc64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c09d3e2e528fd548", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/i/[token]/page.tsx:138"}, "properties": {"repobilityId": "40e49b436dd63ae3", "scanner": "scanner-primary", "fingerprint": "c09d3e2e528fd548", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c69a5d1a16fb71f5", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/i/[token]/_actions/lobby.ts:169"}, "properties": {"repobilityId": "6747e7d87a75ea64", "scanner": "scanner-primary", "fingerprint": "c69a5d1a16fb71f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37248bb14bf9f6e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/i/[token]/_components/lobby.tsx:76"}, "properties": {"repobilityId": "1aa7e9c39b661b34", "scanner": "scanner-primary", "fingerprint": "37248bb14bf9f6e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f66ce72c8a3d3426", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(auth)/auth/callback/route.ts:75"}, "properties": {"repobilityId": "9eb4f28e7d29f6e6", "scanner": "scanner-primary", "fingerprint": "f66ce72c8a3d3426", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bd1cdb0f6e52880", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(auth)/login/page.tsx:27"}, "properties": {"repobilityId": "962c8a2fa583b8ae", "scanner": "scanner-primary", "fingerprint": "0bd1cdb0f6e52880", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72f1b22cd4ca08e6", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/desk/client-document.ts:56"}, "properties": {"repobilityId": "e94c6cff99d975f8", "scanner": "scanner-primary", "fingerprint": "72f1b22cd4ca08e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed46457da61692b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/desk/rooms.ts:120"}, "properties": {"repobilityId": "60120accbdc7a29f", "scanner": "scanner-primary", "fingerprint": "ed46457da61692b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c923bc3a02f3e504", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/desk/crew.ts:239"}, "properties": {"repobilityId": "bd7c0570035a3e03", "scanner": "scanner-primary", "fingerprint": "c923bc3a02f3e504", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa8356b8a901e7ed", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/desk/trade-sets.ts:597"}, "properties": {"repobilityId": "b6a39f39fe08ac41", "scanner": "scanner-primary", "fingerprint": "aa8356b8a901e7ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eba06dccefd5f57e", "level": "none", "message": {"text": "Commented-code block (10 lines) in lib/desk/financials.ts:141"}, "properties": {"repobilityId": "940b3f68ce2a24f1", "scanner": "scanner-primary", "fingerprint": "eba06dccefd5f57e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d89813d8d07d436a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/finance/invoices.test.ts:145"}, "properties": {"repobilityId": "0cf5edec5d83841b", "scanner": "scanner-primary", "fingerprint": "d89813d8d07d436a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70d76dd3450e5c54", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/finance/ledger.ts:59"}, "properties": {"repobilityId": "3a262ddae48edcac", "scanner": "scanner-primary", "fingerprint": "70d76dd3450e5c54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1763b37328e05057", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/movement/activity.ts:10"}, "properties": {"repobilityId": "bf3ecc1f073d16b0", "scanner": "scanner-primary", "fingerprint": "1763b37328e05057", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51ab37ffea85afa7", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/accept_invitation/index.ts:3"}, "properties": {"repobilityId": "7236e349419c3faf", "scanner": "scanner-primary", "fingerprint": "51ab37ffea85afa7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}