{"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_unresolved_feedback", "name": "Foundry mined unresolved feedback: TwuanMinn/furnzaa", "shortDescription": {"text": "Foundry mined unresolved feedback: TwuanMinn/furnzaa"}, "fullDescription": {"text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: TwuanMinn/furnzaa", "shortDescription": {"text": "Foundry mined blueprint gap alignment: TwuanMinn/furnzaa"}, "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: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\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: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding"}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_schema_ui_api_gap", "name": "Foundry mined schema ui api mismatch: TwuanMinn/furnzaa", "shortDescription": {"text": "Foundry mined schema ui api mismatch: TwuanMinn/furnzaa"}, "fullDescription": {"text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'thread_touches_file': 42, 'comment"}, "properties": {"scanner": "foundry_dataset", "category": "quality", "severity": "high", "confidence": 0.76, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: TwuanMinn/furnzaa", "shortDescription": {"text": "Foundry mined bad chains: TwuanMinn/furnzaa"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 3\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 42\nLabels: {'data_schema_persistence': 2, 'deployment_env_gap': 1}\nPolarities: {'bad': 3}\nChanged file labels: {'ui_or_frontend': 31, 'api_or_backend': 7, 'schema_or_data': 4}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-ebe78e0b41fe1d2d\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"dat"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "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-75f5d1c12fe2e61b", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:116"}, "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-8f91644dc21928f4", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-bulk.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-bulk.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ca5ac1d78a7d926", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/import-dialog.tsx:388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/import-dialog.tsx:388"}, "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-55433f00af8c0095", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/data-table-filters.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/data-table-filters.tsx:173"}, "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-d25a141d1e695cf5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-topbar.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-topbar.tsx:74"}, "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-a7e39a47537bec4e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-sidebar.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-sidebar.tsx:201"}, "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-afde8cddab6177ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/notification-bell.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/notification-bell.tsx:157"}, "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-13766f6bcc41a680", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/mobile-nav.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/mobile-nav.tsx:84"}, "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-8cd364e2daf76776", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/board.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/board.tsx:237"}, "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-84b4a0a78c7b11bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/timeline.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/timeline.tsx:271"}, "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-7cfa793eb8a10546", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/users/users-table.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/users/users-table.tsx:311"}, "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-fe8bac89f051eda8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form.tsx:350", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form.tsx:350"}, "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-4ee393c32c6b8100", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/orders-table.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/orders-table.tsx:215"}, "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-7db8f65823a1b290", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form-parts.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form-parts.tsx:145"}, "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-785203536fe7eb28", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-lookup.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-lookup.tsx:127"}, "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-afec122783b324c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/[id]/model-file-list.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/[id]/model-file-list.tsx:38"}, "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-6c518f123dec6475", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/analytics/analytics-client.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/analytics/analytics-client.tsx:217"}, "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-d89a0290cd11c1db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/activity/activity-table.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/activity/activity-table.tsx:70"}, "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-f6feb24d855e74c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/page.tsx:225"}, "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-b460c3752ba8db2d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/now-printing.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/now-printing.tsx:277"}, "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-ce6368e444910d62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/trending/trending-client.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/trending/trending-client.tsx:260"}, "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-4eaf4274088044bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/marketing/campaigns-tab.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/marketing/campaigns-tab.tsx:79"}, "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-1c093b6553a11baa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/poll-card.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/poll-card.tsx:189"}, "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-8d06814834c28218", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/advanced-dialogs.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/advanced-dialogs.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8a5a292e6c6388c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/chat-thread.tsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/chat-thread.tsx:410"}, "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-d30e1fa3d412f5cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-dialogs.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-dialogs.tsx:129"}, "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-58769507feb4207c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-client.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-client.tsx:253"}, "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-6944a07c7c7bf228", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/crm/customers-tab.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/crm/customers-tab.tsx:86"}, "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-ed537cc037088088", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:461", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:461"}, "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-39684c39fecefdc8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/movements-tab.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/movements-tab.tsx:51"}, "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-43648a88aa525ef9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/line-item-row.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/line-item-row.tsx:44"}, "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-21039f01f27e18a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/products-tab.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/products-tab.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-756e504fdaa60c7a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/production-tab.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/production-tab.tsx:92"}, "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-4967ad1ffd9e2ab0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-history.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-history.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fb15668cce47435", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-client.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-client.tsx:292"}, "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-d95eacecfe9cdcee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-result.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-result.tsx:84"}, "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-05d27c43cc793130", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-sharing.tsx:404", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-sharing.tsx:404"}, "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-8fb16e85440036b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:353", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:353"}, "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-82e7005bd3f49380", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-detail.tsx:757", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-detail.tsx:757"}, "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-9d8e1aa478a3823f", "name": "Possible secret in scripts/seed.ts", "shortDescription": {"text": "Possible secret in scripts/seed.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e7dac3f8a1f87948", "name": "Very large file: src/lib/supabase/database.types.ts (5667 lines)", "shortDescription": {"text": "Very large file: src/lib/supabase/database.types.ts (5667 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 303 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 23 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 147 placeholder/mock markers across 58 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-014d9299ca70eb14", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/activity-heatmap.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/activity-heatmap.tsx:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42af2f4a7747cfcd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/datatable/import-dialog.tsx:198", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/datatable/import-dialog.tsx:198"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7929005191add039", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/app-sidebar.tsx:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/app-sidebar.tsx:117"}, "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-5044cf55a06723d2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/notification-bell.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/notification-bell.tsx:43"}, "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-c5bc4f5b3557652c", "name": "Commented-code block (5 lines) in src/app/api/cron/route.ts:69", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/route.ts:69"}, "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-acce5bae295409cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/schedule/schedule-client.tsx:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/schedule/schedule-client.tsx:85"}, "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-6c5312d824d1c79f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-tasks.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-tasks.tsx:68"}, "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-700ca1b43adf5dcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-performance.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-performance.tsx:24"}, "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-0e9ecd6ebb113104", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/users-table.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/users-table.tsx:106"}, "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-3785bead09dbfa60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/notifications/notifications-center.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/notifications/notifications-center.tsx:43"}, "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-c407e551d1f52591", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/orders-table.tsx:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/orders-table.tsx:162"}, "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-39a237ce8f1e8928", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/customers/[id]/customer-orders-list.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/customers/[id]/customer-orders-list.tsx:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec37617decbbe424", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/analytics/analytics-client.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/analytics/analytics-client.tsx:82"}, "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-9e8bc653d8ec4985", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/chat-thread.tsx:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/chat-thread.tsx:151"}, "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-0afad6278c37b9e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/messages-client.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/messages-client.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5651cd4b74e1c0a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:76"}, "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-e0f666785945a441", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/production-tab.tsx:349", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/production-tab.tsx:349"}, "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-f360eab8df34598c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profit/profit-client.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profit/profit-client.tsx:53"}, "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-352c1b0809fc19e7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9195443e2bf9e13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/datatable/use-data-table.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/datatable/use-data-table.ts:68"}, "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-df61b291d97b8426", "name": "Commented-code block (5 lines) in src/lib/rbac/guards.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rbac/guards.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-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `E2E_ADMIN_EMAIL`, `E2E_ADMIN_PASSWORD`, `E2E_BASE_URL`, `NEXT_DIST_DIR`, `NODE_ENV`. 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/21773"}, "properties": {"repository": "TwuanMinn/furnzaa", "repoUrl": "https://github.com/TwuanMinn/furnzaa", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: TwuanMinn/furnzaa"}, "properties": {"repobilityId": 361781, "scanner": "foundry_dataset", "fingerprint": "494511e2b03c8ea56596250ff490e3af490d8f3851aaf221c449ef429e8904a9", "category": "practices", "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 without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"api_or_backend": 7, "schema_or_data": 4, "ui_or_frontend": 31, "deployment_env_gap": 1, "data_schema_persistence": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 10}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 119, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 42, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 7, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 3, "comment_chain_touches_file": 36, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 62, "node_types": {"repo": 1, "thread": 1, "comment": 3, "pr_file": 42, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 7, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "TwuanMinn/furnzaa#1", "issue_number": "1", "quality_tiers": {"unresolved": 5, "assumption_check": 2}, "repo_full_name": "TwuanMinn/furnzaa", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-7ec3aed5e8958103", "graph_gold_label": "assumption_check", "changed_file_labels": {"api_or_backend": 42, "schema_or_data": 24, "ui_or_frontend": 186}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'thread_touches_file': 42, 'comment_chain_touches_file': 36, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 7, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 31, 'api_or_backend': 7, 'not_resolved_or_not_observed': 5, 'schema_or_data': 4, 'human_reported_issue_no_linked_fix': 3, 'data_schema_persistence': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'deployment_env_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10}\nQuality tiers: {'unresolved': 5, 'assumption_check': 2}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/TwuanMinn/furnzaa", "source_id": "graph-query-motif_query-911b2d014913db70", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "TwuanMinn/furnzaa", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: TwuanMinn/furnzaa"}, "properties": {"repobilityId": 345540, "scanner": "foundry_dataset", "fingerprint": "27956152d29594318943a53de3a7243245d3b4928e698caf91cced409889f6a0", "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": {"api_or_backend": 7, "schema_or_data": 4, "ui_or_frontend": 31, "deployment_env_gap": 1, "data_schema_persistence": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 10}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 119, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 42, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 7, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 3, "comment_chain_touches_file": 36, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 62, "node_types": {"repo": 1, "thread": 1, "comment": 3, "pr_file": 42, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 7, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "TwuanMinn/furnzaa#1", "issue_number": "1", "quality_tiers": {"unresolved": 5, "assumption_check": 2}, "repo_full_name": "TwuanMinn/furnzaa", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-151135990cc83b45", "graph_gold_label": "assumption_check", "changed_file_labels": {"api_or_backend": 42, "schema_or_data": 24, "ui_or_frontend": 186}}, "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: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\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: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'thread_touches_file': 42, 'comment_chain_touches_file': 36, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 7, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 31, 'api_or_backend': 7, 'not_resolved_or_not_observed': 5, 'schema_or_data': 4, 'human_reported_issue_no_linked_fix': 3, 'data_schema_persistence': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'deployment_env_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10}\nQuality tiers: {'unresolved': 5, 'assumption_check': 2}\nCI labels: {}\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/TwuanMinn/furnzaa", "source_id": "graph-query-motif_query-4b54a2f68d330a86", "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": "TwuanMinn/furnzaa", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_schema_ui_api_gap", "level": "error", "message": {"text": "Foundry mined schema ui api mismatch: TwuanMinn/furnzaa"}, "properties": {"repobilityId": 328442, "scanner": "foundry_dataset", "fingerprint": "851222707cadbb6e953d6cffe1991d4510ed37e8124a53ed875c4307fe2b2e1c", "category": "quality", "severity": "high", "confidence": 0.76, "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": "Schema, UI, and API mismatch", "intent": "Assumption-check examples for data-path consistency across layers.", "labels": {"api_or_backend": 7, "schema_or_data": 4, "ui_or_frontend": 31, "deployment_env_gap": 1, "data_schema_persistence": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "schema_ui_api_mismatch", "outcomes": {"not_resolved_or_not_observed": 10}, "polarity": "bad", "query_id": "schema_ui_api_mismatch", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 119, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 42, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 7, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 3, "comment_chain_touches_file": 36, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 62, "node_types": {"repo": 1, "thread": 1, "comment": 3, "pr_file": 42, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 7, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "TwuanMinn/furnzaa#1", "issue_number": "1", "quality_tiers": {"unresolved": 5, "assumption_check": 2}, "repo_full_name": "TwuanMinn/furnzaa", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-dba124b6401c9d07", "graph_gold_label": "assumption_check", "changed_file_labels": {"api_or_backend": 42, "schema_or_data": 24, "ui_or_frontend": 186}}, "text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: assumption_check\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nIssue/PR number: 1\nGraph consistency label: assumption_check\nNodes: 62\nEdges: 119\nNode types: {'pr_file': 42, 'link_quality': 7, 'comment': 3, 'comment_chain': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'thread_touches_file': 42, 'comment_chain_touches_file': 36, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 7, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 31, 'api_or_backend': 7, 'not_resolved_or_not_observed': 5, 'schema_or_data': 4, 'human_reported_issue_no_linked_fix': 3, 'data_schema_persistence': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'deployment_env_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10}\nQuality tiers: {'unresolved': 5, 'assumption_check': 2}\nCI labels: {}\nCurriculum targets:\n- Create schema-to-API-to-UI consistency tasks with migrations and tests.\n- Teach models to verify persistence, route contracts, and UI state together.\nAssumption checks:\n- Do schema changes have matching API and UI handling?\n- Are migrations and tests present for the data path?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/TwuanMinn/furnzaa", "source_id": "graph-query-motif_query-0e4f0a34239f06f4", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/schema_ui_api_mismatch/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "TwuanMinn/furnzaa", "source_dataset": "graph_queries/schema_ui_api_mismatch", "training_usage": "assumption_check"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: TwuanMinn/furnzaa"}, "properties": {"repobilityId": 316677, "scanner": "foundry_dataset", "fingerprint": "ca3203a03cb174d4c27520c4957ee0cb0f5c502ba462137f27cc05a332f709ac", "category": "practices", "severity": "high", "confidence": 0.84, "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": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "bad_chains", "synthetic": false, "thread_key": "TwuanMinn/furnzaa#1", "human_labels": ["api_or_backend", "data_schema_persistence", "deployment_env_gap", "schema_or_data", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_without_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.0, "repo_full_name": "TwuanMinn/furnzaa", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-31c8f1f484af133f", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 1, "docs": 1, "schemas": 4, "routes_api": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 42, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 7, "schema_or_data": 4, "ui_or_frontend": 31}, "linked_commit_count": 0, "helicopter_view_count": 4, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_unresolved", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 5, "design_schema_api_artifact_count": 6}, "text": "Comment chain pattern product: bad_chains\nRepo: TwuanMinn/furnzaa\nThread: TwuanMinn/furnzaa#1\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: TwuanMinn/furnzaa#1\nRepo: TwuanMinn/furnzaa\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 3\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 42\nLabels: {'data_schema_persistence': 2, 'deployment_env_gap': 1}\nPolarities: {'bad': 3}\nChanged file labels: {'ui_or_frontend': 31, 'api_or_backend': 7, 'schema_or_data': 4}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-ebe78e0b41fe1d2d\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"data_schema_persistence\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/TwuanMinn/furnzaa/pull/1\",\n    \"text\": \"GitHub feedback: data_schema_persistence\\nPolarity: bad\\nKind: pull_request_body\\nRepo: TwuanMinn/furnzaa\\nAuthor: TwuanMinn (User)\\nURL: https://github.com/TwuanMinn/furnzaa/pull/1\\nTitle: Add Payroll module (Module 16) + polish ROI/Payroll dashboard UI\\nBody:\\n## What changed\\n\\n### Payroll \u2014 Module 16 (new)\\nThe most access-sensitive module in the app (salaries + personal data). **Admins** (`payroll.view_all`) get the full module; **staff** (`payroll.view_own`) get a self-service *My Payslips* view \u2014 enforced server-side **and** via RLS.\\n\\n- **Schema** (`0038_payroll.sql`): `employees`, `departments`, effective-dated `salary_structures`, `attendance_records`, `payroll_runs`, immutable `payroll_items` snapshots, `payslips`, `payroll_monthly_rollup`, plus `tax_profiles` / `employer_contribution_profiles` config tables.\\n- **Run lifecycle** Draft -> Calculated -> Approved -> Paid -> Closed with distinct permission gates (`payroll.run` / `payroll.approve` / `payroll.pay`). Approved items are immutable; corrections go through adjustment runs. Every transition is activity-logged at elevated severity; bank/pay details masked.\\n- **Salary-cost analytics** from the cached monthly rollup + materialized\"\n  },\n  {\n    \"id\": \"github-feedback-comment-e74244cfab0f86f4\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/TwuanMinn/furnzaa/pull/1#issuecomment-4736178199\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: TwuanMinn/furnzaa\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/TwuanMinn/furnzaa/pull/1#issuecomment-4736178199\\nTitle: \\nBody:\\n[vc]: #4RuHMRJnWxKjVCQG/+66LOVfhGFygngFxQSNyD7NdAI=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJmdXJuemFhIiwicHJvamVjdElkIjoicHJqX2VHRFVXa0VlcX\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/TwuanMinn/furnzaa", "source_id": "comment-chain-pattern-bad_chains-607af3a74dbc3e6a", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/bad_chains/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "TwuanMinn/furnzaa", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"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-75f5d1c12fe2e61b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:116"}, "properties": {"repobilityId": "6b45b8d4fff61a2c", "scanner": "scanner-primary", "fingerprint": "75f5d1c12fe2e61b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f91644dc21928f4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-bulk.ts:50"}, "properties": {"repobilityId": "6009ac1c5dee95f2", "scanner": "scanner-primary", "fingerprint": "8f91644dc21928f4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4ca5ac1d78a7d926", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/import-dialog.tsx:388"}, "properties": {"repobilityId": "a302e93b9503d350", "scanner": "scanner-primary", "fingerprint": "4ca5ac1d78a7d926", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55433f00af8c0095", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/datatable/data-table-filters.tsx:173"}, "properties": {"repobilityId": "aeb942e6f44de9e8", "scanner": "scanner-primary", "fingerprint": "55433f00af8c0095", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d25a141d1e695cf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-topbar.tsx:74"}, "properties": {"repobilityId": "a54d1959bafa37f4", "scanner": "scanner-primary", "fingerprint": "d25a141d1e695cf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7e39a47537bec4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/app-sidebar.tsx:201"}, "properties": {"repobilityId": "686754754d6347f0", "scanner": "scanner-primary", "fingerprint": "a7e39a47537bec4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afde8cddab6177ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/notification-bell.tsx:157"}, "properties": {"repobilityId": "a7673793adbac611", "scanner": "scanner-primary", "fingerprint": "afde8cddab6177ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13766f6bcc41a680", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shell/mobile-nav.tsx:84"}, "properties": {"repobilityId": "c326d1e99a217b11", "scanner": "scanner-primary", "fingerprint": "13766f6bcc41a680", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cd364e2daf76776", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/board.tsx:237"}, "properties": {"repobilityId": "c4bf9570b1d9e23c", "scanner": "scanner-primary", "fingerprint": "8cd364e2daf76776", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84b4a0a78c7b11bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/schedule/timeline.tsx:271"}, "properties": {"repobilityId": "5c0ec4c66dcab6a2", "scanner": "scanner-primary", "fingerprint": "84b4a0a78c7b11bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7cfa793eb8a10546", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/users/users-table.tsx:311"}, "properties": {"repobilityId": "62062810902f868e", "scanner": "scanner-primary", "fingerprint": "7cfa793eb8a10546", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe8bac89f051eda8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form.tsx:350"}, "properties": {"repobilityId": "26a0b52a5a8e05a1", "scanner": "scanner-primary", "fingerprint": "fe8bac89f051eda8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ee393c32c6b8100", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/orders-table.tsx:215"}, "properties": {"repobilityId": "40c4e968499e165c", "scanner": "scanner-primary", "fingerprint": "4ee393c32c6b8100", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7db8f65823a1b290", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-form-parts.tsx:145"}, "properties": {"repobilityId": "fc79173469dda6b5", "scanner": "scanner-primary", "fingerprint": "7db8f65823a1b290", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-785203536fe7eb28", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/order-lookup.tsx:127"}, "properties": {"repobilityId": "03d4654d49b35fdd", "scanner": "scanner-primary", "fingerprint": "785203536fe7eb28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afec122783b324c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/orders/[id]/model-file-list.tsx:38"}, "properties": {"repobilityId": "387e61eeb21e7113", "scanner": "scanner-primary", "fingerprint": "afec122783b324c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c518f123dec6475", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/analytics/analytics-client.tsx:217"}, "properties": {"repobilityId": "cd0ac4e489374977", "scanner": "scanner-primary", "fingerprint": "6c518f123dec6475", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d89a0290cd11c1db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/activity/activity-table.tsx:70"}, "properties": {"repobilityId": "e21f5bc1476eeb6f", "scanner": "scanner-primary", "fingerprint": "d89a0290cd11c1db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6feb24d855e74c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/page.tsx:225"}, "properties": {"repobilityId": "db6f056db41a6a3d", "scanner": "scanner-primary", "fingerprint": "f6feb24d855e74c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b460c3752ba8db2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/now-printing.tsx:277"}, "properties": {"repobilityId": "6800941afc340647", "scanner": "scanner-primary", "fingerprint": "b460c3752ba8db2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce6368e444910d62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/trending/trending-client.tsx:260"}, "properties": {"repobilityId": "f308edffa6ca3aed", "scanner": "scanner-primary", "fingerprint": "ce6368e444910d62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4eaf4274088044bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/marketing/campaigns-tab.tsx:79"}, "properties": {"repobilityId": "c8fb9c4d09ac7b53", "scanner": "scanner-primary", "fingerprint": "4eaf4274088044bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c093b6553a11baa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/poll-card.tsx:189"}, "properties": {"repobilityId": "70c7ea5a3093c3d9", "scanner": "scanner-primary", "fingerprint": "1c093b6553a11baa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d06814834c28218", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/advanced-dialogs.tsx:115"}, "properties": {"repobilityId": "4116c15fbcd53b7c", "scanner": "scanner-primary", "fingerprint": "8d06814834c28218", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8a5a292e6c6388c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/chat-thread.tsx:410"}, "properties": {"repobilityId": "e9b84da6bcc40e9f", "scanner": "scanner-primary", "fingerprint": "a8a5a292e6c6388c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d30e1fa3d412f5cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-dialogs.tsx:129"}, "properties": {"repobilityId": "e9d390db7ee49f22", "scanner": "scanner-primary", "fingerprint": "d30e1fa3d412f5cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58769507feb4207c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/messages/messages-client.tsx:253"}, "properties": {"repobilityId": "06a0a9b76ccb1b0b", "scanner": "scanner-primary", "fingerprint": "58769507feb4207c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6944a07c7c7bf228", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/crm/customers-tab.tsx:86"}, "properties": {"repobilityId": "75694e278f766d13", "scanner": "scanner-primary", "fingerprint": "6944a07c7c7bf228", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed537cc037088088", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:461"}, "properties": {"repobilityId": "bcbdc9274e2d0a07", "scanner": "scanner-primary", "fingerprint": "ed537cc037088088", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39684c39fecefdc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/movements-tab.tsx:51"}, "properties": {"repobilityId": "94800c313ce5f10b", "scanner": "scanner-primary", "fingerprint": "39684c39fecefdc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43648a88aa525ef9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/line-item-row.tsx:44"}, "properties": {"repobilityId": "8e6bd9e3aeab842d", "scanner": "scanner-primary", "fingerprint": "43648a88aa525ef9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21039f01f27e18a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/products-tab.tsx:83"}, "properties": {"repobilityId": "33d20cd910c3ec4e", "scanner": "scanner-primary", "fingerprint": "21039f01f27e18a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-756e504fdaa60c7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/products/production-tab.tsx:92"}, "properties": {"repobilityId": "5d8cdcd3b79258c7", "scanner": "scanner-primary", "fingerprint": "756e504fdaa60c7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4967ad1ffd9e2ab0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-history.tsx:186"}, "properties": {"repobilityId": "dc4d42ff86e51ef1", "scanner": "scanner-primary", "fingerprint": "4967ad1ffd9e2ab0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fb15668cce47435", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-client.tsx:292"}, "properties": {"repobilityId": "b5dfc72397a3333b", "scanner": "scanner-primary", "fingerprint": "1fb15668cce47435", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d95eacecfe9cdcee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/calc-result.tsx:84"}, "properties": {"repobilityId": "f82fe1ae7c7bb02e", "scanner": "scanner-primary", "fingerprint": "d95eacecfe9cdcee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05d27c43cc793130", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/profit/profit-sharing.tsx:404"}, "properties": {"repobilityId": "c235f551bef37354", "scanner": "scanner-primary", "fingerprint": "05d27c43cc793130", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8fb16e85440036b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:353"}, "properties": {"repobilityId": "26c3381c22566cfb", "scanner": "scanner-primary", "fingerprint": "8fb16e85440036b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82e7005bd3f49380", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/feedback/feedback-detail.tsx:757"}, "properties": {"repobilityId": "e7cab835d3a48069", "scanner": "scanner-primary", "fingerprint": "82e7005bd3f49380", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d8e1aa478a3823f", "level": "error", "message": {"text": "Possible secret in scripts/seed.ts"}, "properties": {"repobilityId": "f1efef63b3b25e1b", "scanner": "scanner-primary", "fingerprint": "9d8e1aa478a3823f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-e7dac3f8a1f87948", "level": "note", "message": {"text": "Very large file: src/lib/supabase/database.types.ts (5667 lines)"}, "properties": {"repobilityId": "c51b24ca1b48a39c", "scanner": "scanner-primary", "fingerprint": "e7dac3f8a1f87948", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "8be4bb107d177396", "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": "ee87bc2c428ee71f", "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": "775617e1ff0d27e1", "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": "b0429d05641a74f4", "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": "c921c11892d17eb9", "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": "ce7af41c5c7b4987", "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": "551eeb8b9598d79e", "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-014d9299ca70eb14", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/activity-heatmap.tsx:32"}, "properties": {"repobilityId": "a821fdacb5db52ca", "scanner": "scanner-primary", "fingerprint": "014d9299ca70eb14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42af2f4a7747cfcd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/datatable/import-dialog.tsx:198"}, "properties": {"repobilityId": "13279d16b1a7c067", "scanner": "scanner-primary", "fingerprint": "42af2f4a7747cfcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7929005191add039", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/app-sidebar.tsx:117"}, "properties": {"repobilityId": "e8dfbc1e376ec63d", "scanner": "scanner-primary", "fingerprint": "7929005191add039", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5044cf55a06723d2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shell/notification-bell.tsx:43"}, "properties": {"repobilityId": "090c99102b32cbd1", "scanner": "scanner-primary", "fingerprint": "5044cf55a06723d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5bc4f5b3557652c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/route.ts:69"}, "properties": {"repobilityId": "7be642c451a47746", "scanner": "scanner-primary", "fingerprint": "c5bc4f5b3557652c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-acce5bae295409cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/schedule/schedule-client.tsx:85"}, "properties": {"repobilityId": "79a8ca72f3847d08", "scanner": "scanner-primary", "fingerprint": "acce5bae295409cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c5312d824d1c79f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-tasks.tsx:68"}, "properties": {"repobilityId": "cc3b532909ae306f", "scanner": "scanner-primary", "fingerprint": "6c5312d824d1c79f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-700ca1b43adf5dcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/user-performance.tsx:24"}, "properties": {"repobilityId": "bff9f40c9dd8ba73", "scanner": "scanner-primary", "fingerprint": "700ca1b43adf5dcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e9ecd6ebb113104", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/users/users-table.tsx:106"}, "properties": {"repobilityId": "7c4fdbafb98d1450", "scanner": "scanner-primary", "fingerprint": "0e9ecd6ebb113104", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3785bead09dbfa60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/notifications/notifications-center.tsx:43"}, "properties": {"repobilityId": "81c80054d01aad8b", "scanner": "scanner-primary", "fingerprint": "3785bead09dbfa60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c407e551d1f52591", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/orders-table.tsx:162"}, "properties": {"repobilityId": "df4228248a36f4b6", "scanner": "scanner-primary", "fingerprint": "c407e551d1f52591", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39a237ce8f1e8928", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/orders/customers/[id]/customer-orders-list.tsx:38"}, "properties": {"repobilityId": "b4b4cd96962375cc", "scanner": "scanner-primary", "fingerprint": "39a237ce8f1e8928", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec37617decbbe424", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/analytics/analytics-client.tsx:82"}, "properties": {"repobilityId": "ae9372e38df61d30", "scanner": "scanner-primary", "fingerprint": "ec37617decbbe424", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e8bc653d8ec4985", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/chat-thread.tsx:151"}, "properties": {"repobilityId": "3deef398cd855141", "scanner": "scanner-primary", "fingerprint": "9e8bc653d8ec4985", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0afad6278c37b9e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/messages/messages-client.tsx:59"}, "properties": {"repobilityId": "59bce3184aa85c1d", "scanner": "scanner-primary", "fingerprint": "0afad6278c37b9e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5651cd4b74e1c0a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/purchase-orders-tab.tsx:76"}, "properties": {"repobilityId": "2773570f07380658", "scanner": "scanner-primary", "fingerprint": "5651cd4b74e1c0a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0f666785945a441", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/products/production-tab.tsx:349"}, "properties": {"repobilityId": "fa52062444f88bb8", "scanner": "scanner-primary", "fingerprint": "e0f666785945a441", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f360eab8df34598c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/profit/profit-client.tsx:53"}, "properties": {"repobilityId": "8c06622677353513", "scanner": "scanner-primary", "fingerprint": "f360eab8df34598c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-352c1b0809fc19e7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/feedback/feedback-analytics.tsx:59"}, "properties": {"repobilityId": "17a196fb13585d84", "scanner": "scanner-primary", "fingerprint": "352c1b0809fc19e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9195443e2bf9e13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/datatable/use-data-table.ts:68"}, "properties": {"repobilityId": "2d17eff73d41437b", "scanner": "scanner-primary", "fingerprint": "d9195443e2bf9e13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df61b291d97b8426", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rbac/guards.ts:55"}, "properties": {"repobilityId": "538f684f981f9c5d", "scanner": "scanner-primary", "fingerprint": "df61b291d97b8426", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}