{"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: zkznxk123-sys/don-doc", "shortDescription": {"text": "Foundry mined unresolved feedback: zkznxk123-sys/don-doc"}, "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: needs_more_evidence\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#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: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#1\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 14\nEdges: 24\nNode types: {'link_quality': 4, 'comment': 2, 'pr_file': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge ty"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: zkznxk123-sys/don-doc", "shortDescription": {"text": "Foundry mined bad chains: zkznxk123-sys/don-doc"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nOutcome: self_attested_unverified\nThread label: thread_has_human_issue_and_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_high_confidence, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: zkznxk123-sys/don-doc#2\nRepo: zkznxk123-sys/don-doc\nThread label: thread_has_human_issue_and_fix_context\nOutcome: self_attested_unverified\nComment count: 2\nLinked commit count: 2\nLinked CI commit count: 2\nLinked CI labels: {'ci_success_signal': 2}\nChanged file count: 3\nLabels: {'agent_instruction_gap': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'docs_or_claims': 2, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-4ccc77e1e786e470\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"a"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "cwe": "", "owasp": ""}}, {"id": "foundry_auth_guardrail_gap", "name": "Foundry mined security auth guardrail gaps: zkznxk123-sys/don-doc", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: zkznxk123-sys/don-doc"}, "fullDescription": {"text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: needs_more_evidence\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#1\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 14\nEdges: 24\nNode types: {'link_quality': 4, 'comment': 2, 'pr_file': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\n"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "foundry_fake_real_gap", "name": "Foundry mined mock as real or placeholder: zkznxk123-sys/don-doc", "shortDescription": {"text": "Foundry mined mock as real or placeholder: zkznxk123-sys/don-doc"}, "fullDescription": {"text": "Graph query export: Mock, sample, placeholder, or self-attested behavior treated as real\nQuery id: mock_as_real_or_placeholder\nQuery type: motif_query\nIntent: Hard negatives for fake completeness and missing real data paths.\nMotif: mock_as_real_or_placeholder\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nEvidence:\nGraph motif: Mock, sample, placeholder, or self-attested behavior treated as real\nMotif id: mock_as_real_or_placeholder\nPolarity: bad\nTraining usage: hard_negative\nSeverity: critical\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#2\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 17\nEdges: 32\nNode types: {'link_quality': 4, 'pr_file': 3, 'comment': 2, 'comment_chain': 2, '"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "critical", "confidence": 0.82, "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-45fd307088940332", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-holding.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-holding.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf59b4abdc8b50df", "name": "Stray `console.log` in TS/JS \u2014 scripts/list-pension-accounts.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/list-pension-accounts.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ada85933d3b77b0", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-demo-data.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-demo-data.ts:23"}, "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-051a9054c48ff6ca", "name": "Stray `console.log` in TS/JS \u2014 scripts/bulk-set-visibility.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-set-visibility.ts:42"}, "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-9cbf332b9d6f2ff7", "name": "Stray `console.log` in TS/JS \u2014 scripts/dedup-balance-change-logs.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dedup-balance-change-logs.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a13b8b5e0acaeb3d", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-account.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-account.ts:35"}, "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-5d2d6876b6ac4c2e", "name": "Stray `console.log` in TS/JS \u2014 scripts/donbora-fill.ts:255", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/donbora-fill.ts:255"}, "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-3b08971a052b866a", "name": "Stray `console.log` in TS/JS \u2014 scripts/delete-account.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-account.ts:39"}, "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-d5940405cedc5a22", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:13"}, "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-15ab08acb76c2903", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-categories.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-categories.ts:40"}, "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-8ac6a357cd031ba4", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:53"}, "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-52ce625069bc6e0a", "name": "Icon-only button without accessible name \u2014 components/layout/FamilyAction.tsx:80", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/layout/FamilyAction.tsx:80"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b42e6d271330f8fa", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/FamilyAction.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/FamilyAction.tsx:135"}, "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-8e64e8fff24c03d3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/AppSidebar.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/AppSidebar.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f479e09bd8a8f39", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/TopBar.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/TopBar.tsx:104"}, "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-e690e4d080eabcad", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-list.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-list.tsx:156"}, "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-0f098e3d893f8420", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/price-history-chart.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/price-history-chart.tsx:72"}, "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-042a754ca3d6d7d2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/real-estate-card.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/real-estate-card.tsx:39"}, "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-ccdaccd8ed3367ba", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/holding-drawer.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/holding-drawer.tsx:191"}, "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-9b86d1b45a11bbf2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/auto-cleanup-dialog.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/auto-cleanup-dialog.tsx:165"}, "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-46cb6fc4be477f04", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/recent-balance-changes.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/recent-balance-changes.tsx:89"}, "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-d34962a8e1d4f736", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-fundamentals.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-fundamentals.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbbcba3799dbc938", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-donut-chart.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-donut-chart.tsx:192"}, "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-93fd32e4abbfdfd8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/real-estate-tax-calc.tsx:398", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/real-estate-tax-calc.tsx:398"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00979e44214a655f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer.tsx:545", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer.tsx:545"}, "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-28f58c3c0a56c478", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-analysis.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-analysis.tsx:222"}, "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-d5525438d1ef09ba", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer/preview-components.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer/preview-components.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-c6ec36bdb08d2b02", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/KpiCard.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/KpiCard.tsx:40"}, "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-c2405b6e35f4774f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TopExpenseCategories.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TopExpenseCategories.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e6cd04f20d742b2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TransactionFeed.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TransactionFeed.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-b1204321148dc26c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/assets/DebtTab.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/DebtTab.tsx:244"}, "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-e058b899860d9bfd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/assets/PensionTab.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/PensionTab.tsx:346"}, "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-dbb87f4b2c464b01", "name": "`truncate` class without `title=` for hover reveal \u2014 components/assets/RealEstateTab.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/RealEstateTab.tsx:158"}, "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-a00cd0f237ec77e3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/TransactionRow.tsx:22", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/TransactionRow.tsx:22"}, "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-755de66345ee4f4f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/RecategorizePreviewModal.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/RecategorizePreviewModal.tsx:121"}, "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-fa3642395a10ba38", "name": "Stray `console.log` in TS/JS \u2014 components/scenario/BrokerAgentPanel.tsx:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/scenario/BrokerAgentPanel.tsx:60"}, "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-e07732560608f965", "name": "`truncate` class without `title=` for hover reveal \u2014 components/scenario/ProgressSummary.tsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/scenario/ProgressSummary.tsx:23"}, "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-d048cdc29707c67c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DashboardView.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DashboardView.tsx:75"}, "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-9f978b177d4b07cd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DemoSidebar.tsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DemoSidebar.tsx:23"}, "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-9ca2502f521698b5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/CashflowView.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/CashflowView.tsx:114"}, "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-9963343024f58990", "name": "Stray `console.log` in TS/JS \u2014 app/api/realestate/complexes/route.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/realestate/complexes/route.ts:53"}, "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-40373f92c4be3781", "name": "Stray `console.log` in TS/JS \u2014 app/api/realestate/price/route.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/realestate/price/route.ts:107"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9dcaca3859ebb0d9", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/page.tsx:470", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/page.tsx:470"}, "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-4303efd5f9ed0d67", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/excel-mappings/page.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/excel-mappings/page.tsx:249"}, "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-0ad5ed8d0e4764f1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/transactions/page.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/transactions/page.tsx:206"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01ec21da9d950c08", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/budget/page.tsx:627", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/budget/page.tsx:627"}, "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-774b2f6e12993ebc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/uploads/page.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/uploads/page.tsx:89"}, "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-d46fa9627ec48f3b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/family/page.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/family/page.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-f4de992835f8a726", "name": "Stray `console.log` in TS/JS \u2014 lib/actions/transactions/bulk.ts:250", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/actions/transactions/bulk.ts:250"}, "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-783f0543185ff098", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/real-estate-tax-calc.tsx:398", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/real-estate-tax-calc.tsx:398"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "12 test file(s) for 266 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 145 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 119 placeholder/mock markers across 28 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 ci. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f7b204b91741d8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/asset-list.tsx:512", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/asset-list.tsx:512"}, "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-66fba39fb2eddc99", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/transaction-drawer.tsx:275", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/transaction-drawer.tsx:275"}, "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-997d09469befcfca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/holding-drawer.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/holding-drawer.tsx:126"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52c8711d81c94dfc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/excel-upload-drawer.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/excel-upload-drawer.tsx:158"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e734d236d0957369", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/assets/FinancialTab.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/assets/FinancialTab.tsx:110"}, "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-4220992bf3306a0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/api.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/api.ts:8"}, "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-4c0d9aa316d48558", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/BrokerAgentPanel.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/BrokerAgentPanel.tsx:37"}, "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-483eb714ad0a9515", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/frankr/route.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/frankr/route.ts:61"}, "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-deb955e720107965", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/budget/page.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/budget/page.tsx:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ba5c28610a2234f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/assets/page.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/assets/page.tsx:110"}, "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-8b654a7ad9622fdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/cashflow/page.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/cashflow/page.tsx:124"}, "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-d9f91f44838fdcbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/family/page.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/family/page.tsx:40"}, "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-fe384b824522743c", "name": "Legacy-named symbol `dondoc_signup_captured_v1` in app/onboarding/page.tsx:17", "shortDescription": {"text": "Legacy-named symbol `dondoc_signup_captured_v1` in app/onboarding/page.tsx:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd93a4a7bcbeb801", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai.ts:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai.ts:142"}, "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-696c5c4e45d96fa2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agent/tools/stocks.ts:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agent/tools/stocks.ts:301"}, "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-d26555a10d5ff6f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/historical-fx.test.ts:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/historical-fx.test.ts:3"}, "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-2e2ebbcc0d6be644", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/dart-fundamental.ts:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/dart-fundamental.ts:93"}, "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-02b41f3854ba9cd4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/yahoo-fundamental.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/yahoo-fundamental.ts:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-091ac4348baff00d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/frankr/client.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/frankr/client.ts:11"}, "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-212cf3ab64d22077", "name": "Legacy-named symbol `deductOld` in lib/frankr/types.ts:133", "shortDescription": {"text": "Legacy-named symbol `deductOld` in lib/frankr/types.ts:133"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02ad5da8255c745b", "name": "Commented-code block (5 lines) in lib/actions/investments.ts:340", "shortDescription": {"text": "Commented-code block (5 lines) in lib/actions/investments.ts:340"}, "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-8fe00d9b43ac2324", "name": "Commented-code block (6 lines) in lib/actions/transaction.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in lib/actions/transaction.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23682"}, "properties": {"repository": "zkznxk123-sys/don-doc", "repoUrl": "https://github.com/zkznxk123-sys/don-doc", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: zkznxk123-sys/don-doc"}, "properties": {"repobilityId": 431462, "scanner": "foundry_dataset", "fingerprint": "f30eb4a7027985bfb1f911bc14af18a3e906db425100bee87a8132750dde0b9c", "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": {"deployment_env_gap": 1, "dependency_or_build": 2, "security_auth_secret": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 4, "human_reported_issue_no_linked_fix": 2, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 8}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 24, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 2, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 2, "thread_has_comment_chain": 2, "comment_chain_touches_file": 4, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 14, "node_types": {"repo": 1, "thread": 1, "comment": 2, "pr_file": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "zkznxk123-sys/don-doc#1", "issue_number": "1", "quality_tiers": {"unresolved": 4}, "repo_full_name": "zkznxk123-sys/don-doc", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-51fedf94d99b090b", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"dependency_or_build": 10}}, "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: needs_more_evidence\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#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: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#1\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 14\nEdges: 24\nNode types: {'link_quality': 4, 'comment': 2, 'pr_file': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 4, 'chain_has_link_quality': 4, 'thread_has_comment': 2, 'thread_touches_file': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'issue_chain_touches_file': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 4, 'dependency_or_build': 2, 'human_reported_issue_no_linked_fix': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'deployment_env_gap': 1}\nOutcomes: {'not_resolved_or_not_observed': 8}\nQuality tiers: {'unresolved': 4}\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/zkznxk123-sys/don-doc", "source_id": "graph-query-motif_query-b610658ce56cce41", "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": "zkznxk123-sys/don-doc", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: zkznxk123-sys/don-doc"}, "properties": {"repobilityId": 392373, "scanner": "foundry_dataset", "fingerprint": "e85ed42f9fde8b64b7a082d571f180f0764e200f0cad708fa6da846493596902", "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": "zkznxk123-sys/don-doc#2", "human_labels": ["agent_instruction_gap", "deployment_env_gap", "docs_or_claims", "ui_or_frontend"], "issue_number": "2", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "self_attested_unverified", "source_backed": true, "max_confidence": 0.842, "repo_full_name": "zkznxk123-sys/don-doc", "training_usage": "gold_candidate", "confidence_tier": "high_confidence", "source_chain_id": "evidence-chain-issue_chain-a8ec483a49db0212", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 4, "designs": 1, "schemas": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"docs_or_claims": 2, "ui_or_frontend": 1}, "linked_commit_count": 2, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_high_confidence", "high_risk_human_feedback_label"], "linked_ci_commit_count": 2, "verification_artifact_count": 3, "design_schema_api_artifact_count": 3}, "text": "Comment chain pattern product: bad_chains\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nOutcome: self_attested_unverified\nThread label: thread_has_human_issue_and_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_high_confidence, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: zkznxk123-sys/don-doc#2\nRepo: zkznxk123-sys/don-doc\nThread label: thread_has_human_issue_and_fix_context\nOutcome: self_attested_unverified\nComment count: 2\nLinked commit count: 2\nLinked CI commit count: 2\nLinked CI labels: {'ci_success_signal': 2}\nChanged file count: 3\nLabels: {'agent_instruction_gap': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'docs_or_claims': 2, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-4ccc77e1e786e470\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"agent_instruction_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zkznxk123-sys/don-doc/pull/2\",\n    \"text\": \"GitHub feedback: agent_instruction_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: zkznxk123-sys/don-doc\\nAuthor: zkznxk123-sys (User)\\nURL: https://github.com/zkznxk123-sys/don-doc/pull/2\\nTitle: \ud0dc\uadf8\ub77c\uc778 \uc815\ubcf8\uc744 \\\"\uac00\uc7a5 \uc26c\uc6b4 \uc790\uc0b0 \uad00\ub9ac\\\"\ub85c \ud1b5\uc77c\\nBody:\\n## \ubc30\uacbd\\nD-day(2026-06-17) Threads `@dondoc_app` \uacf5\uac1c\uc5d0 \ub9de\ucdb0, 6/15 \ud0c0\uac9f \uc815\uc815(\\\"1\uc778\\\" \ud504\ub808\uc774\ubc0d \ud3d0\uae30 \u2192 \\\"\uac00\uc7a5 \uc26c\uc6b4 \uc790\uc0b0 \uad00\ub9ac\\\")\uc774 \ube0c\ub79c\ub4dc \uc815\ubcf8(BRAND_GUIDE)\uc5d0 \ubc18\uc601\ub418\uc9c0 \uc54a\uc544 \ud0dc\uadf8\ub77c\uc778\uc774 3\uac08\ub798\ub85c \ubd84\uae30\ub3fc \uc788\ub358 \ubb38\uc81c\ub97c \ud1b5\uc77c.\\n\\n## \ubcc0\uacbd\\n- **docs/BRAND_GUIDE.md** \u00a72 Primary Tagline\u00b7Mission\u00b7\uc601\ubb38\ud310, \u00a74 Owner-first \ud0a4\uc6cc\ub4dc, \u00a77 Voice \uc608\uc2dc \u2192 \u300c\uac00\uc7a5 \uc26c\uc6b4 \uc790\uc0b0 \uad00\ub9ac \u2014 \ud769\uc5b4\uc9c4 \uc790\uc0b0\uc744 \ud55c \ud654\uba74\uc5d0\u300d\ub85c \uc815\ub82c. \\\"\ud55c \uc0ac\ub78c\\\"\u00b7\\\"\uc2dc\uac04 \ucd5c\uc18c\ud654\\\" \uc61b \ud504\ub808\uc774\ubc0d \uc81c\uac70\\n- **app/layout.tsx** \u2014 metadata title\u00b7OG description\u00b7lite/full meta description \uc815\ub82c. OG \uc774\ubbf8\uc9c0 \ubbf8\uc81c\uc791 \uc8fc\uc11d \ubcf4\uac15\\n- **README.md** \u2014 \ud0dc\uadf8\ub77c\uc778 + \ubcf8\ubb38 \uccab \ubb38\uc7a5 \uc815\ub82c\\n\\n## \uc124\uacc4 \ub178\ud2b8\\n- \ud0dc\uadf8\ub77c\uc778 \uc815\ubcf8 = \ub79c\ub529 Hero eyebrow(\uac00\uc7a5 \uc26c\uc6b4 \uc790\uc0b0 \uad00\ub9ac) + H1(\ud769\uc5b4\uc9c4 \uc790\uc0b0\uc744 \ud55c \ud654\uba74\uc5d0) \uacb0\ud569 = Threads bio\uc640 1:1 \uc77c\uce58\\n- **\uc81c\ud488 \uc0ac\uc2e4 \uc11c\uc220**(\ud604\uae08\u00b7\uae08\uc735\u00b7\ubd80\ub3d9\uc0b0\u00b7\uc5f0\uae08\u00b7\ubd80\ucc44 5\uc885)\uc740 \uadf8\ub300\ub85c \uc720\uc9c0 \u2014 SNS hook\uacfc \uc81c\ud488 taxonomy\ub294 \uc758\ub3c4\uc801\uc73c\ub85c \ub2e4\ub978 \ub808\uc9c0\uc2a4\ud130\\n\\n## \uc601\ud5a5\\n\ubb38\uc11c\u00b7\uba54\ud0c0\ub370\uc774\ud130\ub9cc. \ub7f0\ud0c0\uc784 \ub85c\uc9c1 \ubcc0\uacbd \uc5c6\uc74c.\\n\\n\ud83e\udd16 Generated with [Claude Code](https://claude.com/claude-code)\"\n  },\n  {\n    \"id\": \"github-feedback-comment-c9f6a98b7c3509bd\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zkznxk123-sys/don-doc/pull/2#issuecomment-4726990257\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: zkznxk123-sys/don-doc\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/zkznxk123-sys/don-doc/pull/2#issuecomment-4726990257\\nTitle: \\nBody:\\n[vc]: #l+0XFwuo+SbR6y/VEMnIoLQZcUBGQ9PHzzxUg/Gqmio=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJkb24tZG9jIiwicHJvamVjdElkIjoicHJqX2RnRVRPVmxQNEx4UlhiWjZMdjIyRDFqeHBsUU0iLCJyb290RGlyZWN0b3J5IjpudWxsLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vemt6bnhrMTIzLXN5cy1wcm9qZWN0cy9kb24tZG9jLzZyYm9aZHBRdVZkNU51Z1JjeU1hUlJKc0hBZkwiLCJwcmV2aWV3VXJsIjoiZG9uLWRvYy1naXQt\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zkznxk123-sys/don-doc", "source_id": "comment-chain-pattern-bad_chains-53713198aeef1adb", "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": "zkznxk123-sys/don-doc", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "gold_candidate"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: zkznxk123-sys/don-doc"}, "properties": {"repobilityId": 392372, "scanner": "foundry_dataset", "fingerprint": "da2a9e3c181e6c5afb3fbe20e8ea6afc8548466aa17f2aaa18a5191ea5f6a687", "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": "zkznxk123-sys/don-doc#1", "human_labels": ["dependency_or_build", "deployment_env_gap", "security_auth_secret"], "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": "zkznxk123-sys/don-doc", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-96d188ff0bbb0b3c", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 4, "designs": 1, "schemas": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 2, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"dependency_or_build": 2}, "linked_commit_count": 0, "helicopter_view_count": 2, "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": 3, "design_schema_api_artifact_count": 3}, "text": "Comment chain pattern product: bad_chains\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#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: zkznxk123-sys/don-doc#1\nRepo: zkznxk123-sys/don-doc\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 2\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 2\nLabels: {'security_auth_secret': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'dependency_or_build': 2}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-19868ea067065985\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zkznxk123-sys/don-doc/pull/1\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: zkznxk123-sys/don-doc\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/zkznxk123-sys/don-doc/pull/1\\nTitle: Fix React Server Components CVE vulnerabilities\\nBody:\\n> [!IMPORTANT]\\n> This is an automatic PR generated by Vercel to help you with patching efforts. We can't guarantee it's comprehensive, and it may contain mistakes. Please review our [guidance](https://vercel.link/additional-checks) before merging these changes.\\n\\nA critical remote code execution (RCE) vulnerability in React Server Components, impacting frameworks such as Next.js, was identified in the project [don-doc](https://vercel.com/zkznxk123-sys-projects/don-doc). The vulnerability enables unauthenticated RCE on the server via insecure deserialization in the React Flight protocol.\\n\\nThis issue is tracked under:\\n\\n- GitHub Security Advisory: [GHSA-9qr9-h5gf-34mp](https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp)\\n- React Advisory: [CVE-2025-55182](https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components)\\n- Next.js Advisory: [CVE-2025-66478](https://nextjs.org/blog/CVE-2025-66478)\\n\\n\"\n  },\n  {\n    \"id\": \"github-feedback-comment-3e264e1874fea0dc\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zkznxk123-sys/don-doc/pull/1#issuecomment-4332190627\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: zkznxk123-sys/don-doc\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/zkznxk123-sys/don-doc/pull/1#issuecomment-4332190627\\nTitle: \\nBody:\\n[vc]: #K/QNFf/+S8CcidsoKjXcKyRKMqUYwYki5uy+CtAO1YM=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJkb24tZG9jIiwicHJvamVjdElkIjoicHJqX2RnRVRPVmxQNEx4UlhiWjZ\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zkznxk123-sys/don-doc", "source_id": "comment-chain-pattern-bad_chains-a13597b8c92a9753", "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": "zkznxk123-sys/don-doc", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: zkznxk123-sys/don-doc"}, "properties": {"repobilityId": 415199, "scanner": "foundry_dataset", "fingerprint": "c915fc110a6b222206e3a1c007137629b8c53f4e295f2a666663e5adf1103cd6", "category": "auth", "severity": "critical", "confidence": 0.78, "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": "Security/auth changes without enough guardrails", "intent": "Assumption-check security/auth examples requiring stronger tests or CI.", "labels": {"deployment_env_gap": 1, "dependency_or_build": 2, "security_auth_secret": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 4, "human_reported_issue_no_linked_fix": 2, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"not_resolved_or_not_observed": 8}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 24, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 2, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 2, "thread_has_comment_chain": 2, "comment_chain_touches_file": 4, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 14, "node_types": {"repo": 1, "thread": 1, "comment": 2, "pr_file": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "zkznxk123-sys/don-doc#1", "issue_number": "1", "quality_tiers": {"unresolved": 4}, "repo_full_name": "zkznxk123-sys/don-doc", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-b745dc2163091457", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"dependency_or_build": 10}}, "text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: needs_more_evidence\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#1\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 14\nEdges: 24\nNode types: {'link_quality': 4, 'comment': 2, 'pr_file': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 4, 'chain_has_link_quality': 4, 'thread_has_comment': 2, 'thread_touches_file': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'issue_chain_touches_file': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 4, 'dependency_or_build': 2, 'human_reported_issue_no_linked_fix': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'deployment_env_gap': 1}\nOutcomes: {'not_resolved_or_not_observed': 8}\nQuality tiers: {'unresolved': 4}\nCI labels: {}\nCurriculum targets:\n- Train auth boundary repair with tests, permission matrices, and secret-handling checks.\n- Keep risky auth changes separate from ordinary bug-fix examples.\nAssumption checks:\n- Are auth/permission paths covered by tests?\n- Are secrets, CORS, or access rules verified rather than summarized?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zkznxk123-sys/don-doc", "source_id": "graph-query-motif_query-a4cde333a78666cf", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/security_auth_guardrail_gaps/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "zkznxk123-sys/don-doc", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "foundry_fake_real_gap", "level": "error", "message": {"text": "Foundry mined mock as real or placeholder: zkznxk123-sys/don-doc"}, "properties": {"repobilityId": 408526, "scanner": "foundry_dataset", "fingerprint": "ab6c47a0cfbef1fbcf375508d2caf308b89e02a068e9c3ab8b6c765ab55087a1", "category": "practices", "severity": "critical", "confidence": 0.82, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Mock, sample, placeholder, or self-attested behavior treated as real", "intent": "Hard negatives for fake completeness and missing real data paths.", "labels": {"docs_or_claims": 2, "ui_or_frontend": 1, "ci_success_signal": 1, "deployment_env_gap": 1, "generated_provenance": 1, "agent_instruction_gap": 1, "self_attested_unverified": 4, "issue_or_pull_request_thread": 1, "thread_has_human_issue_and_fix_context": 2, "self_attested_or_generated_fix_unverified": 2}, "source": "graph_query_export", "motif_id": "mock_as_real_or_placeholder", "outcomes": {"self_attested_unverified": 8}, "polarity": "bad", "query_id": "mock_as_real_or_placeholder", "severity": "critical", "ci_labels": {"ci_success_signal": 4}, "synthetic": false, "edge_count": 32, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 3, "comment_chain_has_ci": 2, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 2, "comment_chain_links_commit": 2, "comment_chain_touches_file": 6, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 17, "node_types": {"repo": 1, "commit": 1, "thread": 1, "comment": 2, "pr_file": 3, "ci_summary": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "zkznxk123-sys/don-doc#2", "issue_number": "2", "quality_tiers": {"high_confidence": 3, "weak_supervision": 1}, "repo_full_name": "zkznxk123-sys/don-doc", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-c868f8b9c1b74476", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"docs_or_claims": 10, "ui_or_frontend": 5}}, "text": "Graph query export: Mock, sample, placeholder, or self-attested behavior treated as real\nQuery id: mock_as_real_or_placeholder\nQuery type: motif_query\nIntent: Hard negatives for fake completeness and missing real data paths.\nMotif: mock_as_real_or_placeholder\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nEvidence:\nGraph motif: Mock, sample, placeholder, or self-attested behavior treated as real\nMotif id: mock_as_real_or_placeholder\nPolarity: bad\nTraining usage: hard_negative\nSeverity: critical\nRepo: zkznxk123-sys/don-doc\nThread: zkznxk123-sys/don-doc#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zkznxk123-sys/don-doc#2\nRepo: zkznxk123-sys/don-doc\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 17\nEdges: 32\nNode types: {'link_quality': 4, 'pr_file': 3, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'commit': 1, 'ci_summary': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 6, 'chain_has_link_quality': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'comment_chain_links_commit': 2, 'comment_chain_has_ci': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'self_attested_unverified': 4, 'docs_or_claims': 2, 'self_attested_or_generated_fix_unverified': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'agent_instruction_gap': 1, 'deployment_env_gap': 1, 'ui_or_frontend': 1, 'generated_provenance': 1, 'ci_success_signal': 1}\nOutcomes: {'self_attested_unverified': 8}\nQuality tiers: {'high_confidence': 3, 'weak_supervision': 1}\nCI labels: {'ci_success_signal': 4}\nCurriculum targets:\n- Train real-data plumbing and mock-removal tasks from source to UI.\n- Use as hard negatives for dashboards or apps claiming real runs without provenance.\nAssumption checks:\n- Is user-visible behavior backed by real storage/API/CI artifacts?\n- Are placeholders, sample data, or generated claims still in a production path?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zkznxk123-sys/don-doc", "source_id": "graph-query-motif_query-5acec18ec2137c34", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/mock_as_real_or_placeholder/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "zkznxk123-sys/don-doc", "source_dataset": "graph_queries/mock_as_real_or_placeholder", "training_usage": "hard_negative"}}}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-45fd307088940332", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-holding.ts:36"}, "properties": {"repobilityId": "91ad312df4a54e4e", "scanner": "scanner-primary", "fingerprint": "45fd307088940332", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf59b4abdc8b50df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/list-pension-accounts.ts:32"}, "properties": {"repobilityId": "cfb6880bef3e9328", "scanner": "scanner-primary", "fingerprint": "cf59b4abdc8b50df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ada85933d3b77b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-demo-data.ts:23"}, "properties": {"repobilityId": "092f7abff105543d", "scanner": "scanner-primary", "fingerprint": "0ada85933d3b77b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-051a9054c48ff6ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-set-visibility.ts:42"}, "properties": {"repobilityId": "8dba33a9af9d09cc", "scanner": "scanner-primary", "fingerprint": "051a9054c48ff6ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cbf332b9d6f2ff7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dedup-balance-change-logs.ts:36"}, "properties": {"repobilityId": "2af46bdf2caba693", "scanner": "scanner-primary", "fingerprint": "9cbf332b9d6f2ff7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a13b8b5e0acaeb3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-account.ts:35"}, "properties": {"repobilityId": "1992a29a44f9fa60", "scanner": "scanner-primary", "fingerprint": "a13b8b5e0acaeb3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d2d6876b6ac4c2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/donbora-fill.ts:255"}, "properties": {"repobilityId": "7daf0d392898984e", "scanner": "scanner-primary", "fingerprint": "5d2d6876b6ac4c2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b08971a052b866a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-account.ts:39"}, "properties": {"repobilityId": "38c0e6961a421a37", "scanner": "scanner-primary", "fingerprint": "3b08971a052b866a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5940405cedc5a22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:13"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "d5940405cedc5a22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15ab08acb76c2903", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-categories.ts:40"}, "properties": {"repobilityId": "4c96ba4351e14155", "scanner": "scanner-primary", "fingerprint": "15ab08acb76c2903", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ac6a357cd031ba4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:53"}, "properties": {"repobilityId": "04408501143ae10b", "scanner": "scanner-primary", "fingerprint": "8ac6a357cd031ba4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52ce625069bc6e0a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/layout/FamilyAction.tsx:80"}, "properties": {"repobilityId": "f6199ef22f98f227", "scanner": "scanner-primary", "fingerprint": "52ce625069bc6e0a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b42e6d271330f8fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/FamilyAction.tsx:135"}, "properties": {"repobilityId": "b6b1f9497a3f8a79", "scanner": "scanner-primary", "fingerprint": "b42e6d271330f8fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e64e8fff24c03d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/AppSidebar.tsx:100"}, "properties": {"repobilityId": "aa3dc6766179e3cc", "scanner": "scanner-primary", "fingerprint": "8e64e8fff24c03d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f479e09bd8a8f39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/TopBar.tsx:104"}, "properties": {"repobilityId": "12e3bddb33ffaf4e", "scanner": "scanner-primary", "fingerprint": "8f479e09bd8a8f39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e690e4d080eabcad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-list.tsx:156"}, "properties": {"repobilityId": "5ca393c9c46acfae", "scanner": "scanner-primary", "fingerprint": "e690e4d080eabcad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f098e3d893f8420", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/price-history-chart.tsx:72"}, "properties": {"repobilityId": "32691bb1ba9a436a", "scanner": "scanner-primary", "fingerprint": "0f098e3d893f8420", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-042a754ca3d6d7d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/real-estate-card.tsx:39"}, "properties": {"repobilityId": "8d45c1532dabb685", "scanner": "scanner-primary", "fingerprint": "042a754ca3d6d7d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ccdaccd8ed3367ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/holding-drawer.tsx:191"}, "properties": {"repobilityId": "3d524e70988c2ac8", "scanner": "scanner-primary", "fingerprint": "ccdaccd8ed3367ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b86d1b45a11bbf2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/auto-cleanup-dialog.tsx:165"}, "properties": {"repobilityId": "44fd16b4a1f942a8", "scanner": "scanner-primary", "fingerprint": "9b86d1b45a11bbf2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46cb6fc4be477f04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/recent-balance-changes.tsx:89"}, "properties": {"repobilityId": "7b06ba93dc9cb0d9", "scanner": "scanner-primary", "fingerprint": "46cb6fc4be477f04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d34962a8e1d4f736", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-fundamentals.tsx:218"}, "properties": {"repobilityId": "5997492eb84a275a", "scanner": "scanner-primary", "fingerprint": "d34962a8e1d4f736", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbbcba3799dbc938", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/asset-donut-chart.tsx:192"}, "properties": {"repobilityId": "8c0f3cef4838ec9f", "scanner": "scanner-primary", "fingerprint": "bbbcba3799dbc938", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93fd32e4abbfdfd8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/real-estate-tax-calc.tsx:398"}, "properties": {"repobilityId": "0512994a629eea44", "scanner": "scanner-primary", "fingerprint": "93fd32e4abbfdfd8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-00979e44214a655f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer.tsx:545"}, "properties": {"repobilityId": "f8e906fbf5b2ad25", "scanner": "scanner-primary", "fingerprint": "00979e44214a655f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28f58c3c0a56c478", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/portfolio-analysis.tsx:222"}, "properties": {"repobilityId": "a7a7fe8cd6582cbc", "scanner": "scanner-primary", "fingerprint": "28f58c3c0a56c478", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5525438d1ef09ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/excel-upload-drawer/preview-components.tsx:92"}, "properties": {"repobilityId": "1b8512c5859e4470", "scanner": "scanner-primary", "fingerprint": "d5525438d1ef09ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6ec36bdb08d2b02", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/KpiCard.tsx:40"}, "properties": {"repobilityId": "ff0813ccf0f5f33d", "scanner": "scanner-primary", "fingerprint": "c6ec36bdb08d2b02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2405b6e35f4774f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TopExpenseCategories.tsx:55"}, "properties": {"repobilityId": "8bad3e3fd4753bbb", "scanner": "scanner-primary", "fingerprint": "c2405b6e35f4774f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e6cd04f20d742b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/TransactionFeed.tsx:186"}, "properties": {"repobilityId": "f7f5f2e196bcc519", "scanner": "scanner-primary", "fingerprint": "4e6cd04f20d742b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1204321148dc26c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/DebtTab.tsx:244"}, "properties": {"repobilityId": "229d9abc4f5fb2ca", "scanner": "scanner-primary", "fingerprint": "b1204321148dc26c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e058b899860d9bfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/PensionTab.tsx:346"}, "properties": {"repobilityId": "dc6a9df1fae8e3a5", "scanner": "scanner-primary", "fingerprint": "e058b899860d9bfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbb87f4b2c464b01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/assets/RealEstateTab.tsx:158"}, "properties": {"repobilityId": "cfc73b8fed823909", "scanner": "scanner-primary", "fingerprint": "dbb87f4b2c464b01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a00cd0f237ec77e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/TransactionRow.tsx:22"}, "properties": {"repobilityId": "31ce156720898d4c", "scanner": "scanner-primary", "fingerprint": "a00cd0f237ec77e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-755de66345ee4f4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/cashflow/RecategorizePreviewModal.tsx:121"}, "properties": {"repobilityId": "453ebf98e8c0861e", "scanner": "scanner-primary", "fingerprint": "755de66345ee4f4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa3642395a10ba38", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/scenario/BrokerAgentPanel.tsx:60"}, "properties": {"repobilityId": "acdbdd268699c371", "scanner": "scanner-primary", "fingerprint": "fa3642395a10ba38", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e07732560608f965", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/scenario/ProgressSummary.tsx:23"}, "properties": {"repobilityId": "161a099c476a70e5", "scanner": "scanner-primary", "fingerprint": "e07732560608f965", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d048cdc29707c67c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DashboardView.tsx:75"}, "properties": {"repobilityId": "beb4032f432c2042", "scanner": "scanner-primary", "fingerprint": "d048cdc29707c67c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f978b177d4b07cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/DemoSidebar.tsx:23"}, "properties": {"repobilityId": "c732ef0b18d42ae3", "scanner": "scanner-primary", "fingerprint": "9f978b177d4b07cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ca2502f521698b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/demo/_components/CashflowView.tsx:114"}, "properties": {"repobilityId": "ef28089976e72f2c", "scanner": "scanner-primary", "fingerprint": "9ca2502f521698b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9963343024f58990", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/realestate/complexes/route.ts:53"}, "properties": {"repobilityId": "dafd1f06efe4a49d", "scanner": "scanner-primary", "fingerprint": "9963343024f58990", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40373f92c4be3781", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/realestate/price/route.ts:107"}, "properties": {"repobilityId": "359000330d143afc", "scanner": "scanner-primary", "fingerprint": "40373f92c4be3781", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9dcaca3859ebb0d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/page.tsx:470"}, "properties": {"repobilityId": "b7b058984cf968ad", "scanner": "scanner-primary", "fingerprint": "9dcaca3859ebb0d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4303efd5f9ed0d67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/settings/excel-mappings/page.tsx:249"}, "properties": {"repobilityId": "6cc225f4ebbba1c0", "scanner": "scanner-primary", "fingerprint": "4303efd5f9ed0d67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ad5ed8d0e4764f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/transactions/page.tsx:206"}, "properties": {"repobilityId": "d80b8466c5c0b5e3", "scanner": "scanner-primary", "fingerprint": "0ad5ed8d0e4764f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01ec21da9d950c08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/budget/page.tsx:627"}, "properties": {"repobilityId": "760100bd07ec2dd7", "scanner": "scanner-primary", "fingerprint": "01ec21da9d950c08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-774b2f6e12993ebc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/uploads/page.tsx:89"}, "properties": {"repobilityId": "b5c184b5c45865c3", "scanner": "scanner-primary", "fingerprint": "774b2f6e12993ebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d46fa9627ec48f3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/family/page.tsx:215"}, "properties": {"repobilityId": "4e773c4dced74547", "scanner": "scanner-primary", "fingerprint": "d46fa9627ec48f3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4de992835f8a726", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/actions/transactions/bulk.ts:250"}, "properties": {"repobilityId": "9f559f17c2b0d784", "scanner": "scanner-primary", "fingerprint": "f4de992835f8a726", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-783f0543185ff098", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/real-estate-tax-calc.tsx:398"}, "properties": {"repobilityId": "76ae8a7da38bd1c8", "scanner": "scanner-primary", "fingerprint": "783f0543185ff098", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/real-estate-tax-calc.tsx"}, "region": {"startLine": 398}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "1956b8802f56c425", "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": "4a8e477642de728e", "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": "7fbc8ecb8d34066a", "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": "ceb73c0726b78b53", "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": "343cff5dcff23231", "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": "55d1896eafc65c45", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-1f7b204b91741d8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/asset-list.tsx:512"}, "properties": {"repobilityId": "4136df8114f859fc", "scanner": "scanner-primary", "fingerprint": "1f7b204b91741d8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66fba39fb2eddc99", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/transaction-drawer.tsx:275"}, "properties": {"repobilityId": "5edb12246b5a8c4c", "scanner": "scanner-primary", "fingerprint": "66fba39fb2eddc99", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-997d09469befcfca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/holding-drawer.tsx:126"}, "properties": {"repobilityId": "fe868f015d26a52d", "scanner": "scanner-primary", "fingerprint": "997d09469befcfca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52c8711d81c94dfc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/excel-upload-drawer.tsx:158"}, "properties": {"repobilityId": "419b9dd196f5abb5", "scanner": "scanner-primary", "fingerprint": "52c8711d81c94dfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e734d236d0957369", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/assets/FinancialTab.tsx:110"}, "properties": {"repobilityId": "40706a4ca15675c9", "scanner": "scanner-primary", "fingerprint": "e734d236d0957369", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4220992bf3306a0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/api.ts:8"}, "properties": {"repobilityId": "be4ee5e607cda67d", "scanner": "scanner-primary", "fingerprint": "4220992bf3306a0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c0d9aa316d48558", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/scenario/BrokerAgentPanel.tsx:37"}, "properties": {"repobilityId": "3e6bd81f855ab75a", "scanner": "scanner-primary", "fingerprint": "4c0d9aa316d48558", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-483eb714ad0a9515", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/frankr/route.ts:61"}, "properties": {"repobilityId": "cab581baeba66e8c", "scanner": "scanner-primary", "fingerprint": "483eb714ad0a9515", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-deb955e720107965", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/budget/page.tsx:73"}, "properties": {"repobilityId": "ff28b2dd1470c1b3", "scanner": "scanner-primary", "fingerprint": "deb955e720107965", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ba5c28610a2234f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/assets/page.tsx:110"}, "properties": {"repobilityId": "3436fec97d26d283", "scanner": "scanner-primary", "fingerprint": "2ba5c28610a2234f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b654a7ad9622fdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/cashflow/page.tsx:124"}, "properties": {"repobilityId": "e0ea083605c8efd4", "scanner": "scanner-primary", "fingerprint": "8b654a7ad9622fdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9f91f44838fdcbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/family/page.tsx:40"}, "properties": {"repobilityId": "c6cc9f00a640f339", "scanner": "scanner-primary", "fingerprint": "d9f91f44838fdcbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe384b824522743c", "level": "note", "message": {"text": "Legacy-named symbol `dondoc_signup_captured_v1` in app/onboarding/page.tsx:17"}, "properties": {"repobilityId": "4d6c40cb30bb70b9", "scanner": "scanner-primary", "fingerprint": "fe384b824522743c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fd93a4a7bcbeb801", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai.ts:142"}, "properties": {"repobilityId": "c9b901b34f10e497", "scanner": "scanner-primary", "fingerprint": "fd93a4a7bcbeb801", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-696c5c4e45d96fa2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/agent/tools/stocks.ts:301"}, "properties": {"repobilityId": "75533dfbc8541a1a", "scanner": "scanner-primary", "fingerprint": "696c5c4e45d96fa2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d26555a10d5ff6f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/historical-fx.test.ts:3"}, "properties": {"repobilityId": "43438aac73f2be40", "scanner": "scanner-primary", "fingerprint": "d26555a10d5ff6f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e2ebbcc0d6be644", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/dart-fundamental.ts:93"}, "properties": {"repobilityId": "9169bfb7875052d9", "scanner": "scanner-primary", "fingerprint": "2e2ebbcc0d6be644", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02b41f3854ba9cd4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/utils/yahoo-fundamental.ts:73"}, "properties": {"repobilityId": "0ab1995f43fdd463", "scanner": "scanner-primary", "fingerprint": "02b41f3854ba9cd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-091ac4348baff00d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/frankr/client.ts:11"}, "properties": {"repobilityId": "3c585012dd57e750", "scanner": "scanner-primary", "fingerprint": "091ac4348baff00d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-212cf3ab64d22077", "level": "note", "message": {"text": "Legacy-named symbol `deductOld` in lib/frankr/types.ts:133"}, "properties": {"repobilityId": "90deffb17084820c", "scanner": "scanner-primary", "fingerprint": "212cf3ab64d22077", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-02ad5da8255c745b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/actions/investments.ts:340"}, "properties": {"repobilityId": "ac136d0f9b558e87", "scanner": "scanner-primary", "fingerprint": "02ad5da8255c745b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fe00d9b43ac2324", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/actions/transaction.ts:9"}, "properties": {"repobilityId": "0cc30a4cf0cd5eb7", "scanner": "scanner-primary", "fingerprint": "8fe00d9b43ac2324", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}