{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5d9aa3a4db67c63", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-icons.js:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-icons.js:124"}, "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-28245e62594d3470", "name": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/PDFParser.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/PDFParser.tsx:142"}, "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-80a41ebac73ff612", "name": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionRow.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionRow.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-459af20387ad346f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionPreview.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionPreview.tsx:275"}, "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-d72573a86e3dadb1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/InvestmentParser.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/InvestmentParser.tsx:90"}, "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-c8e57165ed14975d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransferForm.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransferForm.tsx:120"}, "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-f15c4faa7de5488c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardWidgets.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardWidgets.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d9cbe7844d171a5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/bills/BillsClient.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/bills/BillsClient.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-992612080b9d1a9a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AddAccountSheet.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AddAccountSheet.tsx:184"}, "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-cf0e37b0b994751e", "name": "Icon-only button without accessible name \u2014 components/accounts/AccountCard.tsx:92", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/accounts/AccountCard.tsx:92"}, "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-c8209ba77ac7badd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCard.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCard.tsx:60"}, "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-ec5b7706becdaad0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/users/[id]/UserDetailClient.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/users/[id]/UserDetailClient.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b67eba3b5ee60398", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c24700f62f04ae7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/bills/page.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/bills/page.tsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f81590d9f0fa2ce6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/receivables/ReceivablesClient.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/receivables/ReceivablesClient.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-223c90d2b4ad65d3", "name": "Possible secret in lib/i18n/locales/en.ts", "shortDescription": {"text": "Possible secret in lib/i18n/locales/en.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-cd5b6ab38b384e74", "name": "Possible secret in lib/i18n/locales/ms.ts", "shortDescription": {"text": "Possible secret in lib/i18n/locales/ms.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "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": "0 test file(s) for 184 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 72 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a426db9c75f8bc46", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/TransactionPreview.tsx:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/TransactionPreview.tsx:157"}, "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-8d2b2ab3a04bd0d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/VoiceParser.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/VoiceParser.tsx:107"}, "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-6f9e32d6a5782b64", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardWidgets.tsx:235", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardWidgets.tsx:235"}, "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-d3855182e330e250", "name": "Commented-code block (5 lines) in app/layout.tsx:35", "shortDescription": {"text": "Commented-code block (5 lines) in app/layout.tsx:35"}, "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-6476337d1b9f1e73", "name": "Commented-code block (7 lines) in app/api/ingest/route.ts:17", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/ingest/route.ts:17"}, "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-cbbe6cc39a357253", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/whatsapp/webhook/route.ts:218", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/whatsapp/webhook/route.ts:218"}, "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-7f572b3f9df95d4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminSidebar.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminSidebar.tsx:19"}, "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-eae308d6b30f1340", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/AdminSettingsClient.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/AdminSettingsClient.tsx:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-126074c114c5c930", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/AdminUsersClient.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/AdminUsersClient.tsx:42"}, "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-474f81c13ed3bd05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/[id]/UserDetailClient.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/[id]/UserDetailClient.tsx:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7f9fe0b4012868d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/NotificationSettings.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/NotificationSettings.tsx:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9b6fd5f73825c7d", "name": "Commented-code block (17 lines) in app/(app)/stocks/page.tsx:10", "shortDescription": {"text": "Commented-code block (17 lines) in app/(app)/stocks/page.tsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d68906a67b7591fa", "name": "Commented-code block (20 lines) in app/(app)/accounts/page.tsx:12", "shortDescription": {"text": "Commented-code block (20 lines) in app/(app)/accounts/page.tsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4c8662b779bfe88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(auth)/login/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(auth)/login/page.tsx:30"}, "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-bacd5fc9e33ea066", "name": "Commented-code block (5 lines) in lib/constants/tax-relief-map.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in lib/constants/tax-relief-map.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdb1e061cc0fd2c8", "name": "Commented-code block (5 lines) in lib/utils/dedup.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in lib/utils/dedup.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28b8cafc92a4b7e6", "name": "Commented-code block (6 lines) in lib/utils/tax-autolink.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in lib/utils/tax-autolink.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ebfcdcb6183f053", "name": "Commented-code block (6 lines) in lib/utils/transfer-match.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/utils/transfer-match.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f39f7444b35605d", "name": "Commented-code block (6 lines) in lib/utils/tax-calc.ts:34", "shortDescription": {"text": "Commented-code block (6 lines) in lib/utils/tax-calc.ts:34"}, "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-6cbc9aa87f0b3bb2", "name": "Commented-code block (5 lines) in lib/utils/account-alias.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/utils/account-alias.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22283"}, "properties": {"repository": "vinus-create/Vinus-finance", "repoUrl": "https://github.com/vinus-create/Vinus-finance", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-a5d9aa3a4db67c63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-icons.js:124"}, "properties": {"repobilityId": "50ac322bf6978bfe", "scanner": "scanner-primary", "fingerprint": "a5d9aa3a4db67c63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-28245e62594d3470", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/PDFParser.tsx:142"}, "properties": {"repobilityId": "e98114629b5f9048", "scanner": "scanner-primary", "fingerprint": "28245e62594d3470", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80a41ebac73ff612", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionRow.tsx:61"}, "properties": {"repobilityId": "50b8315d7c259b1c", "scanner": "scanner-primary", "fingerprint": "80a41ebac73ff612", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-459af20387ad346f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransactionPreview.tsx:275"}, "properties": {"repobilityId": "1d9ae0e959839639", "scanner": "scanner-primary", "fingerprint": "459af20387ad346f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d72573a86e3dadb1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/InvestmentParser.tsx:90"}, "properties": {"repobilityId": "41e11c4e668dcd47", "scanner": "scanner-primary", "fingerprint": "d72573a86e3dadb1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8e57165ed14975d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/transactions/TransferForm.tsx:120"}, "properties": {"repobilityId": "dd92cd6f21d7ae0e", "scanner": "scanner-primary", "fingerprint": "c8e57165ed14975d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f15c4faa7de5488c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardWidgets.tsx:173"}, "properties": {"repobilityId": "51f71b1299c001d3", "scanner": "scanner-primary", "fingerprint": "f15c4faa7de5488c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d9cbe7844d171a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/bills/BillsClient.tsx:165"}, "properties": {"repobilityId": "c5191b5f45b2512d", "scanner": "scanner-primary", "fingerprint": "2d9cbe7844d171a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-992612080b9d1a9a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AddAccountSheet.tsx:184"}, "properties": {"repobilityId": "37dfd8444ac8bfef", "scanner": "scanner-primary", "fingerprint": "992612080b9d1a9a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf0e37b0b994751e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/accounts/AccountCard.tsx:92"}, "properties": {"repobilityId": "a8070aa74bda3ae6", "scanner": "scanner-primary", "fingerprint": "cf0e37b0b994751e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c8209ba77ac7badd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCard.tsx:60"}, "properties": {"repobilityId": "a6e5983e8d67e1bd", "scanner": "scanner-primary", "fingerprint": "c8209ba77ac7badd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec5b7706becdaad0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/users/[id]/UserDetailClient.tsx:115"}, "properties": {"repobilityId": "f50fda7edf04b6a1", "scanner": "scanner-primary", "fingerprint": "ec5b7706becdaad0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b67eba3b5ee60398", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:185"}, "properties": {"repobilityId": "73048b17c3d2a98a", "scanner": "scanner-primary", "fingerprint": "b67eba3b5ee60398", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c24700f62f04ae7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/bills/page.tsx:79"}, "properties": {"repobilityId": "96c408f775d45f9d", "scanner": "scanner-primary", "fingerprint": "5c24700f62f04ae7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f81590d9f0fa2ce6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/receivables/ReceivablesClient.tsx:87"}, "properties": {"repobilityId": "e69824a57b9242d8", "scanner": "scanner-primary", "fingerprint": "f81590d9f0fa2ce6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-223c90d2b4ad65d3", "level": "error", "message": {"text": "Possible secret in lib/i18n/locales/en.ts"}, "properties": {"repobilityId": "5eb714fec5335c3a", "scanner": "scanner-primary", "fingerprint": "223c90d2b4ad65d3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/locales/en.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-cd5b6ab38b384e74", "level": "error", "message": {"text": "Possible secret in lib/i18n/locales/ms.ts"}, "properties": {"repobilityId": "91820df3a22a185b", "scanner": "scanner-primary", "fingerprint": "cd5b6ab38b384e74", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/locales/ms.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "7e6a28ca77f1964a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "dc65ea7bbbb4f13e", "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": "3411fcdfb142bc8a", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0046a767a0b111a8", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e1d2d3cc13f75f1a", "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": "d1e9abdd1cd5844a", "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": "e5744e66687fc057", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-a426db9c75f8bc46", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/TransactionPreview.tsx:157"}, "properties": {"repobilityId": "7be07074e1337dc8", "scanner": "scanner-primary", "fingerprint": "a426db9c75f8bc46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d2b2ab3a04bd0d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/transactions/VoiceParser.tsx:107"}, "properties": {"repobilityId": "ac3a19a8b6c90c79", "scanner": "scanner-primary", "fingerprint": "8d2b2ab3a04bd0d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f9e32d6a5782b64", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardWidgets.tsx:235"}, "properties": {"repobilityId": "04d775f9bec84b30", "scanner": "scanner-primary", "fingerprint": "6f9e32d6a5782b64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3855182e330e250", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/layout.tsx:35"}, "properties": {"repobilityId": "791272369bdd29bb", "scanner": "scanner-primary", "fingerprint": "d3855182e330e250", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6476337d1b9f1e73", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/ingest/route.ts:17"}, "properties": {"repobilityId": "2ee592c108eab875", "scanner": "scanner-primary", "fingerprint": "6476337d1b9f1e73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbbe6cc39a357253", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/whatsapp/webhook/route.ts:218"}, "properties": {"repobilityId": "6036c84cf3843dc0", "scanner": "scanner-primary", "fingerprint": "cbbe6cc39a357253", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f572b3f9df95d4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminSidebar.tsx:19"}, "properties": {"repobilityId": "03f1ea3298a9c3ae", "scanner": "scanner-primary", "fingerprint": "7f572b3f9df95d4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eae308d6b30f1340", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/AdminSettingsClient.tsx:24"}, "properties": {"repobilityId": "5208ce0784f6c33f", "scanner": "scanner-primary", "fingerprint": "eae308d6b30f1340", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-126074c114c5c930", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/AdminUsersClient.tsx:42"}, "properties": {"repobilityId": "64d3402c28d12bad", "scanner": "scanner-primary", "fingerprint": "126074c114c5c930", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-474f81c13ed3bd05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/[id]/UserDetailClient.tsx:16"}, "properties": {"repobilityId": "483b08ee5d1b7c3e", "scanner": "scanner-primary", "fingerprint": "474f81c13ed3bd05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7f9fe0b4012868d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/NotificationSettings.tsx:53"}, "properties": {"repobilityId": "eecce9082e15f596", "scanner": "scanner-primary", "fingerprint": "d7f9fe0b4012868d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9b6fd5f73825c7d", "level": "none", "message": {"text": "Commented-code block (17 lines) in app/(app)/stocks/page.tsx:10"}, "properties": {"repobilityId": "99d8e3d0d3dd1433", "scanner": "scanner-primary", "fingerprint": "d9b6fd5f73825c7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d68906a67b7591fa", "level": "none", "message": {"text": "Commented-code block (20 lines) in app/(app)/accounts/page.tsx:12"}, "properties": {"repobilityId": "a602923de3d2bf46", "scanner": "scanner-primary", "fingerprint": "d68906a67b7591fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4c8662b779bfe88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(auth)/login/page.tsx:30"}, "properties": {"repobilityId": "49332c9fd66d4d02", "scanner": "scanner-primary", "fingerprint": "c4c8662b779bfe88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bacd5fc9e33ea066", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/constants/tax-relief-map.ts:7"}, "properties": {"repobilityId": "5e2d44fc700c6f37", "scanner": "scanner-primary", "fingerprint": "bacd5fc9e33ea066", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bdb1e061cc0fd2c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/utils/dedup.ts:11"}, "properties": {"repobilityId": "d0242d895a77ca01", "scanner": "scanner-primary", "fingerprint": "bdb1e061cc0fd2c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28b8cafc92a4b7e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/utils/tax-autolink.ts:5"}, "properties": {"repobilityId": "289536392520b118", "scanner": "scanner-primary", "fingerprint": "28b8cafc92a4b7e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ebfcdcb6183f053", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/utils/transfer-match.ts:3"}, "properties": {"repobilityId": "e107f562100e0e18", "scanner": "scanner-primary", "fingerprint": "6ebfcdcb6183f053", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f39f7444b35605d", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/utils/tax-calc.ts:34"}, "properties": {"repobilityId": "8116be3d28d0c728", "scanner": "scanner-primary", "fingerprint": "6f39f7444b35605d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6cbc9aa87f0b3bb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/utils/account-alias.ts:1"}, "properties": {"repobilityId": "f0d38a2bec577fc2", "scanner": "scanner-primary", "fingerprint": "6cbc9aa87f0b3bb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}