{"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: Sastinocode/certifive", "shortDescription": {"text": "Foundry mined unresolved feedback: Sastinocode/certifive"}, "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: Sastinocode/certifive\nThread: Sastinocode/certifive#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: Sastinocode/certifive\nThread: Sastinocode/certifive#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Sastinocode/certifive#1\nRepo: Sastinocode/certifive\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 12\nEdges: 20\nNode types: {'pr_file': 3, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge ty"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: Sastinocode/certifive", "shortDescription": {"text": "Foundry mined bad chains: Sastinocode/certifive"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: Sastinocode/certifive\nThread: Sastinocode/certifive#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\nChain evidence:\nIssue/PR evidence chain: Sastinocode/certifive#1\nRepo: Sastinocode/certifive\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'build_install_failure': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'ui_or_frontend': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-89d6a727e9204a85\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"build_install_failure\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/Sastinocode/"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "cwe": "", "owasp": ""}}, {"id": "scanner-80239a566901b1c6", "name": "Stray `console.log` in TS/JS \u2014 client/src/main.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 client/src/main.tsx: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-392414bfb9e8737c", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFolderManager.tsx:720", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFolderManager.tsx:720"}, "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-dfcaa6eb8a0c6eeb", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CertDataDrawer.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CertDataDrawer.tsx:373"}, "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-2aee0c497e06ef72", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFlowWizard.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFlowWizard.tsx:96"}, "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-0f72e723b9e11bd7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/certificates/CertificateUploadDialog.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/certificates/CertificateUploadDialog.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7b3db9745e9c497", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81"}, "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-2a57f3dd13ee3b77", "name": "TODO/FIXME marker in shipping code \u2014 client/src/components/ui/file-upload.tsx:196", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/components/ui/file-upload.tsx:196"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbffcb4f17f8b9b5", "name": "\"active\" state uses light bg in a dark theme \u2014 client/src/components/public/Stepper.tsx:25", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 client/src/components/public/Stepper.tsx:25"}, "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-d5dc3145d95ec469", "name": "Icon-only button without accessible name \u2014 client/src/pages/Invoices.tsx:553", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/pages/Invoices.tsx:553"}, "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-cd5fd0e098f75ac6", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Invoices.tsx:508", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Invoices.tsx:508"}, "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-5286fb9065fcaa96", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PublicCEEForm.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PublicCEEForm.tsx:286"}, "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-d4c322c4bcb38d60", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientPortal.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientPortal.tsx:256"}, "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-d390f22069aef82c", "name": "Icon-only button without accessible name \u2014 client/src/pages/RecogidaMovil.tsx:1249", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/pages/RecogidaMovil.tsx:1249"}, "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-de84bb992f457862", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/RecogidaMovil.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/RecogidaMovil.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-130e61a26a188918", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/reports.tsx:1141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/reports.tsx:1141"}, "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-6ee0e69e2dfa1175", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/view-certification-request.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/view-certification-request.tsx:300"}, "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-184fb8fcaafd0fa8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/dashboard.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/dashboard.tsx:307"}, "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-c5bc639cbe3c1de6", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/whatsapp.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/whatsapp.tsx:408"}, "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-563cb952592f7e40", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/certificates.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/certificates.tsx:175"}, "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-e0529ecc9f0c4bd3", "name": "Icon-only button without accessible name \u2014 client/src/pages/properties.tsx:521", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/pages/properties.tsx:521"}, "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-f546967bd61ed142", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/properties.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/properties.tsx:200"}, "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-00026b2eed8f52fa", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CertifierLanding.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CertifierLanding.tsx:149"}, "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-f524885991803aef", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Certifications.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Certifications.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9765ec92c5d3e7c", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/VisitForm.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/VisitForm.tsx:294"}, "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-57a88205e328ef66", "name": "Stray `console.log` in TS/JS \u2014 server/email.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/email.ts:38"}, "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-ef87b0e00fab8653", "name": "Stray `console.log` in TS/JS \u2014 server/startup-migration.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/startup-migration.ts:153"}, "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-768c4a44136f592a", "name": "Stray `console.log` in TS/JS \u2014 server/expiry-cron.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/expiry-cron.ts:51"}, "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-5dd50ca58cb8e107", "name": "Stray `console.log` in TS/JS \u2014 server/notifications.ts:296", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/notifications.ts:296"}, "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-9d3ee09087d9926b", "name": "Stray `console.log` in TS/JS \u2014 server/vite.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/vite.ts:20"}, "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-07099973092b820a", "name": "Stray `console.log` in TS/JS \u2014 server/digest.ts:250", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/digest.ts:250"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1bfdeb960d1183a", "name": "TODO/FIXME marker in shipping code \u2014 server/routes/misc.ts:197", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/routes/misc.ts:197"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b8def8b0fd03a66", "name": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate6.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate6.ts:51"}, "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-4e53c8e5f4360cf0", "name": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate4.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate4.ts:45"}, "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-f5282bbb7f925d76", "name": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate5.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate5.ts:144"}, "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-8df37d9232a59094", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81"}, "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-2892bfec53a9af94", "name": "Insecure pattern 'local_storage_auth_token' in client/src/contexts/AuthContext.tsx:110", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/contexts/AuthContext.tsx:110"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59e9c2ee0093f965", "name": "Insecure pattern 'local_storage_auth_token' in client/src/lib/queryClient.ts:21", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/lib/queryClient.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62d937cd28a9a06b", "name": "Insecure pattern 'local_storage_auth_token' in client/src/pages/Login.tsx:45", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/pages/Login.tsx:45"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d51d18a56b86400e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-849e7f05ffdaa6db", "name": "Very large file: client/src/pages/settings.tsx (1219 lines)", "shortDescription": {"text": "Very large file: client/src/pages/settings.tsx (1219 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-8c6be03229b8d2c5", "name": "Very large file: client/src/pages/PublicCEEForm.tsx (1168 lines)", "shortDescription": {"text": "Very large file: client/src/pages/PublicCEEForm.tsx (1168 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-1a7ac2cbd8fa32de", "name": "Very large file: client/src/pages/Landing.tsx (1062 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Landing.tsx (1062 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-75af0d461a02f594", "name": "Very large file: client/src/pages/RecogidaMovil.tsx (1288 lines)", "shortDescription": {"text": "Very large file: client/src/pages/RecogidaMovil.tsx (1288 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-c16c6f4918fe065e", "name": "Very large file: client/src/pages/reports.tsx (1392 lines)", "shortDescription": {"text": "Very large file: client/src/pages/reports.tsx (1392 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-f3cafd8cf2144a0b", "name": "Very large file: client/src/pages/enhanced-certification-form.tsx (992 lines)", "shortDescription": {"text": "Very large file: client/src/pages/enhanced-certification-form.tsx (992 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-fa6f20f9f2726413", "name": "Very large file: client/src/pages/certificates.tsx (1057 lines)", "shortDescription": {"text": "Very large file: client/src/pages/certificates.tsx (1057 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-ba033fe05937e0aa", "name": "Very large file: client/src/pages/Certifications.tsx (1484 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Certifications.tsx (1484 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-efe64b9bdb4ae81e", "name": "Very large file: client/src/pages/FormularioTecnicoPublico.tsx (1653 lines)", "shortDescription": {"text": "Very large file: client/src/pages/FormularioTecnicoPublico.tsx (1653 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-818d60815d79548a", "name": "Very large file: shared/schema.ts (870 lines)", "shortDescription": {"text": "Very large file: shared/schema.ts (870 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": "14 test file(s) for 218 source file(s) (ratio 0.06). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6611ff22818b6a92", "name": "31 TODO/FIXME markers", "shortDescription": {"text": "31 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 41 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 327 placeholder/mock markers across 60 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e5faa82ef5c5dd8", "name": "Network/subprocess call without timeout or try/except \u2014 fix_reports.py:75", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 fix_reports.py:75"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de6f20a12c5231ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/public/sw.js:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/public/sw.js:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f58dd5de4eca2c9e", "name": "Commented-code block (5 lines) in client/src/App.tsx:141", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/App.tsx:141"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db026c2053025b98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/CertDetailPanel.tsx:172", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/CertDetailPanel.tsx:172"}, "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-7d509e0ad302597a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ClientFolderManager.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ClientFolderManager.tsx:92"}, "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-4e6926da775bdf73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/GlobalSearch.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/GlobalSearch.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-6dd86f2ece76a1c0", "name": "Legacy-named symbol `content_copy` in client/src/components/CertDataDrawer.tsx:289", "shortDescription": {"text": "Legacy-named symbol `content_copy` in client/src/components/CertDataDrawer.tsx:289"}, "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-6a4751ef78e62442", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/certificates/CertificateUploadDialog.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/certificates/CertificateUploadDialog.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-5e4d91c1baaaef95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ui/file-upload.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ui/file-upload.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-48b85e5fc058cc16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:13"}, "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-841c484e5ff42d5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/settings.tsx:219", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/settings.tsx: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-56e89ff1ba109595", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicCEEForm.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicCEEForm.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-6ec213f88be35f7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ClientPortal.tsx:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ClientPortal.tsx:123"}, "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-8a91e2749aef2c28", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicSolicitud.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicSolicitud.tsx:103"}, "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-e80f2fe167b41dab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/RecogidaMovil.tsx:408", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/RecogidaMovil.tsx:408"}, "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-50b1f85a4c97d758", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certification-form.tsx:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certification-form.tsx:104"}, "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-b1bd810c39828d8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certificates.tsx:282", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certificates.tsx:282"}, "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-e8580f2d3c2fa6d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/properties.tsx:226", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/properties.tsx:226"}, "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-d83527eb801c0881", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/public-quote.tsx:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/public-quote.tsx:135"}, "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-7fdcd781c0291a0e", "name": "Legacy-named symbol `content_copy` in client/src/pages/Certifications.tsx:117", "shortDescription": {"text": "Legacy-named symbol `content_copy` in client/src/pages/Certifications.tsx:117"}, "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-963efba1092e604b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/VisitForm.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/VisitForm.tsx:208"}, "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-ec1e467ed45e7c5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudSeguimiento.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudSeguimiento.tsx:46"}, "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-57ba7f69494f1e57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudPago.tsx:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudPago.tsx:104"}, "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-f0d66cf9f5f0e09e", "name": "Commented-code block (6 lines) in shared/schema.ts:585", "shortDescription": {"text": "Commented-code block (6 lines) in shared/schema.ts:585"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36a0f78ec10a563e", "name": "Commented-code block (5 lines) in server/cloudinary.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in server/cloudinary.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0532989baa71771", "name": "Legacy-named symbol `monthlyIncome_legacy` in server/routes/dashboard.ts:165", "shortDescription": {"text": "Legacy-named symbol `monthlyIncome_legacy` in server/routes/dashboard.ts:165"}, "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-6f59bc25dff05a26", "name": "Commented-code block (5 lines) in server/routes/subscription.ts:110", "shortDescription": {"text": "Commented-code block (5 lines) in server/routes/subscription.ts:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73227c824b8998d6", "name": "Commented-code block (6 lines) in design_handoff_certifive/reference/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in design_handoff_certifive/reference/tweaks-panel.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3f21fc70d43d3a9", "name": "Commented-code block (6 lines) in attached_assets/tweaks-panel_1777729070829.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in attached_assets/tweaks-panel_1777729070829.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAIL`, `ADMIN_PASSWORD`, `ADMIN_USERNAME`, `CLOUDINARY_URL`, `PGPASSWORD`, `REPL_ID`, `VITE_STRIPE_PUBLIC_KEY`. 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}}, {"id": "scanner-9b6c492c6a564cbc", "name": "Frontend route `/presupuesto/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/presupuesto/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b255a675c64fd109", "name": "Frontend route `/cotizacion/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/cotizacion/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8bb96b52c4998390", "name": "Frontend route `/solicitud/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/solicitud/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fcd38bc545774ba3", "name": "Frontend route `/formulario-cee/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/formulario-cee/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad0034d48bab1898", "name": "Frontend route `/formulario-tecnico/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/formulario-tecnico/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61cc8e67e1aace92", "name": "Frontend route `/pay/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/pay/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3737270328148b0d", "name": "Frontend route `/certificacion-cliente/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/certificacion-cliente/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f797cf3c94dcfc46", "name": "Frontend route `/generador-tarifas` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/generador-tarifas` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e739528f75d4829d", "name": "Frontend route `/recogida/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/recogida/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ce3fadde1bd9512", "name": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-270bca32d3c6d67a", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d6a332391242d9d2", "name": "Frontend route `/certificacion/:id?` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/certificacion/:id?` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b93a6c76c1aba81", "name": "Frontend route `/certificacion-request/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/certificacion-request/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bdb01bd71b8a19ca", "name": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95ff2bdb7c3285de", "name": "Frontend route `/demo-flujo` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/demo-flujo` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a22e6482dc354962", "name": "Frontend route `/facturacion` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/facturacion` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae3a2d5c172c3190", "name": "Frontend route `/marketing` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/marketing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7ca40b3659819a4", "name": "Frontend route `/automatizaciones` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/automatizaciones` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27ec1602a2b75e65", "name": "Frontend route `/stripe` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/stripe` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6eed814f8ea0d019", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-afd9a7cb032e24bb", "name": "Frontend route `/revision-tecnica/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/revision-tecnica/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7dcce918b21be2c1", "name": "Frontend route `/visita/:id` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/visita/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ef8087ba5f39582", "name": "Frontend route `/success` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/success` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-168780054c580dee", "name": "Frontend route `/cancel` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/cancel` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a93605e45a4d56e", "name": "Frontend route `/renovar-suscripci\u00f3n` has no Link/navigate to it \u2014 client/src/App.tsx", "shortDescription": {"text": "Frontend route `/renovar-suscripci\u00f3n` has no Link/navigate to it \u2014 client/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-222e4a04a642accf", "name": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(cleanRc)} (client/src/components/CatastroSearch.tsx:48)", "shortDescription": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(cleanRc)} (client/src/components/CatastroSearch.tsx:48)"}, "fullDescription": {"text": "`client/src/components/CatastroSearch.tsx:48` calls `GET /api/catastro/lookup?rc=${encodeURIComponent(cleanRc)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/catastro/lookup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e264997694a84a13", "name": "Dangling fetch: GET /api/folders/${folderId}/documents (client/src/components/ClientFolderManager.tsx:92)", "shortDescription": {"text": "Dangling fetch: GET /api/folders/${folderId}/documents (client/src/components/ClientFolderManager.tsx:92)"}, "fullDescription": {"text": "`client/src/components/ClientFolderManager.tsx:92` calls `GET /api/folders/${folderId}/documents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/folders/<p>/documents`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cd5fc68a2c56140e", "name": "Dangling fetch: GET /api/folders/${folderId}/certification (client/src/components/ClientFolderManager.tsx:103)", "shortDescription": {"text": "Dangling fetch: GET /api/folders/${folderId}/certification (client/src/components/ClientFolderManager.tsx:103)"}, "fullDescription": {"text": "`client/src/components/ClientFolderManager.tsx:103` calls `GET /api/folders/${folderId}/certification` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/folders/<p>/certification`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ea4e485143a4c67", "name": "Dangling fetch: POST /api/folders/${folderId}/upload (client/src/components/ClientFolderManager.tsx:113)", "shortDescription": {"text": "Dangling fetch: POST /api/folders/${folderId}/upload (client/src/components/ClientFolderManager.tsx:113)"}, "fullDescription": {"text": "`client/src/components/ClientFolderManager.tsx:113` calls `POST /api/folders/${folderId}/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/folders/<p>/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51fb2ed0d9938876", "name": "Dangling fetch: POST /api/folders/${folderId}/upload-certificate (client/src/components/certificates/CertificateUploadDi", "shortDescription": {"text": "Dangling fetch: POST /api/folders/${folderId}/upload-certificate (client/src/components/certificates/CertificateUploadDialog.tsx:32)"}, "fullDescription": {"text": "`client/src/components/certificates/CertificateUploadDialog.tsx:32` calls `POST /api/folders/${folderId}/upload-certificate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/folders/<p>/upload-certificate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63607fc1cc892ddb", "name": "Dangling fetch: POST /api/certifications/${certificationId}/photos (client/src/components/ui/file-upload.tsx:32)", "shortDescription": {"text": "Dangling fetch: POST /api/certifications/${certificationId}/photos (client/src/components/ui/file-upload.tsx:32)"}, "fullDescription": {"text": "`client/src/components/ui/file-upload.tsx:32` calls `POST /api/certifications/${certificationId}/photos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certifications/<p>/photos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f35cef8eee180c89", "name": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:209)", "shortDescription": {"text": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:209)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:209` calls `GET /api/profile/validation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profile/validation`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c5ec048fdb5ec3d6", "name": "Dangling fetch: PATCH /api/profile/update (client/src/pages/settings.tsx:259)", "shortDescription": {"text": "Dangling fetch: PATCH /api/profile/update (client/src/pages/settings.tsx:259)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:259` calls `PATCH /api/profile/update` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profile/update`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a918fa3b9e5ae8c4", "name": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:265)", "shortDescription": {"text": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:265)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:265` calls `GET /api/profile/validation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profile/validation`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e3e6f9499aa424d", "name": "Dangling fetch: POST /api/settings/billing (client/src/pages/settings.tsx:277)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/billing (client/src/pages/settings.tsx:277)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:277` calls `POST /api/settings/billing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/billing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3ac9a5fa9d66eb9", "name": "Dangling fetch: POST /api/settings/certificates (client/src/pages/settings.tsx:329)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/certificates (client/src/pages/settings.tsx:329)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:329` calls `POST /api/settings/certificates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/certificates`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a094d74ee5f06f48", "name": "Dangling fetch: GET /api/backup/status (client/src/pages/settings.tsx:349)", "shortDescription": {"text": "Dangling fetch: GET /api/backup/status (client/src/pages/settings.tsx:349)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:349` calls `GET /api/backup/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backup/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2f179df41bdc54c4", "name": "Dangling fetch: POST /api/backup/create (client/src/pages/settings.tsx:363)", "shortDescription": {"text": "Dangling fetch: POST /api/backup/create (client/src/pages/settings.tsx:363)"}, "fullDescription": {"text": "`client/src/pages/settings.tsx:363` calls `POST /api/backup/create` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/backup/create`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2f04ae1323c917e4", "name": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/PublicSolicitud.tsx:123)", "shortDescription": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/PublicSolicitud.tsx:123)"}, "fullDescription": {"text": "`client/src/pages/PublicSolicitud.tsx:123` calls `GET /api/catastro/lookup?rc=${encodeURIComponent(rc)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/catastro/lookup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a4d6c869369baf58", "name": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/enhanced-certification-form.tsx:", "shortDescription": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/enhanced-certification-form.tsx:164)"}, "fullDescription": {"text": "`client/src/pages/enhanced-certification-form.tsx:164` calls `GET /api/catastro/lookup?rc=${encodeURIComponent(rc)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/catastro/lookup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-068a9a71a0cd978c", "name": "Dangling fetch: POST /api/public/certification-form/${uniqueLink} (client/src/pages/certification-form.tsx:104)", "shortDescription": {"text": "Dangling fetch: POST /api/public/certification-form/${uniqueLink} (client/src/pages/certification-form.tsx:104)"}, "fullDescription": {"text": "`client/src/pages/certification-form.tsx:104` calls `POST /api/public/certification-form/${uniqueLink}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/public/certification-form/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-50245301fa83fa8b", "name": "Dangling fetch: PATCH /api/public/quotes/${uniqueLink} (client/src/pages/public-quote.tsx:135)", "shortDescription": {"text": "Dangling fetch: PATCH /api/public/quotes/${uniqueLink} (client/src/pages/public-quote.tsx:135)"}, "fullDescription": {"text": "`client/src/pages/public-quote.tsx:135` calls `PATCH /api/public/quotes/${uniqueLink}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/public/quotes/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65bf0de36cd0ef4e", "name": "Dangling fetch: POST /api/public/quotes/${uniqueLink}/payment (client/src/pages/public-quote.tsx:160)", "shortDescription": {"text": "Dangling fetch: POST /api/public/quotes/${uniqueLink}/payment (client/src/pages/public-quote.tsx:160)"}, "fullDescription": {"text": "`client/src/pages/public-quote.tsx:160` calls `POST /api/public/quotes/${uniqueLink}/payment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/public/quotes/<p>/payment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59d1a5d4f09c2382", "name": "Unused endpoint: USE /api/catastro", "shortDescription": {"text": "Unused endpoint: USE /api/catastro"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/catastro` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77feba4b766a12a7", "name": "Unused endpoint: GET /api/invoices", "shortDescription": {"text": "Unused endpoint: GET /api/invoices"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `GET /api/invoices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b50a3774d2255581", "name": "Unused endpoint: POST /api/invoices", "shortDescription": {"text": "Unused endpoint: POST /api/invoices"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/invoices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ae03a01a4f12417", "name": "Unused endpoint: PUT /api/invoices/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/invoices/:id"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `PUT /api/invoices/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14952d29bad7e0d0", "name": "Unused endpoint: POST /api/invoices/:id/register-accounting", "shortDescription": {"text": "Unused endpoint: POST /api/invoices/:id/register-accounting"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/invoices/:id/register-accounting` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30281d548e874ca1", "name": "Unused endpoint: POST /api/invoices/:id/convert-to-invoice", "shortDescription": {"text": "Unused endpoint: POST /api/invoices/:id/convert-to-invoice"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/invoices/:id/convert-to-invoice` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71cc9c6db3676a5c", "name": "Unused endpoint: POST /api/invoices/:id/generate-pdf", "shortDescription": {"text": "Unused endpoint: POST /api/invoices/:id/generate-pdf"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/invoices/:id/generate-pdf` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77afb2ad6cf64a2a", "name": "Unused endpoint: POST /api/invoices/:id/send", "shortDescription": {"text": "Unused endpoint: POST /api/invoices/:id/send"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/invoices/:id/send` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c373034d4d6ab02", "name": "Unused endpoint: POST /api/export/:type", "shortDescription": {"text": "Unused endpoint: POST /api/export/:type"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/export/:type` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e5dfe13d75c970c", "name": "Unused endpoint: GET /api/financial/summary", "shortDescription": {"text": "Unused endpoint: GET /api/financial/summary"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `GET /api/financial/summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a0b39ee962bbc236", "name": "Unused endpoint: GET /api/payments", "shortDescription": {"text": "Unused endpoint: GET /api/payments"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `GET /api/payments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e44c29dccdf6dbc", "name": "Unused endpoint: POST /api/payments", "shortDescription": {"text": "Unused endpoint: POST /api/payments"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/payments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fe3926965c44c210", "name": "Unused endpoint: GET /api/collections", "shortDescription": {"text": "Unused endpoint: GET /api/collections"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `GET /api/collections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33349e0393c5371a", "name": "Unused endpoint: POST /api/collections", "shortDescription": {"text": "Unused endpoint: POST /api/collections"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/collections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb5f3854b866c0af", "name": "Unused endpoint: DELETE /api/collections/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/collections/:id"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `DELETE /api/collections/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b4585b545c1ddca", "name": "Unused endpoint: POST /api/collections/:id/create-invoice", "shortDescription": {"text": "Unused endpoint: POST /api/collections/:id/create-invoice"}, "fullDescription": {"text": "`server/routes/invoices.ts` declares `POST /api/collections/:id/create-invoice` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5a39262ac205120", "name": "Unused endpoint: POST /api/auth/logout", "shortDescription": {"text": "Unused endpoint: POST /api/auth/logout"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a0e81858fbfe443b", "name": "Unused endpoint: POST /api/auth/forgot-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/forgot-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ca22b73f7a719c3", "name": "Unused endpoint: POST /api/auth/demo", "shortDescription": {"text": "Unused endpoint: POST /api/auth/demo"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/demo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-092d4ba20af15431", "name": "Unused endpoint: PUT /api/auth/user", "shortDescription": {"text": "Unused endpoint: PUT /api/auth/user"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `PUT /api/auth/user` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2150fd97da0532c", "name": "Unused endpoint: POST /api/auth/user/logo", "shortDescription": {"text": "Unused endpoint: POST /api/auth/user/logo"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/user/logo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e977418507f91d5", "name": "Unused endpoint: POST /api/auth/user/firma", "shortDescription": {"text": "Unused endpoint: POST /api/auth/user/firma"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/user/firma` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-599fdca0cdec0ad9", "name": "Unused endpoint: PATCH /api/auth/onboarding/complete", "shortDescription": {"text": "Unused endpoint: PATCH /api/auth/onboarding/complete"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `PATCH /api/auth/onboarding/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a241456a1dfc00e", "name": "Unused endpoint: GET /api/auth/user/completeness", "shortDescription": {"text": "Unused endpoint: GET /api/auth/user/completeness"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `GET /api/auth/user/completeness` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af75afd1360b6af0", "name": "Unused endpoint: PUT /api/auth/user/notifications", "shortDescription": {"text": "Unused endpoint: PUT /api/auth/user/notifications"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `PUT /api/auth/user/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0465cbb46eec8708", "name": "Unused endpoint: PUT /api/auth/user/security", "shortDescription": {"text": "Unused endpoint: PUT /api/auth/user/security"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `PUT /api/auth/user/security` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72a1d729109b651f", "name": "Unused endpoint: GET /api/auth/user/export", "shortDescription": {"text": "Unused endpoint: GET /api/auth/user/export"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `GET /api/auth/user/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce22ae0d8ba8adbe", "name": "Unused endpoint: POST /api/auth/2fa/enable", "shortDescription": {"text": "Unused endpoint: POST /api/auth/2fa/enable"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/2fa/enable` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b832cd8bbed56f25", "name": "Unused endpoint: POST /api/auth/2fa/disable", "shortDescription": {"text": "Unused endpoint: POST /api/auth/2fa/disable"}, "fullDescription": {"text": "`server/routes/auth.ts` declares `POST /api/auth/2fa/disable` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8565717c5d2871fa", "name": "Unused endpoint: POST /api/certifications/:id/generate-formulario-tecnico", "shortDescription": {"text": "Unused endpoint: POST /api/certifications/:id/generate-formulario-tecnico"}, "fullDescription": {"text": "`server/routes/formulario-tecnico.ts` declares `POST /api/certifications/:id/generate-formulario-tecnico` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a01b235f8714b2e1", "name": "Unused endpoint: GET /api/certifications/:id/tecnico-form-data", "shortDescription": {"text": "Unused endpoint: GET /api/certifications/:id/tecnico-form-data"}, "fullDescription": {"text": "`server/routes/formulario-tecnico.ts` declares `GET /api/certifications/:id/tecnico-form-data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e052c19eadcd03bf", "name": "Unused endpoint: POST /api/certifications/:id/tecnico-form-review", "shortDescription": {"text": "Unused endpoint: POST /api/certifications/:id/tecnico-form-review"}, "fullDescription": {"text": "`server/routes/formulario-tecnico.ts` declares `POST /api/certifications/:id/tecnico-form-review` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d579aa9fcca5bf82", "name": "Unused endpoint: GET /api/dashboard/stats", "shortDescription": {"text": "Unused endpoint: GET /api/dashboard/stats"}, "fullDescription": {"text": "`server/routes/dashboard.ts` declares `GET /api/dashboard/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-21e08ef21eba7560", "name": "Unused endpoint: GET /lookup", "shortDescription": {"text": "Unused endpoint: GET /lookup"}, "fullDescription": {"text": "`server/routes/catastro.ts` declares `GET /lookup` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0b721adebc663ef", "name": "Unused endpoint: GET /rc/:rc", "shortDescription": {"text": "Unused endpoint: GET /rc/:rc"}, "fullDescription": {"text": "`server/routes/catastro.ts` declares `GET /rc/:rc` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab90aa12d807fb4a", "name": "Unused endpoint: GET /api/notifications/stream", "shortDescription": {"text": "Unused endpoint: GET /api/notifications/stream"}, "fullDescription": {"text": "`server/routes/notifications.ts` declares `GET /api/notifications/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-988fb34b62c4c25c", "name": "Unused endpoint: GET /api/notifications", "shortDescription": {"text": "Unused endpoint: GET /api/notifications"}, "fullDescription": {"text": "`server/routes/notifications.ts` declares `GET /api/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d30aa36f85b5752f", "name": "Unused endpoint: GET /api/activity", "shortDescription": {"text": "Unused endpoint: GET /api/activity"}, "fullDescription": {"text": "`server/routes/notifications.ts` declares `GET /api/activity` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d402628df8ec0c6e", "name": "Unused endpoint: PATCH /api/notifications/:id/read", "shortDescription": {"text": "Unused endpoint: PATCH /api/notifications/:id/read"}, "fullDescription": {"text": "`server/routes/notifications.ts` declares `PATCH /api/notifications/:id/read` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edf008c561a08e5d", "name": "Unused endpoint: PATCH /api/notifications/read-all", "shortDescription": {"text": "Unused endpoint: PATCH /api/notifications/read-all"}, "fullDescription": {"text": "`server/routes/notifications.ts` declares `PATCH /api/notifications/read-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-366fa4476c037392", "name": "Unused endpoint: GET /api/folders", "shortDescription": {"text": "Unused endpoint: GET /api/folders"}, "fullDescription": {"text": "`server/routes/folders.ts` declares `GET /api/folders` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9391e456e969cc02", "name": "Unused endpoint: POST /api/folders", "shortDescription": {"text": "Unused endpoint: POST /api/folders"}, "fullDescription": {"text": "`server/routes/folders.ts` declares `POST /api/folders` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a79dbae29060a9d1", "name": "Unused endpoint: DELETE /api/folders/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/folders/:id"}, "fullDescription": {"text": "`server/routes/folders.ts` declares `DELETE /api/folders/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4843ce5ec97600c7", "name": "Unused endpoint: GET /api/subscription", "shortDescription": {"text": "Unused endpoint: GET /api/subscription"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `GET /api/subscription` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5f85008d7265e64", "name": "Unused endpoint: GET /api/stripe/subscription", "shortDescription": {"text": "Unused endpoint: GET /api/stripe/subscription"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `GET /api/stripe/subscription` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e0deb1e0f0fb2a2", "name": "Unused endpoint: POST /api/subscription/portal", "shortDescription": {"text": "Unused endpoint: POST /api/subscription/portal"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `POST /api/subscription/portal` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50a2e45d6c6871f0", "name": "Unused endpoint: POST /api/subscription/checkout", "shortDescription": {"text": "Unused endpoint: POST /api/subscription/checkout"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `POST /api/subscription/checkout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ae07eb1980966d9", "name": "Unused endpoint: POST /api/stripe/create-checkout-session", "shortDescription": {"text": "Unused endpoint: POST /api/stripe/create-checkout-session"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `POST /api/stripe/create-checkout-session` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f720955f11896ea0", "name": "Unused endpoint: POST /api/subscription/cancel", "shortDescription": {"text": "Unused endpoint: POST /api/subscription/cancel"}, "fullDescription": {"text": "`server/routes/subscription.ts` declares `POST /api/subscription/cancel` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18974"}, "properties": {"repository": "Sastinocode/certifive", "repoUrl": "https://github.com/Sastinocode/certifive", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: Sastinocode/certifive"}, "properties": {"repobilityId": 462894, "scanner": "foundry_dataset", "fingerprint": "f22ceb7e0a50456091f7e1d99e357b3a751c4fd7f010e15a64ebc01fb44b62ff", "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": {"ui_or_frontend": 3, "build_install_failure": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 3, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 20, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 3, "chain_has_link_quality": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 1, "comment_chain_touches_file": 3, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 12, "node_types": {"repo": 1, "thread": 1, "comment": 1, "pr_file": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "Sastinocode/certifive#1", "issue_number": "1", "quality_tiers": {"unresolved": 3}, "repo_full_name": "Sastinocode/certifive", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-a6eda9a457e4c529", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"ui_or_frontend": 12}}, "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: Sastinocode/certifive\nThread: Sastinocode/certifive#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: Sastinocode/certifive\nThread: Sastinocode/certifive#1\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Sastinocode/certifive#1\nRepo: Sastinocode/certifive\nIssue/PR number: 1\nGraph consistency label: needs_more_evidence\nNodes: 12\nEdges: 20\nNode types: {'pr_file': 3, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 3, 'comment_chain_touches_file': 3, 'chain_has_link_quality': 3, 'issue_chain_touches_file': 3, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 3, 'not_resolved_or_not_observed': 3, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'build_install_failure': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'not_resolved_or_not_observed': 6}\nQuality tiers: {'unresolved': 3}\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/Sastinocode/certifive", "source_id": "graph-query-motif_query-4080263d6d113a51", "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": "Sastinocode/certifive", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: Sastinocode/certifive"}, "properties": {"repobilityId": 441633, "scanner": "foundry_dataset", "fingerprint": "9aade152649b3ae7000d77cfbe722b723b2d8b9c8e2bdbdad99993142fd0e4a3", "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": "Sastinocode/certifive#1", "human_labels": ["build_install_failure", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_without_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.0, "repo_full_name": "Sastinocode/certifive", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-3568287c66a7a647", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"docs": 5, "tests": 1, "schemas": 1, "generated_claims": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"ui_or_frontend": 3}, "linked_commit_count": 0, "helicopter_view_count": 4, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_unresolved"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 1}, "text": "Comment chain pattern product: bad_chains\nRepo: Sastinocode/certifive\nThread: Sastinocode/certifive#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\nChain evidence:\nIssue/PR evidence chain: Sastinocode/certifive#1\nRepo: Sastinocode/certifive\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'build_install_failure': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'ui_or_frontend': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-89d6a727e9204a85\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"build_install_failure\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/Sastinocode/certifive/pull/1\",\n    \"text\": \"GitHub feedback: build_install_failure\\nPolarity: bad\\nKind: pull_request_body\\nRepo: Sastinocode/certifive\\nAuthor: railway-app[bot] (Bot)\\nURL: https://github.com/Sastinocode/certifive/pull/1\\nTitle: Railway Deployment #170aff fix: restore missing JSX closing syntax\\nBody:\\n## Problem\\n\\nThe Vite build fails with `Expected \\\")\\\" but found end of file` in `client/src/pages/settings.tsx` at line 1318. Two other files \u2014 `client/src/components/layout/sidebar.tsx` and `client/src/components/Layout.tsx` \u2014 are also truncated. All three are missing the `);` and `}` that close their JSX return statements and exported functions, stripped during a CRLF conversion incident in commit `06857209` and not restored in the follow-up commit `3b5efe6`.\\n\\n## Solution\\n\\nAppended `);` and `}` to the end of all three truncated files, closing the JSX return and the exported function in each. This restores valid TypeScript/JSX syntax and allows the Vite build to complete successfully.\\n\\n### Changes\\n- **Modified** `client/src/pages/settings.tsx`\\n- **Modified** `client/src/components/layout/sidebar.tsx`\\n- **Modified** `client/src/components/Layout.tsx`\\n\\n### Context\\n- **Deployment**: [#170aff](https://railway.com/project/a\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-9aba3c23e4ff559f\",\n    \"filename\": \"client/src/components/Layout.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 1,\n    \"changes\": 3,\n    \"blob_url\": \"https://github.com/Sastinocode/certifive/blob/b8fe942cc64da3e2604032fdb3faf82db301bd67/client%2Fsrc%2Fcomponents%2FLayout.tsx\"\n  },\n  {\n    \"id\": \"github-pr-file-file-472a08e7d9e527e0\",\n    \"filename\": \"client/src/components/layout/sidebar.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 0,\n    \"changes\": 2,\n    \"blob_url\": \"https://github.com/Sastinocode/certifive/blob/b8fe942cc64da3e2604032fdb\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Sastinocode/certifive", "source_id": "comment-chain-pattern-bad_chains-a8184d66974f6459", "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": "Sastinocode/certifive", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "scanner-80239a566901b1c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 client/src/main.tsx:13"}, "properties": {"repobilityId": "86152873724d4fe0", "scanner": "scanner-primary", "fingerprint": "80239a566901b1c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-392414bfb9e8737c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFolderManager.tsx:720"}, "properties": {"repobilityId": "a8cc8951ae68000f", "scanner": "scanner-primary", "fingerprint": "392414bfb9e8737c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfcaa6eb8a0c6eeb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/CertDataDrawer.tsx:373"}, "properties": {"repobilityId": "8655ce3a4cb4fd0d", "scanner": "scanner-primary", "fingerprint": "dfcaa6eb8a0c6eeb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2aee0c497e06ef72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ClientFlowWizard.tsx:96"}, "properties": {"repobilityId": "a8e28c433f9f5744", "scanner": "scanner-primary", "fingerprint": "2aee0c497e06ef72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f72e723b9e11bd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/certificates/CertificateUploadDialog.tsx:129"}, "properties": {"repobilityId": "d4947239c5d49c69", "scanner": "scanner-primary", "fingerprint": "0f72e723b9e11bd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7b3db9745e9c497", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "1c3a04e593515dbe", "scanner": "scanner-primary", "fingerprint": "a7b3db9745e9c497", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2a57f3dd13ee3b77", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/components/ui/file-upload.tsx:196"}, "properties": {"repobilityId": "3454df1986fb4db8", "scanner": "scanner-primary", "fingerprint": "2a57f3dd13ee3b77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dbffcb4f17f8b9b5", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 client/src/components/public/Stepper.tsx:25"}, "properties": {"repobilityId": "cdc7f7f9e9ac56e7", "scanner": "scanner-primary", "fingerprint": "dbffcb4f17f8b9b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-d5dc3145d95ec469", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/pages/Invoices.tsx:553"}, "properties": {"repobilityId": "c55d7f366acd72c3", "scanner": "scanner-primary", "fingerprint": "d5dc3145d95ec469", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cd5fd0e098f75ac6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Invoices.tsx:508"}, "properties": {"repobilityId": "99a11e32d4e01c48", "scanner": "scanner-primary", "fingerprint": "cd5fd0e098f75ac6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5286fb9065fcaa96", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PublicCEEForm.tsx:286"}, "properties": {"repobilityId": "b4310bc412cf04a1", "scanner": "scanner-primary", "fingerprint": "5286fb9065fcaa96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4c322c4bcb38d60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ClientPortal.tsx:256"}, "properties": {"repobilityId": "6678a97c131cc956", "scanner": "scanner-primary", "fingerprint": "d4c322c4bcb38d60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d390f22069aef82c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/pages/RecogidaMovil.tsx:1249"}, "properties": {"repobilityId": "bb6546239b22de8a", "scanner": "scanner-primary", "fingerprint": "d390f22069aef82c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-de84bb992f457862", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/RecogidaMovil.tsx:311"}, "properties": {"repobilityId": "4a8c6e9b754e3efe", "scanner": "scanner-primary", "fingerprint": "de84bb992f457862", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-130e61a26a188918", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/reports.tsx:1141"}, "properties": {"repobilityId": "9887beeb93c7384e", "scanner": "scanner-primary", "fingerprint": "130e61a26a188918", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ee0e69e2dfa1175", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/view-certification-request.tsx:300"}, "properties": {"repobilityId": "bf6af0b45b1b5abb", "scanner": "scanner-primary", "fingerprint": "6ee0e69e2dfa1175", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-184fb8fcaafd0fa8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/dashboard.tsx:307"}, "properties": {"repobilityId": "bd47345dcb14194b", "scanner": "scanner-primary", "fingerprint": "184fb8fcaafd0fa8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5bc639cbe3c1de6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/whatsapp.tsx:408"}, "properties": {"repobilityId": "0ba8f09e358dc70c", "scanner": "scanner-primary", "fingerprint": "c5bc639cbe3c1de6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-563cb952592f7e40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/certificates.tsx:175"}, "properties": {"repobilityId": "ded8f603d0ba505b", "scanner": "scanner-primary", "fingerprint": "563cb952592f7e40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0529ecc9f0c4bd3", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/pages/properties.tsx:521"}, "properties": {"repobilityId": "a8d6a9fe33b1f132", "scanner": "scanner-primary", "fingerprint": "e0529ecc9f0c4bd3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f546967bd61ed142", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/properties.tsx:200"}, "properties": {"repobilityId": "ff072a6e42f486e7", "scanner": "scanner-primary", "fingerprint": "f546967bd61ed142", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00026b2eed8f52fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/CertifierLanding.tsx:149"}, "properties": {"repobilityId": "f77091371ba89e5a", "scanner": "scanner-primary", "fingerprint": "00026b2eed8f52fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f524885991803aef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Certifications.tsx:157"}, "properties": {"repobilityId": "b37663dd9a6611d2", "scanner": "scanner-primary", "fingerprint": "f524885991803aef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9765ec92c5d3e7c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/VisitForm.tsx:294"}, "properties": {"repobilityId": "306042d9b6c8a8ac", "scanner": "scanner-primary", "fingerprint": "f9765ec92c5d3e7c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57a88205e328ef66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/email.ts:38"}, "properties": {"repobilityId": "94a71ab9f6f2140f", "scanner": "scanner-primary", "fingerprint": "57a88205e328ef66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef87b0e00fab8653", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/startup-migration.ts:153"}, "properties": {"repobilityId": "327a03784a5d9881", "scanner": "scanner-primary", "fingerprint": "ef87b0e00fab8653", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-768c4a44136f592a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/expiry-cron.ts:51"}, "properties": {"repobilityId": "f9ec0ec817d151bd", "scanner": "scanner-primary", "fingerprint": "768c4a44136f592a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5dd50ca58cb8e107", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/notifications.ts:296"}, "properties": {"repobilityId": "9afbd38f92742069", "scanner": "scanner-primary", "fingerprint": "5dd50ca58cb8e107", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d3ee09087d9926b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/vite.ts:20"}, "properties": {"repobilityId": "100f38cf3e52b561", "scanner": "scanner-primary", "fingerprint": "9d3ee09087d9926b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-07099973092b820a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/digest.ts:250"}, "properties": {"repobilityId": "8668929bc7528dd1", "scanner": "scanner-primary", "fingerprint": "07099973092b820a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1bfdeb960d1183a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/routes/misc.ts:197"}, "properties": {"repobilityId": "7a6b028c01250b2e", "scanner": "scanner-primary", "fingerprint": "f1bfdeb960d1183a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6b8def8b0fd03a66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate6.ts:51"}, "properties": {"repobilityId": "fcb1968b65769580", "scanner": "scanner-primary", "fingerprint": "6b8def8b0fd03a66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e53c8e5f4360cf0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate4.ts:45"}, "properties": {"repobilityId": "9eb4eb372d0b07d8", "scanner": "scanner-primary", "fingerprint": "4e53c8e5f4360cf0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5282bbb7f925d76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 migrations/archive/_migrate5.ts:144"}, "properties": {"repobilityId": "7fda49309ffb533d", "scanner": "scanner-primary", "fingerprint": "f5282bbb7f925d76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8df37d9232a59094", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "298aaf10501f50f1", "scanner": "scanner-primary", "fingerprint": "8df37d9232a59094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/components/ui/chart.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-2892bfec53a9af94", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/contexts/AuthContext.tsx:110"}, "properties": {"repobilityId": "cd82c29a21320658", "scanner": "scanner-primary", "fingerprint": "2892bfec53a9af94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/contexts/AuthContext.tsx"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-59e9c2ee0093f965", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/lib/queryClient.ts:21"}, "properties": {"repobilityId": "947bb813545c257c", "scanner": "scanner-primary", "fingerprint": "59e9c2ee0093f965", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/lib/queryClient.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-62d937cd28a9a06b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/pages/Login.tsx:45"}, "properties": {"repobilityId": "a8997d084e0a7bd9", "scanner": "scanner-primary", "fingerprint": "62d937cd28a9a06b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/pages/Login.tsx"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-d51d18a56b86400e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ed9405eff4db6e6e", "scanner": "scanner-primary", "fingerprint": "d51d18a56b86400e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-check.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-d51d18a56b86400e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3f0d683033a1e6ae", "scanner": "scanner-primary", "fingerprint": "d51d18a56b86400e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-check.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-849e7f05ffdaa6db", "level": "note", "message": {"text": "Very large file: client/src/pages/settings.tsx (1219 lines)"}, "properties": {"repobilityId": "4d41b297c279fec0", "scanner": "scanner-primary", "fingerprint": "849e7f05ffdaa6db", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c6be03229b8d2c5", "level": "note", "message": {"text": "Very large file: client/src/pages/PublicCEEForm.tsx (1168 lines)"}, "properties": {"repobilityId": "a05410ae474ff155", "scanner": "scanner-primary", "fingerprint": "8c6be03229b8d2c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a7ac2cbd8fa32de", "level": "note", "message": {"text": "Very large file: client/src/pages/Landing.tsx (1062 lines)"}, "properties": {"repobilityId": "ee27e0cdfafa50bc", "scanner": "scanner-primary", "fingerprint": "1a7ac2cbd8fa32de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75af0d461a02f594", "level": "note", "message": {"text": "Very large file: client/src/pages/RecogidaMovil.tsx (1288 lines)"}, "properties": {"repobilityId": "cb68c2e2ed6421b9", "scanner": "scanner-primary", "fingerprint": "75af0d461a02f594", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c16c6f4918fe065e", "level": "note", "message": {"text": "Very large file: client/src/pages/reports.tsx (1392 lines)"}, "properties": {"repobilityId": "cacf4d059e11b35d", "scanner": "scanner-primary", "fingerprint": "c16c6f4918fe065e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f3cafd8cf2144a0b", "level": "note", "message": {"text": "Very large file: client/src/pages/enhanced-certification-form.tsx (992 lines)"}, "properties": {"repobilityId": "f48d1f08f3c04c10", "scanner": "scanner-primary", "fingerprint": "f3cafd8cf2144a0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fa6f20f9f2726413", "level": "note", "message": {"text": "Very large file: client/src/pages/certificates.tsx (1057 lines)"}, "properties": {"repobilityId": "9375ae36bcf255a0", "scanner": "scanner-primary", "fingerprint": "fa6f20f9f2726413", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ba033fe05937e0aa", "level": "note", "message": {"text": "Very large file: client/src/pages/Certifications.tsx (1484 lines)"}, "properties": {"repobilityId": "b91fe2abf8ba5b51", "scanner": "scanner-primary", "fingerprint": "ba033fe05937e0aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-efe64b9bdb4ae81e", "level": "note", "message": {"text": "Very large file: client/src/pages/FormularioTecnicoPublico.tsx (1653 lines)"}, "properties": {"repobilityId": "fbca949adedcfc29", "scanner": "scanner-primary", "fingerprint": "efe64b9bdb4ae81e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-818d60815d79548a", "level": "note", "message": {"text": "Very large file: shared/schema.ts (870 lines)"}, "properties": {"repobilityId": "43ade807c81236e6", "scanner": "scanner-primary", "fingerprint": "818d60815d79548a", "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-6611ff22818b6a92", "level": "note", "message": {"text": "31 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "6611ff22818b6a92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "6a01dc4ea83c5a61", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "0bb6de33aba10255", "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": "286a5b5678dbe2c0", "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": "c32a8f2fefa170f3", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6cc4ab22047bef06", "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": "c2c4c2c3228f9e4e", "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": "b09be65f5c80b967", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6e5faa82ef5c5dd8", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 fix_reports.py:75"}, "properties": {"repobilityId": "b5f8c6e73bf69c1f", "scanner": "scanner-primary", "fingerprint": "6e5faa82ef5c5dd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de6f20a12c5231ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/public/sw.js:73"}, "properties": {"repobilityId": "da3a221a7af4c9f6", "scanner": "scanner-primary", "fingerprint": "de6f20a12c5231ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f58dd5de4eca2c9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/App.tsx:141"}, "properties": {"repobilityId": "e2d06d97edb97014", "scanner": "scanner-primary", "fingerprint": "f58dd5de4eca2c9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db026c2053025b98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/CertDetailPanel.tsx:172"}, "properties": {"repobilityId": "8153777f4e614964", "scanner": "scanner-primary", "fingerprint": "db026c2053025b98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d509e0ad302597a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ClientFolderManager.tsx:92"}, "properties": {"repobilityId": "e2fd0a377a2c8b01", "scanner": "scanner-primary", "fingerprint": "7d509e0ad302597a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e6926da775bdf73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/GlobalSearch.tsx:90"}, "properties": {"repobilityId": "da0bfa6a199250b1", "scanner": "scanner-primary", "fingerprint": "4e6926da775bdf73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6dd86f2ece76a1c0", "level": "note", "message": {"text": "Legacy-named symbol `content_copy` in client/src/components/CertDataDrawer.tsx:289"}, "properties": {"repobilityId": "6ac4d82a154585d8", "scanner": "scanner-primary", "fingerprint": "6dd86f2ece76a1c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6a4751ef78e62442", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/certificates/CertificateUploadDialog.tsx:32"}, "properties": {"repobilityId": "4a82d6e018fcad14", "scanner": "scanner-primary", "fingerprint": "6a4751ef78e62442", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e4d91c1baaaef95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/ui/file-upload.tsx:32"}, "properties": {"repobilityId": "62a13ab881bfe104", "scanner": "scanner-primary", "fingerprint": "5e4d91c1baaaef95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-48b85e5fc058cc16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/lib/queryClient.ts:13"}, "properties": {"repobilityId": "0fb1d568b8a1a018", "scanner": "scanner-primary", "fingerprint": "48b85e5fc058cc16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-841c484e5ff42d5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/settings.tsx:219"}, "properties": {"repobilityId": "e58e40de766246d9", "scanner": "scanner-primary", "fingerprint": "841c484e5ff42d5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56e89ff1ba109595", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicCEEForm.tsx:90"}, "properties": {"repobilityId": "145bcc6128233fb5", "scanner": "scanner-primary", "fingerprint": "56e89ff1ba109595", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ec213f88be35f7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ClientPortal.tsx:123"}, "properties": {"repobilityId": "631ca3d1a2d99c14", "scanner": "scanner-primary", "fingerprint": "6ec213f88be35f7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a91e2749aef2c28", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/PublicSolicitud.tsx:103"}, "properties": {"repobilityId": "6fc84d9cc75a7858", "scanner": "scanner-primary", "fingerprint": "8a91e2749aef2c28", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e80f2fe167b41dab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/RecogidaMovil.tsx:408"}, "properties": {"repobilityId": "c11a291bf9ff34c7", "scanner": "scanner-primary", "fingerprint": "e80f2fe167b41dab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50b1f85a4c97d758", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certification-form.tsx:104"}, "properties": {"repobilityId": "54affd878a168364", "scanner": "scanner-primary", "fingerprint": "50b1f85a4c97d758", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1bd810c39828d8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/certificates.tsx:282"}, "properties": {"repobilityId": "9a89dfde25f091fc", "scanner": "scanner-primary", "fingerprint": "b1bd810c39828d8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e8580f2d3c2fa6d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/properties.tsx:226"}, "properties": {"repobilityId": "598384dd67494273", "scanner": "scanner-primary", "fingerprint": "e8580f2d3c2fa6d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d83527eb801c0881", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/public-quote.tsx:135"}, "properties": {"repobilityId": "8569336c27f15056", "scanner": "scanner-primary", "fingerprint": "d83527eb801c0881", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7fdcd781c0291a0e", "level": "note", "message": {"text": "Legacy-named symbol `content_copy` in client/src/pages/Certifications.tsx:117"}, "properties": {"repobilityId": "d63448aeb1e9bedd", "scanner": "scanner-primary", "fingerprint": "7fdcd781c0291a0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-963efba1092e604b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/VisitForm.tsx:208"}, "properties": {"repobilityId": "7c0843fa78689aac", "scanner": "scanner-primary", "fingerprint": "963efba1092e604b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec1e467ed45e7c5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudSeguimiento.tsx:46"}, "properties": {"repobilityId": "d641d15a55537a98", "scanner": "scanner-primary", "fingerprint": "ec1e467ed45e7c5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-57ba7f69494f1e57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/SolicitudPago.tsx:104"}, "properties": {"repobilityId": "e56e7074dcf6bec4", "scanner": "scanner-primary", "fingerprint": "57ba7f69494f1e57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0d66cf9f5f0e09e", "level": "none", "message": {"text": "Commented-code block (6 lines) in shared/schema.ts:585"}, "properties": {"repobilityId": "30f94b6a990e47de", "scanner": "scanner-primary", "fingerprint": "f0d66cf9f5f0e09e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36a0f78ec10a563e", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/cloudinary.ts:6"}, "properties": {"repobilityId": "ee1a5c50f0b38f43", "scanner": "scanner-primary", "fingerprint": "36a0f78ec10a563e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0532989baa71771", "level": "note", "message": {"text": "Legacy-named symbol `monthlyIncome_legacy` in server/routes/dashboard.ts:165"}, "properties": {"repobilityId": "4f0fbbfd49674057", "scanner": "scanner-primary", "fingerprint": "d0532989baa71771", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f59bc25dff05a26", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routes/subscription.ts:110"}, "properties": {"repobilityId": "c6f8c812f9bb4aa6", "scanner": "scanner-primary", "fingerprint": "6f59bc25dff05a26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73227c824b8998d6", "level": "none", "message": {"text": "Commented-code block (6 lines) in design_handoff_certifive/reference/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "34b5d9a737e2a462", "scanner": "scanner-primary", "fingerprint": "73227c824b8998d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3f21fc70d43d3a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in attached_assets/tweaks-panel_1777729070829.jsx:12"}, "properties": {"repobilityId": "4ba5a206fca952e4", "scanner": "scanner-primary", "fingerprint": "c3f21fc70d43d3a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-9b6c492c6a564cbc", "level": "warning", "message": {"text": "Frontend route `/presupuesto/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "29d5bff898c0bdcc", "scanner": "scanner-primary", "fingerprint": "9b6c492c6a564cbc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b255a675c64fd109", "level": "warning", "message": {"text": "Frontend route `/cotizacion/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "658f1f4a465a112f", "scanner": "scanner-primary", "fingerprint": "b255a675c64fd109", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8bb96b52c4998390", "level": "warning", "message": {"text": "Frontend route `/solicitud/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7e918aa495199e45", "scanner": "scanner-primary", "fingerprint": "8bb96b52c4998390", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fcd38bc545774ba3", "level": "warning", "message": {"text": "Frontend route `/formulario-cee/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "f873e934f4e90996", "scanner": "scanner-primary", "fingerprint": "fcd38bc545774ba3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ad0034d48bab1898", "level": "warning", "message": {"text": "Frontend route `/formulario-tecnico/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "5725ff1333ceb79b", "scanner": "scanner-primary", "fingerprint": "ad0034d48bab1898", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-61cc8e67e1aace92", "level": "warning", "message": {"text": "Frontend route `/pay/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "650af2e8e984ddfd", "scanner": "scanner-primary", "fingerprint": "61cc8e67e1aace92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3737270328148b0d", "level": "warning", "message": {"text": "Frontend route `/certificacion-cliente/:uniqueLink` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d41ae611103a1cfe", "scanner": "scanner-primary", "fingerprint": "3737270328148b0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f797cf3c94dcfc46", "level": "warning", "message": {"text": "Frontend route `/generador-tarifas` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ac4142c14895f6b1", "scanner": "scanner-primary", "fingerprint": "f797cf3c94dcfc46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e739528f75d4829d", "level": "warning", "message": {"text": "Frontend route `/recogida/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "11e87c0bfbc1745e", "scanner": "scanner-primary", "fingerprint": "e739528f75d4829d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1ce3fadde1bd9512", "level": "warning", "message": {"text": "Frontend route `/verify-email` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "7360c44b26ec3c80", "scanner": "scanner-primary", "fingerprint": "1ce3fadde1bd9512", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-270bca32d3c6d67a", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "24fd4c93be04a967", "scanner": "scanner-primary", "fingerprint": "270bca32d3c6d67a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d6a332391242d9d2", "level": "warning", "message": {"text": "Frontend route `/certificacion/:id?` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "e98b1531994632f0", "scanner": "scanner-primary", "fingerprint": "d6a332391242d9d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6b93a6c76c1aba81", "level": "warning", "message": {"text": "Frontend route `/certificacion-request/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "142c13beba246569", "scanner": "scanner-primary", "fingerprint": "6b93a6c76c1aba81", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bdb01bd71b8a19ca", "level": "warning", "message": {"text": "Frontend route `/portal/:token` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "c7bf2c688d6ba77d", "scanner": "scanner-primary", "fingerprint": "bdb01bd71b8a19ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-95ff2bdb7c3285de", "level": "warning", "message": {"text": "Frontend route `/demo-flujo` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "31319d9168e07173", "scanner": "scanner-primary", "fingerprint": "95ff2bdb7c3285de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a22e6482dc354962", "level": "warning", "message": {"text": "Frontend route `/facturacion` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "b859276e2937e68b", "scanner": "scanner-primary", "fingerprint": "a22e6482dc354962", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ae3a2d5c172c3190", "level": "warning", "message": {"text": "Frontend route `/marketing` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "ae57051e51028f77", "scanner": "scanner-primary", "fingerprint": "ae3a2d5c172c3190", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c7ca40b3659819a4", "level": "warning", "message": {"text": "Frontend route `/automatizaciones` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "09fa8d26cfde5e54", "scanner": "scanner-primary", "fingerprint": "c7ca40b3659819a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27ec1602a2b75e65", "level": "warning", "message": {"text": "Frontend route `/stripe` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "1cf77575505c8502", "scanner": "scanner-primary", "fingerprint": "27ec1602a2b75e65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6eed814f8ea0d019", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "45eb956619820d6f", "scanner": "scanner-primary", "fingerprint": "6eed814f8ea0d019", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-afd9a7cb032e24bb", "level": "warning", "message": {"text": "Frontend route `/revision-tecnica/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "f08daa3425cc2afa", "scanner": "scanner-primary", "fingerprint": "afd9a7cb032e24bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7dcce918b21be2c1", "level": "warning", "message": {"text": "Frontend route `/visita/:id` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d8f63d36b9b4ddef", "scanner": "scanner-primary", "fingerprint": "7dcce918b21be2c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ef8087ba5f39582", "level": "warning", "message": {"text": "Frontend route `/success` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "18fb489f8c99d2dc", "scanner": "scanner-primary", "fingerprint": "0ef8087ba5f39582", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-168780054c580dee", "level": "warning", "message": {"text": "Frontend route `/cancel` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "d9f266cb280e5e7a", "scanner": "scanner-primary", "fingerprint": "168780054c580dee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2a93605e45a4d56e", "level": "warning", "message": {"text": "Frontend route `/renovar-suscripci\u00f3n` has no Link/navigate to it \u2014 client/src/App.tsx"}, "properties": {"repobilityId": "91d3dbd3486e0ad7", "scanner": "scanner-primary", "fingerprint": "2a93605e45a4d56e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-222e4a04a642accf", "level": "error", "message": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(cleanRc)} (client/src/components/CatastroSearch.tsx:48)"}, "properties": {"repobilityId": "45f4b55ad98de2ae", "scanner": "scanner-primary", "fingerprint": "222e4a04a642accf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e264997694a84a13", "level": "error", "message": {"text": "Dangling fetch: GET /api/folders/${folderId}/documents (client/src/components/ClientFolderManager.tsx:92)"}, "properties": {"repobilityId": "e0c9c5e3b0233531", "scanner": "scanner-primary", "fingerprint": "e264997694a84a13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cd5fc68a2c56140e", "level": "error", "message": {"text": "Dangling fetch: GET /api/folders/${folderId}/certification (client/src/components/ClientFolderManager.tsx:103)"}, "properties": {"repobilityId": "2536c905a6dbf3d6", "scanner": "scanner-primary", "fingerprint": "cd5fc68a2c56140e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ea4e485143a4c67", "level": "error", "message": {"text": "Dangling fetch: POST /api/folders/${folderId}/upload (client/src/components/ClientFolderManager.tsx:113)"}, "properties": {"repobilityId": "a3c467d9e30650de", "scanner": "scanner-primary", "fingerprint": "4ea4e485143a4c67", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51fb2ed0d9938876", "level": "error", "message": {"text": "Dangling fetch: POST /api/folders/${folderId}/upload-certificate (client/src/components/certificates/CertificateUploadDialog.tsx:32)"}, "properties": {"repobilityId": "6c23c05d0ecf2548", "scanner": "scanner-primary", "fingerprint": "51fb2ed0d9938876", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63607fc1cc892ddb", "level": "error", "message": {"text": "Dangling fetch: POST /api/certifications/${certificationId}/photos (client/src/components/ui/file-upload.tsx:32)"}, "properties": {"repobilityId": "6e51c48fcd452010", "scanner": "scanner-primary", "fingerprint": "63607fc1cc892ddb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f35cef8eee180c89", "level": "error", "message": {"text": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:209)"}, "properties": {"repobilityId": "aca81ef871822377", "scanner": "scanner-primary", "fingerprint": "f35cef8eee180c89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c5ec048fdb5ec3d6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/profile/update (client/src/pages/settings.tsx:259)"}, "properties": {"repobilityId": "e6e95c57c39046e1", "scanner": "scanner-primary", "fingerprint": "c5ec048fdb5ec3d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a918fa3b9e5ae8c4", "level": "error", "message": {"text": "Dangling fetch: GET /api/profile/validation (client/src/pages/settings.tsx:265)"}, "properties": {"repobilityId": "0b62175e814a5f22", "scanner": "scanner-primary", "fingerprint": "a918fa3b9e5ae8c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e3e6f9499aa424d", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/billing (client/src/pages/settings.tsx:277)"}, "properties": {"repobilityId": "969e5ddd6621abc4", "scanner": "scanner-primary", "fingerprint": "2e3e6f9499aa424d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3ac9a5fa9d66eb9", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/certificates (client/src/pages/settings.tsx:329)"}, "properties": {"repobilityId": "e38d196572fa681c", "scanner": "scanner-primary", "fingerprint": "d3ac9a5fa9d66eb9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a094d74ee5f06f48", "level": "error", "message": {"text": "Dangling fetch: GET /api/backup/status (client/src/pages/settings.tsx:349)"}, "properties": {"repobilityId": "335cdeb0e461dfdf", "scanner": "scanner-primary", "fingerprint": "a094d74ee5f06f48", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f179df41bdc54c4", "level": "error", "message": {"text": "Dangling fetch: POST /api/backup/create (client/src/pages/settings.tsx:363)"}, "properties": {"repobilityId": "cb1b95b1ff37a88d", "scanner": "scanner-primary", "fingerprint": "2f179df41bdc54c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f04ae1323c917e4", "level": "error", "message": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/PublicSolicitud.tsx:123)"}, "properties": {"repobilityId": "f6f067f1112c3c51", "scanner": "scanner-primary", "fingerprint": "2f04ae1323c917e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4d6c869369baf58", "level": "error", "message": {"text": "Dangling fetch: GET /api/catastro/lookup?rc=${encodeURIComponent(rc)} (client/src/pages/enhanced-certification-form.tsx:164)"}, "properties": {"repobilityId": "433db92054ebd1b1", "scanner": "scanner-primary", "fingerprint": "a4d6c869369baf58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-068a9a71a0cd978c", "level": "error", "message": {"text": "Dangling fetch: POST /api/public/certification-form/${uniqueLink} (client/src/pages/certification-form.tsx:104)"}, "properties": {"repobilityId": "4b0422fd8ea9e5f4", "scanner": "scanner-primary", "fingerprint": "068a9a71a0cd978c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-50245301fa83fa8b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/public/quotes/${uniqueLink} (client/src/pages/public-quote.tsx:135)"}, "properties": {"repobilityId": "d183ea642764de9d", "scanner": "scanner-primary", "fingerprint": "50245301fa83fa8b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65bf0de36cd0ef4e", "level": "error", "message": {"text": "Dangling fetch: POST /api/public/quotes/${uniqueLink}/payment (client/src/pages/public-quote.tsx:160)"}, "properties": {"repobilityId": "c027e70c2c634f75", "scanner": "scanner-primary", "fingerprint": "65bf0de36cd0ef4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59d1a5d4f09c2382", "level": "note", "message": {"text": "Unused endpoint: USE /api/catastro"}, "properties": {"repobilityId": "f1e3539627941c39", "scanner": "scanner-primary", "fingerprint": "59d1a5d4f09c2382", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77feba4b766a12a7", "level": "note", "message": {"text": "Unused endpoint: GET /api/invoices"}, "properties": {"repobilityId": "e0af78700306d0ef", "scanner": "scanner-primary", "fingerprint": "77feba4b766a12a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b50a3774d2255581", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoices"}, "properties": {"repobilityId": "7c7a499de33f8aa4", "scanner": "scanner-primary", "fingerprint": "b50a3774d2255581", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ae03a01a4f12417", "level": "note", "message": {"text": "Unused endpoint: PUT /api/invoices/:id"}, "properties": {"repobilityId": "1b01850fa83b1bbd", "scanner": "scanner-primary", "fingerprint": "6ae03a01a4f12417", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14952d29bad7e0d0", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoices/:id/register-accounting"}, "properties": {"repobilityId": "ee69968f288096e5", "scanner": "scanner-primary", "fingerprint": "14952d29bad7e0d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30281d548e874ca1", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoices/:id/convert-to-invoice"}, "properties": {"repobilityId": "c8c50c038f652c03", "scanner": "scanner-primary", "fingerprint": "30281d548e874ca1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71cc9c6db3676a5c", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoices/:id/generate-pdf"}, "properties": {"repobilityId": "132b0f8e8c568657", "scanner": "scanner-primary", "fingerprint": "71cc9c6db3676a5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77afb2ad6cf64a2a", "level": "note", "message": {"text": "Unused endpoint: POST /api/invoices/:id/send"}, "properties": {"repobilityId": "58750d2adeb81ed5", "scanner": "scanner-primary", "fingerprint": "77afb2ad6cf64a2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c373034d4d6ab02", "level": "note", "message": {"text": "Unused endpoint: POST /api/export/:type"}, "properties": {"repobilityId": "c736ab2de98cb0ab", "scanner": "scanner-primary", "fingerprint": "0c373034d4d6ab02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e5dfe13d75c970c", "level": "note", "message": {"text": "Unused endpoint: GET /api/financial/summary"}, "properties": {"repobilityId": "ecc7572bc32e36b5", "scanner": "scanner-primary", "fingerprint": "0e5dfe13d75c970c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0b39ee962bbc236", "level": "note", "message": {"text": "Unused endpoint: GET /api/payments"}, "properties": {"repobilityId": "ee6329dd39f6c060", "scanner": "scanner-primary", "fingerprint": "a0b39ee962bbc236", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e44c29dccdf6dbc", "level": "note", "message": {"text": "Unused endpoint: POST /api/payments"}, "properties": {"repobilityId": "4379f05bd87ccc5a", "scanner": "scanner-primary", "fingerprint": "2e44c29dccdf6dbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe3926965c44c210", "level": "note", "message": {"text": "Unused endpoint: GET /api/collections"}, "properties": {"repobilityId": "1a5c9bb5b684d22e", "scanner": "scanner-primary", "fingerprint": "fe3926965c44c210", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33349e0393c5371a", "level": "note", "message": {"text": "Unused endpoint: POST /api/collections"}, "properties": {"repobilityId": "86fe93ed9a049765", "scanner": "scanner-primary", "fingerprint": "33349e0393c5371a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb5f3854b866c0af", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/collections/:id"}, "properties": {"repobilityId": "8f57ead3a799e90a", "scanner": "scanner-primary", "fingerprint": "cb5f3854b866c0af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b4585b545c1ddca", "level": "note", "message": {"text": "Unused endpoint: POST /api/collections/:id/create-invoice"}, "properties": {"repobilityId": "24d570d9642d5e14", "scanner": "scanner-primary", "fingerprint": "9b4585b545c1ddca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "2e831dc80d10ce24", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5a39262ac205120", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/logout"}, "properties": {"repobilityId": "121c458712cd6e23", "scanner": "scanner-primary", "fingerprint": "d5a39262ac205120", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0e81858fbfe443b", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "properties": {"repobilityId": "0dcffc13a1a32649", "scanner": "scanner-primary", "fingerprint": "a0e81858fbfe443b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ca22b73f7a719c3", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/demo"}, "properties": {"repobilityId": "57b7e513dbd84355", "scanner": "scanner-primary", "fingerprint": "0ca22b73f7a719c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-092d4ba20af15431", "level": "note", "message": {"text": "Unused endpoint: PUT /api/auth/user"}, "properties": {"repobilityId": "ca37c939476194d4", "scanner": "scanner-primary", "fingerprint": "092d4ba20af15431", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2150fd97da0532c", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/user/logo"}, "properties": {"repobilityId": "479ab158479cdc47", "scanner": "scanner-primary", "fingerprint": "b2150fd97da0532c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e977418507f91d5", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/user/firma"}, "properties": {"repobilityId": "51af3bf2e2caea48", "scanner": "scanner-primary", "fingerprint": "0e977418507f91d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-599fdca0cdec0ad9", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/auth/onboarding/complete"}, "properties": {"repobilityId": "ac94374051701689", "scanner": "scanner-primary", "fingerprint": "599fdca0cdec0ad9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a241456a1dfc00e", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/user/completeness"}, "properties": {"repobilityId": "e523a78915cb0598", "scanner": "scanner-primary", "fingerprint": "9a241456a1dfc00e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af75afd1360b6af0", "level": "note", "message": {"text": "Unused endpoint: PUT /api/auth/user/notifications"}, "properties": {"repobilityId": "b97e562c28a6f0f0", "scanner": "scanner-primary", "fingerprint": "af75afd1360b6af0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0465cbb46eec8708", "level": "note", "message": {"text": "Unused endpoint: PUT /api/auth/user/security"}, "properties": {"repobilityId": "9a2622ef1b02d971", "scanner": "scanner-primary", "fingerprint": "0465cbb46eec8708", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72a1d729109b651f", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/user/export"}, "properties": {"repobilityId": "2c094e91e0c5b685", "scanner": "scanner-primary", "fingerprint": "72a1d729109b651f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce22ae0d8ba8adbe", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/2fa/enable"}, "properties": {"repobilityId": "47d6ccf5aa2e904b", "scanner": "scanner-primary", "fingerprint": "ce22ae0d8ba8adbe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b832cd8bbed56f25", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/2fa/disable"}, "properties": {"repobilityId": "3ff65030a5e7b48e", "scanner": "scanner-primary", "fingerprint": "b832cd8bbed56f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8565717c5d2871fa", "level": "note", "message": {"text": "Unused endpoint: POST /api/certifications/:id/generate-formulario-tecnico"}, "properties": {"repobilityId": "b7a98b4b0b4b7aca", "scanner": "scanner-primary", "fingerprint": "8565717c5d2871fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a01b235f8714b2e1", "level": "note", "message": {"text": "Unused endpoint: GET /api/certifications/:id/tecnico-form-data"}, "properties": {"repobilityId": "c6d89e4ff11e6bd8", "scanner": "scanner-primary", "fingerprint": "a01b235f8714b2e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e052c19eadcd03bf", "level": "note", "message": {"text": "Unused endpoint: POST /api/certifications/:id/tecnico-form-review"}, "properties": {"repobilityId": "d6687a28e1778cf2", "scanner": "scanner-primary", "fingerprint": "e052c19eadcd03bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d579aa9fcca5bf82", "level": "note", "message": {"text": "Unused endpoint: GET /api/dashboard/stats"}, "properties": {"repobilityId": "7e91de58d7f9140c", "scanner": "scanner-primary", "fingerprint": "d579aa9fcca5bf82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21e08ef21eba7560", "level": "note", "message": {"text": "Unused endpoint: GET /lookup"}, "properties": {"repobilityId": "45b0aeefc2f192af", "scanner": "scanner-primary", "fingerprint": "21e08ef21eba7560", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0b721adebc663ef", "level": "note", "message": {"text": "Unused endpoint: GET /rc/:rc"}, "properties": {"repobilityId": "4595d4c64eea2d7b", "scanner": "scanner-primary", "fingerprint": "d0b721adebc663ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab90aa12d807fb4a", "level": "note", "message": {"text": "Unused endpoint: GET /api/notifications/stream"}, "properties": {"repobilityId": "17cb9487b816e860", "scanner": "scanner-primary", "fingerprint": "ab90aa12d807fb4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-988fb34b62c4c25c", "level": "note", "message": {"text": "Unused endpoint: GET /api/notifications"}, "properties": {"repobilityId": "c6b758ef1cd8d390", "scanner": "scanner-primary", "fingerprint": "988fb34b62c4c25c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d30aa36f85b5752f", "level": "note", "message": {"text": "Unused endpoint: GET /api/activity"}, "properties": {"repobilityId": "850ed1e7053b6ff6", "scanner": "scanner-primary", "fingerprint": "d30aa36f85b5752f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d402628df8ec0c6e", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/notifications/:id/read"}, "properties": {"repobilityId": "891ebf7ead4c9896", "scanner": "scanner-primary", "fingerprint": "d402628df8ec0c6e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edf008c561a08e5d", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/notifications/read-all"}, "properties": {"repobilityId": "3570470f97ccd14d", "scanner": "scanner-primary", "fingerprint": "edf008c561a08e5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-366fa4476c037392", "level": "note", "message": {"text": "Unused endpoint: GET /api/folders"}, "properties": {"repobilityId": "7a66574abeab68bf", "scanner": "scanner-primary", "fingerprint": "366fa4476c037392", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9391e456e969cc02", "level": "note", "message": {"text": "Unused endpoint: POST /api/folders"}, "properties": {"repobilityId": "17850a8c6c172029", "scanner": "scanner-primary", "fingerprint": "9391e456e969cc02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a79dbae29060a9d1", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/folders/:id"}, "properties": {"repobilityId": "77c9a062ba641d2d", "scanner": "scanner-primary", "fingerprint": "a79dbae29060a9d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4843ce5ec97600c7", "level": "note", "message": {"text": "Unused endpoint: GET /api/subscription"}, "properties": {"repobilityId": "d364b6f119ca462b", "scanner": "scanner-primary", "fingerprint": "4843ce5ec97600c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5f85008d7265e64", "level": "note", "message": {"text": "Unused endpoint: GET /api/stripe/subscription"}, "properties": {"repobilityId": "cc9f96c23cf0af84", "scanner": "scanner-primary", "fingerprint": "c5f85008d7265e64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e0deb1e0f0fb2a2", "level": "note", "message": {"text": "Unused endpoint: POST /api/subscription/portal"}, "properties": {"repobilityId": "8877bb9b642519df", "scanner": "scanner-primary", "fingerprint": "1e0deb1e0f0fb2a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50a2e45d6c6871f0", "level": "note", "message": {"text": "Unused endpoint: POST /api/subscription/checkout"}, "properties": {"repobilityId": "a03f54d917308979", "scanner": "scanner-primary", "fingerprint": "50a2e45d6c6871f0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ae07eb1980966d9", "level": "note", "message": {"text": "Unused endpoint: POST /api/stripe/create-checkout-session"}, "properties": {"repobilityId": "1e081f2f65bf62a5", "scanner": "scanner-primary", "fingerprint": "7ae07eb1980966d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f720955f11896ea0", "level": "note", "message": {"text": "Unused endpoint: POST /api/subscription/cancel"}, "properties": {"repobilityId": "dcd67b013df20840", "scanner": "scanner-primary", "fingerprint": "f720955f11896ea0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}