{"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: yogesh-112/cbtermi", "shortDescription": {"text": "Foundry mined unresolved feedback: yogesh-112/cbtermi"}, "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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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_cha"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: yogesh-112/cbtermi", "shortDescription": {"text": "Foundry mined bad chains: yogesh-112/cbtermi"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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-0b868986d7abe949\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"b"}, "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: yogesh-112/cbtermi", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: yogesh-112/cbtermi"}, "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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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: {'comm"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84ade83b09638131", "name": "Stray `console.log` in TS/JS \u2014 docs/generate-pdfs.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/generate-pdfs.js:24"}, "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-2931f70442e86c6b", "name": "Stray `console.log` in TS/JS \u2014 docs/generate-qa-excel.js:405", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/generate-qa-excel.js:405"}, "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-bae82d4842522bca", "name": "Stray `console.log` in TS/JS \u2014 scripts/setup-stripe.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-stripe.js: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-e2cf8b56053f7188", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileHeader.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileHeader.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4d167d0b49bd8a6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Sidebar.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Sidebar.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-87d9187b1f7c58cf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Topbar.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Topbar.tsx:103"}, "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-570549857d0d6123", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/Sidebar.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/Sidebar.tsx:125"}, "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-18b838a3d838dfdf", "name": "\"active\" state uses light bg in a dark theme \u2014 components/admin/Sidebar.tsx:94", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/admin/Sidebar.tsx:94"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc637e2dd857cd96", "name": "Icon-only button without accessible name \u2014 components/admin/ui.tsx:115", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/admin/ui.tsx:115"}, "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-cc5dc6433d5eeacf", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/(shell)/faqs/page.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/(shell)/faqs/page.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-033f253f47d2e503", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/settings/page.tsx:455", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/settings/page.tsx:455"}, "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-469256fdfe40f7d1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/help/page.tsx:352", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/help/page.tsx:352"}, "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-8d7a532a510331d9", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/notifications/page.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/notifications/page.tsx:329"}, "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-1db220f1d90ef87a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/communications/page.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/communications/page.tsx:181"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a2c52c254afd76f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/page.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/page.tsx:117"}, "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-cdac5cd40b33320c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/new/page.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/new/page.tsx:211"}, "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-a5d026407c88fd03", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/[id]/page.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/[id]/page.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-39bdb32492e1639d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/audit-log/page.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/audit-log/page.tsx:147"}, "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-cafad547ce49f236", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:212"}, "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-b1b3f6fa9f95e704", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/team/page.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/team/page.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-005778e59f7f1ae6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/customers/page.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/customers/page.tsx:164"}, "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-cdfe7ab47c684afd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/templates/page.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/templates/page.tsx:234"}, "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-fceb85f8120423a8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/opportunities/page.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/opportunities/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-e47c0b57abe95df0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/expenses/page.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/expenses/page.tsx:240"}, "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-f5d06c43344562ca", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/page.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/page.tsx:243"}, "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-e524a329201f28b6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/[id]/page.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/[id]/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-8220b294a3305b90", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/profile/page.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/profile/page.tsx:91"}, "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-61b32ec9844eaec1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/new/page.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/new/page.tsx:169"}, "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-fad696d7341b546e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/[id]/page.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/[id]/page.tsx:122"}, "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-f120d1a003f2dde6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/feedback/page.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/feedback/page.tsx:183"}, "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-37715120dcb99588", "name": "Stray `console.log` in TS/JS \u2014 lib/email.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/email.ts:16"}, "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-e88ef29354845ba5", "name": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:5"}, "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-c07dd20d57443ee6", "name": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/sw.bundle.js:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/sw.bundle.js:1"}, "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-ba3bd1d354326ab2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "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-a3727a4fcd5faf2c", "name": "Possible secret in lib/users-store.ts", "shortDescription": {"text": "Possible secret in lib/users-store.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-7fe95ff6b9fc616b", "name": "Possible secret in lib/i18n/en.ts", "shortDescription": {"text": "Possible secret in lib/i18n/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-d9f3beb2b497a954", "name": "Possible secret in lib/i18n/es.ts", "shortDescription": {"text": "Possible secret in lib/i18n/es.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-3685aba5ae70f9b1", "name": "Possible secret in lib/i18n/pt.ts", "shortDescription": {"text": "Possible secret in lib/i18n/pt.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-ca9f780429d3be8d", "name": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/index.html:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/index.html:58"}, "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-22f7697cf20b81f2", "name": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/index.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/index.html:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13a15a1cc4dd8728", "name": "Insecure pattern 'cors_wildcard' in playwright-report-bs/trace/sw.bundle.js:1", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in playwright-report-bs/trace/sw.bundle.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5b20ee66d732cf43", "name": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/index.html:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/index.html:36"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-554f7e7b35f2ab42", "name": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:50", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "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-792a4faeb7e9d2c3", "name": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a51b76526a4b8918", "name": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/codeMirrorModule-Ds_H_9Yq.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/codeMirrorModule-Ds_H_9Yq.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-c836740fa1deb5f3", "name": "Very large file: scripts/generate-pptx.mjs (847 lines)", "shortDescription": {"text": "Very large file: scripts/generate-pptx.mjs (847 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "16 test file(s) for 238 source file(s) (ratio 0.07). 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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 138 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 242 placeholder/mock markers across 62 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, operator-readme. 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, operator-readme. 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-ec4ded5f5c5a8ab7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test.mjs:219", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test.mjs:219"}, "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-af31dd16382001a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test-retry2.mjs:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test-retry2.mjs:109"}, "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-d418adfcc783edb8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-flows.mjs:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-flows.mjs:77"}, "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-7b940628191f9c8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/MobileHeader.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/MobileHeader.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-58ba935b501599be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/ImpersonationBanner.tsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/ImpersonationBanner.tsx:12"}, "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-effde647a489d7ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Sidebar.tsx:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Sidebar.tsx:84"}, "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-9d91d06960c6fc4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Topbar.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Topbar.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-1ab341ccd31395e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/ContactSelect.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/ContactSelect.tsx:48"}, "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-8c8dc63114b19303", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/Sidebar.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/Sidebar.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2443d1e8c06b77d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/reset-password/page.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/reset-password/page.tsx:52"}, "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-bd73aae6f3f9fd6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/invite/page.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/invite/page.tsx:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c63b1ac5bc4402d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/login/page.tsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/login/page.tsx:64"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-351464adc2af88e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/forgot-password/page.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/forgot-password/page.tsx:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07343d986c26aef0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/booking/[token]/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/booking/[token]/page.tsx:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a6a53c411cc490ae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/settings/page.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/settings/page.tsx:23"}, "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-eb472dc73bd79506", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/page.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b2987758a6864d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/[id]/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/[id]/page.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-b4b7473bd88e39e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/analytics/page.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/analytics/page.tsx:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4a992c2ca5dcf01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/admins/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/admins/page.tsx:21"}, "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-a0aad9f9ca060f2d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/dashboard/page.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/dashboard/page.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-8b59544cdd1f4f5b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/coupons/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/coupons/page.tsx:21"}, "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-7efc2bb5277e0739", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/page.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6a95d4856d4ecff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/[id]/page.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/[id]/page.tsx:23"}, "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-92b78eeb891c4912", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/faqs/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/faqs/page.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-b58ed9e8b4450899", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/payments/page.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/payments/page.tsx:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e570ef21169df8c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/audit-logs/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/audit-logs/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-deccd8af1e96f1c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/broadcasts/page.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/broadcasts/page.tsx:23"}, "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-5771de729c46d859", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/subscriptions/page.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/subscriptions/page.tsx:36"}, "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-a891d6d472e3b595", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/plans/page.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/plans/page.tsx:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d344a9a3a237f85", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/tutorials/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/tutorials/page.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-ea4b294df50f7a1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/business-setup/page.tsx:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/business-setup/page.tsx:33"}, "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-b0a1ad76f805bb93", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/page.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/page.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f30a53707007020", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/project-updates/page.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/project-updates/page.tsx:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8658581eb30a7762", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/help/page.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/help/page.tsx: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-94cbc76e78f9bee4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/notifications/page.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/notifications/page.tsx:90"}, "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-f06df10ee46c0bd6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/communications/page.tsx:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/communications/page.tsx:51"}, "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-8d8a3a0d160c1d80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/leads/page.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/leads/page.tsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c81ac4923d06b73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/subscription/page.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/subscription/page.tsx:81"}, "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-dadbba2ec4ae97b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/page.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/page.tsx:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b6a763c43a0b926e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/new/page.tsx:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/new/page.tsx:75"}, "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-66cf43add3e4cd74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/[id]/page.tsx:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/[id]/page.tsx:122"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d5a398d26ee01df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/audit-log/page.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/audit-log/page.tsx:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-217d0167b7feaa36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/dashboard/page.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/dashboard/page.tsx:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a18c58f7cf30caf5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/item-requirements/page.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/item-requirements/page.tsx:23"}, "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-9cc0f5991f9b250d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/team/page.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/team/page.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-8b8c78bfb9467b12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/page.tsx:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/page.tsx:41"}, "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-88b0a5cd8145b552", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/templates/page.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/templates/page.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62dbd66ce3dcbf7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/page.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/page.tsx:62"}, "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-12172367ab709d6a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/[id]/page.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/[id]/page.tsx:49"}, "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-8c40c90a974d45af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/expenses/page.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/expenses/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-d274e433427fc5fa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/payments/page.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/payments/page.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28b1a632f287de71", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/scheduling/page.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/scheduling/page.tsx:45"}, "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-f2bc4fd89f7d4510", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/page.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/page.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-320e31b343f414cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/[id]/page.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/[id]/page.tsx:36"}, "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-5099f98b6e4d23c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/page.tsx:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-33b93468caf32379", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/edit/page.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/edit/page.tsx:49"}, "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-30b2dba10963c41c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/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-891a5274bfcf7ae0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/new/page.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/new/page.tsx:62"}, "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-ba4c2ccfc0f11f1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/[id]/page.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/[id]/page.tsx:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d940c7875d657bf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/feedback/page.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/feedback/page.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-cdda4c1627cfc1ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/page.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/page.tsx:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fec6671948609c1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/new/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/new/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-f26995dea64a5a72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/[id]/page.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/[id]/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-91c864267deedef3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/page.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/page.tsx:48"}, "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-f908ef44a19350e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/new/page.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/new/page.tsx:49"}, "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-626691724c8977c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/[id]/page.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/[id]/page.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-ef00202fc46cebc8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/register/page.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/register/page.tsx:69"}, "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-3c25582f6331d74a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/quotes/[id]/preview/page.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/quotes/[id]/preview/page.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bae639f6ce679172", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/feedback/respond/[token]/page.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/feedback/respond/[token]/page.tsx:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ec5f98b1e2cbdcc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/change-orders/[id]/preview/page.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/change-orders/[id]/preview/page.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-224aaab84602a3b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/invoices/[id]/pay/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/invoices/[id]/pay/page.tsx:21"}, "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-298eafa1523ac499", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:4"}, "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-fc4198d3c985d892", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/sw.bundle.js:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/sw.bundle.js: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-e85a143ceef1e597", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/index.BCnMPevh.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/index.BCnMPevh.js:1"}, "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-bcb0561ed9143396", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/snapshot.v8KI4P3m.js:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/snapshot.v8KI4P3m.js:2"}, "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-61fde1475798d78b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/urlMatch-BYQrIQwR.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/urlMatch-BYQrIQwR.js:1"}, "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-3aa4ba6239147812", "name": "Legacy-named symbol `unstable_legacy` in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49", "shortDescription": {"text": "Legacy-named symbol `unstable_legacy` in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "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-d162deda4b0d2e3b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:60"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `BUILD_NAME`, `CRON_SECRET`, `NODE_ENV`, `RESEND_FROM_EMAIL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23271"}, "properties": {"repository": "yogesh-112/cbtermi", "repoUrl": "https://github.com/yogesh-112/cbtermi", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: yogesh-112/cbtermi"}, "properties": {"repobilityId": 371444, "scanner": "foundry_dataset", "fingerprint": "189661239a570483abfb024ae7b2ba32eb9db764e4883f7474740361414291a6", "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": "yogesh-112/cbtermi#1", "issue_number": "1", "quality_tiers": {"unresolved": 4}, "repo_full_name": "yogesh-112/cbtermi", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-e29c554f6bf2459c", "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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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/yogesh-112/cbtermi", "source_id": "graph-query-motif_query-5138a36d86d7718a", "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": "yogesh-112/cbtermi", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: yogesh-112/cbtermi"}, "properties": {"repobilityId": 323884, "scanner": "foundry_dataset", "fingerprint": "0e444e04dfe7fdb4ff0bb9ec9ff6a35ca8574b5e3634c2d16802f1e108ab273a", "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": "yogesh-112/cbtermi#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": "yogesh-112/cbtermi", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-eb8581c5ede3c0b3", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 1, "schemas": 3, "routes_api": 3}, "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": 4, "design_schema_api_artifact_count": 6}, "text": "Comment chain pattern product: bad_chains\nRepo: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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-0b868986d7abe949\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/yogesh-112/cbtermi/pull/1\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: yogesh-112/cbtermi\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/yogesh-112/cbtermi/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 [cbtermi](https://vercel.com/cbv1yg/cbtermi). 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\\nThis automated pull re\"\n  },\n  {\n    \"id\": \"github-feedback-comment-db346609326f69ee\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/yogesh-112/cbtermi/pull/1#issuecomment-4452458578\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: yogesh-112/cbtermi\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/yogesh-112/cbtermi/pull/1#issuecomment-4452458578\\nTitle: \\nBody:\\n[vc]: #rTN9tp2neP2vNfDNPrSQ9pB5X+dKTLonmSjNieM9NKU=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJjYnRlcm1pIiwicHJvamVjdElkIjoicHJqX05TeVRQOVVHWWE3VEIwcU5QSzFGbmhtQTNuTDAiLCJyb29\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/yogesh-112/cbtermi", "source_id": "comment-chain-pattern-bad_chains-a26d859b6c0a0f5e", "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": "yogesh-112/cbtermi", "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: yogesh-112/cbtermi"}, "properties": {"repobilityId": 335305, "scanner": "foundry_dataset", "fingerprint": "3382df47278949f4f1cc1c64873fae76f1855860704a7472247e47fb6238d7d8", "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": "yogesh-112/cbtermi#1", "issue_number": "1", "quality_tiers": {"unresolved": 4}, "repo_full_name": "yogesh-112/cbtermi", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-d1decb38a5d7efe7", "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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#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: yogesh-112/cbtermi\nThread: yogesh-112/cbtermi#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: yogesh-112/cbtermi#1\nRepo: yogesh-112/cbtermi\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/yogesh-112/cbtermi", "source_id": "graph-query-motif_query-b5a4e5e9f277b8ec", "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": "yogesh-112/cbtermi", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"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-84ade83b09638131", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/generate-pdfs.js:24"}, "properties": {"repobilityId": "1ed285a7d2a52b41", "scanner": "scanner-primary", "fingerprint": "84ade83b09638131", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2931f70442e86c6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/generate-qa-excel.js:405"}, "properties": {"repobilityId": "9f654502cf0808eb", "scanner": "scanner-primary", "fingerprint": "2931f70442e86c6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bae82d4842522bca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-stripe.js:13"}, "properties": {"repobilityId": "f20a59db4bb0bd5b", "scanner": "scanner-primary", "fingerprint": "bae82d4842522bca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2cf8b56053f7188", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileHeader.tsx:49"}, "properties": {"repobilityId": "a868588695d60910", "scanner": "scanner-primary", "fingerprint": "e2cf8b56053f7188", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d167d0b49bd8a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Sidebar.tsx:158"}, "properties": {"repobilityId": "ed7c8f2901f0ddbb", "scanner": "scanner-primary", "fingerprint": "f4d167d0b49bd8a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87d9187b1f7c58cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Topbar.tsx:103"}, "properties": {"repobilityId": "9251e81c4877e2fb", "scanner": "scanner-primary", "fingerprint": "87d9187b1f7c58cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-570549857d0d6123", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/Sidebar.tsx:125"}, "properties": {"repobilityId": "f73793088ba7028e", "scanner": "scanner-primary", "fingerprint": "570549857d0d6123", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18b838a3d838dfdf", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/admin/Sidebar.tsx:94"}, "properties": {"repobilityId": "90b5e634e211183d", "scanner": "scanner-primary", "fingerprint": "18b838a3d838dfdf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-bc637e2dd857cd96", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/admin/ui.tsx:115"}, "properties": {"repobilityId": "0283c0c550acdc01", "scanner": "scanner-primary", "fingerprint": "bc637e2dd857cd96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cc5dc6433d5eeacf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/(shell)/faqs/page.tsx:87"}, "properties": {"repobilityId": "45bcd7b4396d7d21", "scanner": "scanner-primary", "fingerprint": "cc5dc6433d5eeacf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-033f253f47d2e503", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/settings/page.tsx:455"}, "properties": {"repobilityId": "ef4a8f413f358005", "scanner": "scanner-primary", "fingerprint": "033f253f47d2e503", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-469256fdfe40f7d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/help/page.tsx:352"}, "properties": {"repobilityId": "a8b98e9b8d055c1f", "scanner": "scanner-primary", "fingerprint": "469256fdfe40f7d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d7a532a510331d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/notifications/page.tsx:329"}, "properties": {"repobilityId": "ed8dedccd7a4f805", "scanner": "scanner-primary", "fingerprint": "8d7a532a510331d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1db220f1d90ef87a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/communications/page.tsx:181"}, "properties": {"repobilityId": "fa1c14a450b62440", "scanner": "scanner-primary", "fingerprint": "1db220f1d90ef87a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a2c52c254afd76f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/page.tsx:117"}, "properties": {"repobilityId": "932c893581861c45", "scanner": "scanner-primary", "fingerprint": "0a2c52c254afd76f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdac5cd40b33320c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/new/page.tsx:211"}, "properties": {"repobilityId": "065e24a8fa319806", "scanner": "scanner-primary", "fingerprint": "cdac5cd40b33320c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5d026407c88fd03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/projects/[id]/page.tsx:38"}, "properties": {"repobilityId": "126ff163cade3c00", "scanner": "scanner-primary", "fingerprint": "a5d026407c88fd03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39bdb32492e1639d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/audit-log/page.tsx:147"}, "properties": {"repobilityId": "2e500d40e98d49eb", "scanner": "scanner-primary", "fingerprint": "39bdb32492e1639d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cafad547ce49f236", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/page.tsx:212"}, "properties": {"repobilityId": "73048b17c3d2a98a", "scanner": "scanner-primary", "fingerprint": "cafad547ce49f236", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1b3f6fa9f95e704", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/team/page.tsx:201"}, "properties": {"repobilityId": "2206cc6ba724b762", "scanner": "scanner-primary", "fingerprint": "b1b3f6fa9f95e704", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-005778e59f7f1ae6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/customers/page.tsx:164"}, "properties": {"repobilityId": "30553b69cfb55e49", "scanner": "scanner-primary", "fingerprint": "005778e59f7f1ae6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdfe7ab47c684afd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/templates/page.tsx:234"}, "properties": {"repobilityId": "280bbbd178c5779b", "scanner": "scanner-primary", "fingerprint": "cdfe7ab47c684afd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fceb85f8120423a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/opportunities/page.tsx:206"}, "properties": {"repobilityId": "1cf08554cf6a5d5f", "scanner": "scanner-primary", "fingerprint": "fceb85f8120423a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e47c0b57abe95df0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/expenses/page.tsx:240"}, "properties": {"repobilityId": "0dafe54bc09f8efa", "scanner": "scanner-primary", "fingerprint": "e47c0b57abe95df0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5d06c43344562ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/page.tsx:243"}, "properties": {"repobilityId": "0338c0ea6484d785", "scanner": "scanner-primary", "fingerprint": "f5d06c43344562ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e524a329201f28b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/contacts/[id]/page.tsx:79"}, "properties": {"repobilityId": "0e1f56f7cc3e20d2", "scanner": "scanner-primary", "fingerprint": "e524a329201f28b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8220b294a3305b90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/profile/page.tsx:91"}, "properties": {"repobilityId": "dba9b08eb92c7d63", "scanner": "scanner-primary", "fingerprint": "8220b294a3305b90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61b32ec9844eaec1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/new/page.tsx:169"}, "properties": {"repobilityId": "a8d610db845efadd", "scanner": "scanner-primary", "fingerprint": "61b32ec9844eaec1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fad696d7341b546e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/quotes/[id]/page.tsx:122"}, "properties": {"repobilityId": "f59ba4cf19940a91", "scanner": "scanner-primary", "fingerprint": "fad696d7341b546e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f120d1a003f2dde6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/feedback/page.tsx:183"}, "properties": {"repobilityId": "db061bbf9af31216", "scanner": "scanner-primary", "fingerprint": "f120d1a003f2dde6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37715120dcb99588", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/email.ts:16"}, "properties": {"repobilityId": "1edc61b845e48cb6", "scanner": "scanner-primary", "fingerprint": "37715120dcb99588", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e88ef29354845ba5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:5"}, "properties": {"repobilityId": "549b3941c67b03c0", "scanner": "scanner-primary", "fingerprint": "e88ef29354845ba5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c07dd20d57443ee6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 playwright-report-bs/trace/sw.bundle.js:1"}, "properties": {"repobilityId": "47165a321f9b9f6f", "scanner": "scanner-primary", "fingerprint": "c07dd20d57443ee6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba3bd1d354326ab2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "properties": {"repobilityId": "ffc426a852391569", "scanner": "scanner-primary", "fingerprint": "ba3bd1d354326ab2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a3727a4fcd5faf2c", "level": "error", "message": {"text": "Possible secret in lib/users-store.ts"}, "properties": {"repobilityId": "cabfa42d3fb2ebda", "scanner": "scanner-primary", "fingerprint": "a3727a4fcd5faf2c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/users-store.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 423}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 423}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 424}}}]}, {"ruleId": "scanner-7fe95ff6b9fc616b", "level": "error", "message": {"text": "Possible secret in lib/i18n/en.ts"}, "properties": {"repobilityId": "bd4f5e79edc9c84c", "scanner": "scanner-primary", "fingerprint": "7fe95ff6b9fc616b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/en.ts"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 426}}}]}, {"ruleId": "scanner-d9f3beb2b497a954", "level": "error", "message": {"text": "Possible secret in lib/i18n/es.ts"}, "properties": {"repobilityId": "bd559f2ca6086641", "scanner": "scanner-primary", "fingerprint": "d9f3beb2b497a954", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/es.ts"}, "region": {"startLine": 427}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 425}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 426}}}]}, {"ruleId": "scanner-3685aba5ae70f9b1", "level": "error", "message": {"text": "Possible secret in lib/i18n/pt.ts"}, "properties": {"repobilityId": "3a40173d08ba942c", "scanner": "scanner-primary", "fingerprint": "3685aba5ae70f9b1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/i18n/pt.ts"}, "region": {"startLine": 427}}}]}, {"ruleId": "scanner-ca9f780429d3be8d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/index.html:58"}, "properties": {"repobilityId": "3410770871ccf761", "scanner": "scanner-primary", "fingerprint": "ca9f780429d3be8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/index.html"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-22f7697cf20b81f2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/index.html:57"}, "properties": {"repobilityId": "b7b0a0d08817e33d", "scanner": "scanner-primary", "fingerprint": "22f7697cf20b81f2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/index.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-13a15a1cc4dd8728", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in playwright-report-bs/trace/sw.bundle.js:1"}, "properties": {"repobilityId": "e1b3be6ff5a6948b", "scanner": "scanner-primary", "fingerprint": "13a15a1cc4dd8728", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/trace/sw.bundle.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5b20ee66d732cf43", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/index.html:36"}, "properties": {"repobilityId": "1a59c159a3e6f6c2", "scanner": "scanner-primary", "fingerprint": "5b20ee66d732cf43", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/trace/index.html"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-554f7e7b35f2ab42", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:50"}, "properties": {"repobilityId": "8f849cb0e51681ed", "scanner": "scanner-primary", "fingerprint": "554f7e7b35f2ab42", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-792a4faeb7e9d2c3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "properties": {"repobilityId": "3d23d404d6f4c2ca", "scanner": "scanner-primary", "fingerprint": "792a4faeb7e9d2c3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-a51b76526a4b8918", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report-bs/trace/assets/codeMirrorModule-Ds_H_9Yq.js:31"}, "properties": {"repobilityId": "2fe4bf644375997c", "scanner": "scanner-primary", "fingerprint": "a51b76526a4b8918", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report-bs/trace/assets/codeMirrorModule-Ds_H_9Yq.js"}, "region": {"startLine": 31}}}]}, {"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-c836740fa1deb5f3", "level": "note", "message": {"text": "Very large file: scripts/generate-pptx.mjs (847 lines)"}, "properties": {"repobilityId": "643b30e45ec9a1ab", "scanner": "scanner-primary", "fingerprint": "c836740fa1deb5f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a4085a89f3e79faa", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "cb437b3b75d5253f", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "90fb239b82b96e06", "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": "57fd631bd59ff3b0", "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": "fb3842209f16e907", "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": "95b58fcea0ed76b0", "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": "b8b4f28e774eeff7", "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": "176882edf2cd3d56", "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": "7af94a78fdd47965", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ec4ded5f5c5a8ab7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test.mjs:219"}, "properties": {"repobilityId": "64736b19f3b4ce31", "scanner": "scanner-primary", "fingerprint": "ec4ded5f5c5a8ab7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af31dd16382001a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/manual-test-retry2.mjs:109"}, "properties": {"repobilityId": "622a84693907a0c6", "scanner": "scanner-primary", "fingerprint": "af31dd16382001a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d418adfcc783edb8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-flows.mjs:77"}, "properties": {"repobilityId": "67067f09de8d196c", "scanner": "scanner-primary", "fingerprint": "d418adfcc783edb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b940628191f9c8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/MobileHeader.tsx:20"}, "properties": {"repobilityId": "a4afc85c3faaac5d", "scanner": "scanner-primary", "fingerprint": "7b940628191f9c8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58ba935b501599be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/ImpersonationBanner.tsx:12"}, "properties": {"repobilityId": "78153aafa347bd80", "scanner": "scanner-primary", "fingerprint": "58ba935b501599be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-effde647a489d7ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Sidebar.tsx:84"}, "properties": {"repobilityId": "d8279aa9cc8b1fdb", "scanner": "scanner-primary", "fingerprint": "effde647a489d7ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d91d06960c6fc4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/layout/Topbar.tsx:53"}, "properties": {"repobilityId": "3a41be7f80157362", "scanner": "scanner-primary", "fingerprint": "9d91d06960c6fc4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ab341ccd31395e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/ContactSelect.tsx:48"}, "properties": {"repobilityId": "3b35e8ea7330af41", "scanner": "scanner-primary", "fingerprint": "1ab341ccd31395e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c8dc63114b19303", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/Sidebar.tsx:59"}, "properties": {"repobilityId": "ce29043b10ae8214", "scanner": "scanner-primary", "fingerprint": "8c8dc63114b19303", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2443d1e8c06b77d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/reset-password/page.tsx:52"}, "properties": {"repobilityId": "fc66cc76f7097235", "scanner": "scanner-primary", "fingerprint": "c2443d1e8c06b77d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd73aae6f3f9fd6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/invite/page.tsx:32"}, "properties": {"repobilityId": "0a7ba87b2009c1a5", "scanner": "scanner-primary", "fingerprint": "bd73aae6f3f9fd6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c63b1ac5bc4402d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/login/page.tsx:64"}, "properties": {"repobilityId": "8ade3af730f3b1c2", "scanner": "scanner-primary", "fingerprint": "2c63b1ac5bc4402d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-351464adc2af88e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/forgot-password/page.tsx:32"}, "properties": {"repobilityId": "09a2564e0f2459c9", "scanner": "scanner-primary", "fingerprint": "351464adc2af88e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07343d986c26aef0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/booking/[token]/page.tsx:18"}, "properties": {"repobilityId": "cc06d211b84f668a", "scanner": "scanner-primary", "fingerprint": "07343d986c26aef0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6a53c411cc490ae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/settings/page.tsx:23"}, "properties": {"repobilityId": "fd4a10e17b46c23d", "scanner": "scanner-primary", "fingerprint": "a6a53c411cc490ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb472dc73bd79506", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/page.tsx:29"}, "properties": {"repobilityId": "d7eb45e8231e2829", "scanner": "scanner-primary", "fingerprint": "eb472dc73bd79506", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b2987758a6864d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/users/[id]/page.tsx:24"}, "properties": {"repobilityId": "4a170ca909a5c196", "scanner": "scanner-primary", "fingerprint": "0b2987758a6864d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4b7473bd88e39e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/analytics/page.tsx:68"}, "properties": {"repobilityId": "91e32d0f67c7bcf3", "scanner": "scanner-primary", "fingerprint": "b4b7473bd88e39e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d4a992c2ca5dcf01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/admins/page.tsx:21"}, "properties": {"repobilityId": "8b7072bc5a4e54f4", "scanner": "scanner-primary", "fingerprint": "d4a992c2ca5dcf01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0aad9f9ca060f2d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/dashboard/page.tsx:42"}, "properties": {"repobilityId": "a9cde9b20b608e15", "scanner": "scanner-primary", "fingerprint": "a0aad9f9ca060f2d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b59544cdd1f4f5b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/coupons/page.tsx:21"}, "properties": {"repobilityId": "a1e660bf2b280888", "scanner": "scanner-primary", "fingerprint": "8b59544cdd1f4f5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7efc2bb5277e0739", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/page.tsx:29"}, "properties": {"repobilityId": "7cfd26dc65e3022f", "scanner": "scanner-primary", "fingerprint": "7efc2bb5277e0739", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6a95d4856d4ecff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/businesses/[id]/page.tsx:23"}, "properties": {"repobilityId": "733cd529239dac1b", "scanner": "scanner-primary", "fingerprint": "e6a95d4856d4ecff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-92b78eeb891c4912", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/faqs/page.tsx:24"}, "properties": {"repobilityId": "33d2dd12c9c7bfc6", "scanner": "scanner-primary", "fingerprint": "92b78eeb891c4912", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b58ed9e8b4450899", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/payments/page.tsx:15"}, "properties": {"repobilityId": "e1ced8eeccdccb56", "scanner": "scanner-primary", "fingerprint": "b58ed9e8b4450899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e570ef21169df8c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/audit-logs/page.tsx:30"}, "properties": {"repobilityId": "44daedd453adde4c", "scanner": "scanner-primary", "fingerprint": "e570ef21169df8c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-deccd8af1e96f1c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/broadcasts/page.tsx:23"}, "properties": {"repobilityId": "6cd6ed6d7a78a6be", "scanner": "scanner-primary", "fingerprint": "deccd8af1e96f1c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5771de729c46d859", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/subscriptions/page.tsx:36"}, "properties": {"repobilityId": "623b4054498435a0", "scanner": "scanner-primary", "fingerprint": "5771de729c46d859", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a891d6d472e3b595", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/plans/page.tsx:22"}, "properties": {"repobilityId": "3e965249a98c6ade", "scanner": "scanner-primary", "fingerprint": "a891d6d472e3b595", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d344a9a3a237f85", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/(shell)/tutorials/page.tsx:24"}, "properties": {"repobilityId": "712226b4979ffd03", "scanner": "scanner-primary", "fingerprint": "5d344a9a3a237f85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea4b294df50f7a1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/business-setup/page.tsx:33"}, "properties": {"repobilityId": "0114cb319120b4bb", "scanner": "scanner-primary", "fingerprint": "ea4b294df50f7a1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b0a1ad76f805bb93", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/settings/page.tsx:20"}, "properties": {"repobilityId": "405b8341f9045611", "scanner": "scanner-primary", "fingerprint": "b0a1ad76f805bb93", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2f30a53707007020", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/project-updates/page.tsx:27"}, "properties": {"repobilityId": "030ccfa2f699906f", "scanner": "scanner-primary", "fingerprint": "2f30a53707007020", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8658581eb30a7762", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/help/page.tsx:93"}, "properties": {"repobilityId": "6abc3b138bdbd75c", "scanner": "scanner-primary", "fingerprint": "8658581eb30a7762", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94cbc76e78f9bee4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/notifications/page.tsx:90"}, "properties": {"repobilityId": "8f4357aed6073d8d", "scanner": "scanner-primary", "fingerprint": "94cbc76e78f9bee4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f06df10ee46c0bd6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/communications/page.tsx:51"}, "properties": {"repobilityId": "a4d4ab82cc3fd171", "scanner": "scanner-primary", "fingerprint": "f06df10ee46c0bd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d8a3a0d160c1d80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/leads/page.tsx:54"}, "properties": {"repobilityId": "6326cf82779164d1", "scanner": "scanner-primary", "fingerprint": "8d8a3a0d160c1d80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7c81ac4923d06b73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/subscription/page.tsx:81"}, "properties": {"repobilityId": "b554a8bd565f4f35", "scanner": "scanner-primary", "fingerprint": "7c81ac4923d06b73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dadbba2ec4ae97b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/page.tsx:32"}, "properties": {"repobilityId": "b913dd2cd3e26244", "scanner": "scanner-primary", "fingerprint": "dadbba2ec4ae97b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6a763c43a0b926e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/new/page.tsx:75"}, "properties": {"repobilityId": "f1bb34cf83b96a18", "scanner": "scanner-primary", "fingerprint": "b6a763c43a0b926e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66cf43add3e4cd74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/projects/[id]/page.tsx:122"}, "properties": {"repobilityId": "36f47dc56855ed35", "scanner": "scanner-primary", "fingerprint": "66cf43add3e4cd74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d5a398d26ee01df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/audit-log/page.tsx:39"}, "properties": {"repobilityId": "0de3e93c676c9b96", "scanner": "scanner-primary", "fingerprint": "6d5a398d26ee01df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-217d0167b7feaa36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/dashboard/page.tsx:39"}, "properties": {"repobilityId": "928b40affe4d54b8", "scanner": "scanner-primary", "fingerprint": "217d0167b7feaa36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a18c58f7cf30caf5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/item-requirements/page.tsx:23"}, "properties": {"repobilityId": "bcd0d014dcc83eb7", "scanner": "scanner-primary", "fingerprint": "a18c58f7cf30caf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9cc0f5991f9b250d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/team/page.tsx:42"}, "properties": {"repobilityId": "54d4ec9c8cf68df9", "scanner": "scanner-primary", "fingerprint": "9cc0f5991f9b250d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b8c78bfb9467b12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/page.tsx:41"}, "properties": {"repobilityId": "1cb93d3b3b6fdf1e", "scanner": "scanner-primary", "fingerprint": "8b8c78bfb9467b12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88b0a5cd8145b552", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/templates/page.tsx:29"}, "properties": {"repobilityId": "2f7a979c531804f6", "scanner": "scanner-primary", "fingerprint": "88b0a5cd8145b552", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62dbd66ce3dcbf7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/page.tsx:62"}, "properties": {"repobilityId": "c9e19081979089a5", "scanner": "scanner-primary", "fingerprint": "62dbd66ce3dcbf7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12172367ab709d6a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/opportunities/[id]/page.tsx:49"}, "properties": {"repobilityId": "9cc9fc4ca15754ab", "scanner": "scanner-primary", "fingerprint": "12172367ab709d6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c40c90a974d45af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/expenses/page.tsx:40"}, "properties": {"repobilityId": "d8f3d3c2f3e92d3b", "scanner": "scanner-primary", "fingerprint": "8c40c90a974d45af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d274e433427fc5fa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/payments/page.tsx:44"}, "properties": {"repobilityId": "a6eccd79c98ac974", "scanner": "scanner-primary", "fingerprint": "d274e433427fc5fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28b1a632f287de71", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/scheduling/page.tsx:45"}, "properties": {"repobilityId": "2406ccf977556603", "scanner": "scanner-primary", "fingerprint": "28b1a632f287de71", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2bc4fd89f7d4510", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/page.tsx:53"}, "properties": {"repobilityId": "1189fdc8327b4459", "scanner": "scanner-primary", "fingerprint": "f2bc4fd89f7d4510", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-320e31b343f414cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/contacts/[id]/page.tsx:36"}, "properties": {"repobilityId": "7df9b1daa582a01d", "scanner": "scanner-primary", "fingerprint": "320e31b343f414cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5099f98b6e4d23c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/page.tsx:18"}, "properties": {"repobilityId": "927f10486b2aa85d", "scanner": "scanner-primary", "fingerprint": "5099f98b6e4d23c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33b93468caf32379", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/profile/edit/page.tsx:49"}, "properties": {"repobilityId": "083191670bf3de62", "scanner": "scanner-primary", "fingerprint": "33b93468caf32379", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30b2dba10963c41c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/page.tsx:30"}, "properties": {"repobilityId": "33443e6e12467673", "scanner": "scanner-primary", "fingerprint": "30b2dba10963c41c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-891a5274bfcf7ae0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/new/page.tsx:62"}, "properties": {"repobilityId": "b9bc42810be0f713", "scanner": "scanner-primary", "fingerprint": "891a5274bfcf7ae0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba4c2ccfc0f11f1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/quotes/[id]/page.tsx:31"}, "properties": {"repobilityId": "43ab7c47d967800e", "scanner": "scanner-primary", "fingerprint": "ba4c2ccfc0f11f1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d940c7875d657bf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/feedback/page.tsx:24"}, "properties": {"repobilityId": "584f6d16c60763a6", "scanner": "scanner-primary", "fingerprint": "d940c7875d657bf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cdda4c1627cfc1ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/page.tsx:27"}, "properties": {"repobilityId": "f4ecdcfacf912400", "scanner": "scanner-primary", "fingerprint": "cdda4c1627cfc1ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fec6671948609c1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/new/page.tsx:30"}, "properties": {"repobilityId": "5a58eae16036da78", "scanner": "scanner-primary", "fingerprint": "fec6671948609c1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f26995dea64a5a72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/change-orders/[id]/page.tsx:30"}, "properties": {"repobilityId": "a9279cde28158cc6", "scanner": "scanner-primary", "fingerprint": "f26995dea64a5a72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91c864267deedef3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/page.tsx:48"}, "properties": {"repobilityId": "394f354dcd348546", "scanner": "scanner-primary", "fingerprint": "91c864267deedef3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f908ef44a19350e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/new/page.tsx:49"}, "properties": {"repobilityId": "57edef91f029fc0c", "scanner": "scanner-primary", "fingerprint": "f908ef44a19350e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-626691724c8977c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/invoices/[id]/page.tsx:37"}, "properties": {"repobilityId": "bcdb0e527862dd21", "scanner": "scanner-primary", "fingerprint": "626691724c8977c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef00202fc46cebc8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/register/page.tsx:69"}, "properties": {"repobilityId": "6c703872c3d0c614", "scanner": "scanner-primary", "fingerprint": "ef00202fc46cebc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c25582f6331d74a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/quotes/[id]/preview/page.tsx:20"}, "properties": {"repobilityId": "87659b0c6cc3af0b", "scanner": "scanner-primary", "fingerprint": "3c25582f6331d74a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bae639f6ce679172", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/feedback/respond/[token]/page.tsx:39"}, "properties": {"repobilityId": "8a8b3dea722abc7b", "scanner": "scanner-primary", "fingerprint": "bae639f6ce679172", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ec5f98b1e2cbdcc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/change-orders/[id]/preview/page.tsx:19"}, "properties": {"repobilityId": "028eea761d5d698e", "scanner": "scanner-primary", "fingerprint": "4ec5f98b1e2cbdcc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-224aaab84602a3b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/invoices/[id]/pay/page.tsx:21"}, "properties": {"repobilityId": "ea92e5136d7dddb2", "scanner": "scanner-primary", "fingerprint": "224aaab84602a3b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-298eafa1523ac499", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/uiMode.C2Efnu2P.js:4"}, "properties": {"repobilityId": "d4c1a230b180d1ea", "scanner": "scanner-primary", "fingerprint": "298eafa1523ac499", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc4198d3c985d892", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/sw.bundle.js:3"}, "properties": {"repobilityId": "b9c0a2856043cbf4", "scanner": "scanner-primary", "fingerprint": "fc4198d3c985d892", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e85a143ceef1e597", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/index.BCnMPevh.js:1"}, "properties": {"repobilityId": "9be0a331a6d36960", "scanner": "scanner-primary", "fingerprint": "e85a143ceef1e597", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcb0561ed9143396", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/snapshot.v8KI4P3m.js:2"}, "properties": {"repobilityId": "cc7145ae7b17a84a", "scanner": "scanner-primary", "fingerprint": "bcb0561ed9143396", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61fde1475798d78b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/urlMatch-BYQrIQwR.js:1"}, "properties": {"repobilityId": "d8529995b70fc4bd", "scanner": "scanner-primary", "fingerprint": "61fde1475798d78b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3aa4ba6239147812", "level": "note", "message": {"text": "Legacy-named symbol `unstable_legacy` in playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:49"}, "properties": {"repobilityId": "e6cc40dd798b75ac", "scanner": "scanner-primary", "fingerprint": "3aa4ba6239147812", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d162deda4b0d2e3b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 playwright-report-bs/trace/assets/defaultSettingsView-D31xz8zv.js:60"}, "properties": {"repobilityId": "345fba782ba44cd7", "scanner": "scanner-primary", "fingerprint": "d162deda4b0d2e3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}