{"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: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "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: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode types: "}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "fullDescription": {"text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode typ"}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined assumption checks: shanestratton/thalassa-marine-weather"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 9\nLabels: {'security_auth_secret': 1, 'api_integration_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'ui_or_frontend': 4, 'source_or_other': 2, 'api_or_backend': 2, 'dependency_or_build': 1}\nExamples:\n[\n  "}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_test_ci_gap", "name": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "fullDescription": {"text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode types: {'link_quality': 8, "}, "properties": {"scanner": "foundry_dataset", "category": "testing", "severity": "high", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_and_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 3\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 7\nLabels: {'test_ci_gap': 2, 'api_integration_gap': 1}\nPolarities: {'bad': 3}\nChanged file labels: {'test_or_ci': 7}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-73dfffc57530c700\",\n    \"kind\": \"pull_request_body\""}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "cwe": "", "owasp": ""}}, {"id": "foundry_auth_guardrail_gap", "name": "Foundry mined security auth guardrail gaps: shanestratton/thalassa-marine-weather", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: shanestratton/thalassa-marine-weather"}, "fullDescription": {"text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 6\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 61\nNode types: {'"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "scanner-91a339d70964ea91", "name": "Possibly dead Python function: way", "shortDescription": {"text": "Possibly dead Python function: way"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d271680b46827251", "name": "Possibly dead Python function: relation", "shortDescription": {"text": "Possibly dead Python function: relation"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27bed85a8f0d9a51", "name": "Possibly dead Python function: way", "shortDescription": {"text": "Possibly dead Python function: way"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab55d4fa3e7c16cd", "name": "Possibly dead Python function: decode_type", "shortDescription": {"text": "Possibly dead Python function: decode_type"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-019266428e540af2", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-apple-client-secret.js:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-apple-client-secret.js:80"}, "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-6e5a6edcadf1f9cb", "name": "Stray `console.log` in TS/JS \u2014 scripts/build_channel_walls.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build_channel_walls.js:22"}, "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-74487a1f8634e61f", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-bundle-size.js:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bundle-size.js:52"}, "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-766612806e9eaf0f", "name": "Stray `console.log` in TS/JS \u2014 cloudflare-worker/src/index.ts:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 cloudflare-worker/src/index.ts:185"}, "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-5108ba707a720970", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CommunityTrackBrowser.tsx:466", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CommunityTrackBrowser.tsx:466"}, "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-668ad6d5f94d6b36", "name": "`truncate` class without `title=` for hover reveal \u2014 components/DateGroupedTimeline.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/DateGroupedTimeline.tsx:394"}, "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-724973de41be87b4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MarketplaceThread.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MarketplaceThread.tsx:230"}, "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-56cd044aea60673a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/VesselHub.tsx:1545", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/VesselHub.tsx:1545"}, "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-97a9bc45e3e3781e", "name": "\"active\" state uses light bg in a dark theme \u2014 components/SettingsModal.tsx:56", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/SettingsModal.tsx:56"}, "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-dbb5e3266b74557e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/RoutePlanner.tsx:549", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RoutePlanner.tsx:549"}, "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-b29db525a246ee37", "name": "`truncate` class without `title=` for hover reveal \u2014 components/GuardianPage.tsx:369", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GuardianPage.tsx:369"}, "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-743c7a29bd79e285", "name": "`truncate` class without `title=` for hover reveal \u2014 components/TrackMapViewer.tsx:829", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TrackMapViewer.tsx:829"}, "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-1067ef456afd3ea3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/VoyageHeader.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/VoyageHeader.tsx:224"}, "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-3fc8049183192790", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PushToast.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PushToast.tsx:178"}, "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-90e86675a93da0c7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AnchorWatchPage.tsx:698", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AnchorWatchPage.tsx:698"}, "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-a4d4a59125ca0744", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ChatHub.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ChatHub.tsx:247"}, "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-5c1deef9070eaeda", "name": "`truncate` class without `title=` for hover reveal \u2014 components/FollowRouteBadge.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FollowRouteBadge.tsx:257"}, "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-5f0114cb0d6d2c1c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AddEntryModal.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AddEntryModal.tsx:205"}, "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-1c9c305a2b2a8fca", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SettingsRestoredModal.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SettingsRestoredModal.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e6a53137d240ee9", "name": "\"active\" state uses light bg in a dark theme \u2014 components/SystemStatusButton.tsx:456", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/SystemStatusButton.tsx:456"}, "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-44ef01d4ca647768", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AdminPanel.tsx:506", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AdminPanel.tsx:506"}, "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-500650144fd2b944", "name": "`truncate` class without `title=` for hover reveal \u2014 components/settings/VoyageLogTab.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/VoyageLogTab.tsx:270"}, "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-906283b042ad1989", "name": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerSetupGuide.tsx:461", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerSetupGuide.tsx:461"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ad5979bb1d777e3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerTab.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerTab.tsx:232"}, "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-19e76421f7b6019f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/settings/LocationsTab.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/LocationsTab.tsx:53"}, "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-2667d04300b8acbc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chandlery/BasketDrawer.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chandlery/BasketDrawer.tsx:110"}, "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-92c40e963a267b24", "name": "`truncate` class without `title=` for hover reveal \u2014 components/marketplace/CheckoutModal.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/marketplace/CheckoutModal.tsx:171"}, "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-c019401b66cfe5c0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/PageHeader.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/PageHeader.tsx:78"}, "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-f3efb4d8a6e88664", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/UndoToast.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/UndoToast.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-473d1fca5601d127", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherGrid.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherGrid.tsx:290"}, "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-206eb9fc66b6b1a8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/MetricPinSheet.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/MetricPinSheet.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19627ddb413db92f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/VesselWidget.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/VesselWidget.tsx:56"}, "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-065a32ffb9469b22", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherCharts.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherCharts.tsx:209"}, "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-c1357627511c363e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/hero/EssentialAnchorView.tsx:417", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/hero/EssentialAnchorView.tsx:417"}, "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-715248f04f380dfc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatErrorBoundary.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatErrorBoundary.tsx:46"}, "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-edbba3b5c24154a3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatAttachmentSheets.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatAttachmentSheets.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f98a7d8d7d4582b1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatDMView.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatDMView.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1923c97837eba58", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/RecipeCard.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/RecipeCard.tsx:68"}, "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-2d34324fb8d5e311", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/PinMapViewer.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/PinMapViewer.tsx:205"}, "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-ddfb08f7f8e01c73", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/GalleyCard.tsx:460", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/GalleyCard.tsx:460"}, "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-f37fcf76aae5c31e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChefPlate.tsx:438", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChefPlate.tsx:438"}, "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-004ee8b42d324f00", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CaptainsTable.tsx:1027", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CaptainsTable.tsx:1027"}, "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-be445687d17f6d24", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChannelList.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChannelList.tsx:246"}, "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-98b9991ee70a67f4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/MealCalendar.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/MealCalendar.tsx:432"}, "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-e0fdb230f61a0829", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CustomRecipeForm.tsx:480", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CustomRecipeForm.tsx:480"}, "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-3fa78a465d767162", "name": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatMessageList.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatMessageList.tsx:151"}, "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-d69bf4fc958e1d98", "name": "`truncate` class without `title=` for hover reveal \u2014 components/voice/PiSetupWizard.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voice/PiSetupWizard.tsx:411"}, "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-3c9eff2a095d9fff", "name": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryPublishModal.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryPublishModal.tsx:124"}, "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-bdd333197e8d69e5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryEntryView.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryEntryView.tsx:105"}, "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-a24290c0b8ea3823", "name": "`truncate` class without `title=` for hover reveal \u2014 components/diary/SwipeableDiaryCard.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/SwipeableDiaryCard.tsx:207"}, "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-b17c422d81320fdb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/onboarding/HomePortStep.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/onboarding/HomePortStep.tsx:106"}, "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-3a1af5b112e0505f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/LegPickerDropdown.tsx:712", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/LegPickerDropdown.tsx:712"}, "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-f928aae89af46764", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/TripOverviewSheet.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/TripOverviewSheet.tsx:233"}, "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-8099c2c3d4ed450f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/CustomsClearanceCard.tsx:387", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/CustomsClearanceCard.tsx:387"}, "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-8215ef7812b6e9f2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureSweepSheet.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureSweepSheet.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9b24d036ccf4647", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/EmergencyPlan.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/EmergencyPlan.tsx:176"}, "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-0c9006fe45a67782", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VoyageCleanupSheet.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VoyageCleanupSheet.tsx:177"}, "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-400f4cacfec55319", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/AccordionSection.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/AccordionSection.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fa54ff7dcd6b509", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/GalleyMealPlanner.tsx:389", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/GalleyMealPlanner.tsx:389"}, "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-58ffbfece0d7ac64", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ComfortQuickConfig.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ComfortQuickConfig.tsx:124"}, "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-7db9fff7fe6a429e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/SavedLocationsPicker.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/SavedLocationsPicker.tsx:221"}, "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-adabd3bb6c99f7dd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureWindowSheet.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureWindowSheet.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-901d47aaa9ef8041", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchAssignSheet.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchAssignSheet.tsx:168"}, "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-6fe66501c23322e2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ResourceCalculator.tsx:530", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ResourceCalculator.tsx:530"}, "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-e862280d8208bdd4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VesselProfileSummary.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VesselProfileSummary.tsx:124"}, "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-f55fa32cec117628", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/PassageSummaryCard.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/PassageSummaryCard.tsx:167"}, "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-d6d2634aec690163", "name": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchScheduleCard.tsx:650", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchScheduleCard.tsx:650"}, "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-6e5c65428a491a60", "name": "`truncate` class without `title=` for hover reveal \u2014 components/crew-finder/CrewMatchesList.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crew-finder/CrewMatchesList.tsx:72"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97cb37995be9ee44", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/CastOffPanel.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/CastOffPanel.tsx:342"}, "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-1e8173a89cb2b9e8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EquipmentList.tsx:579", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EquipmentList.tsx:579"}, "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-6324b3ae865e70fc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/NmeaPage.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/NmeaPage.tsx:194"}, "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-bb9978635af5021e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/AvNavPage.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/AvNavPage.tsx:136"}, "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-573dbed899de3e9f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GalleyPage.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GalleyPage.tsx:230"}, "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-3cd93eb34e658333", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EncCellManager.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EncCellManager.tsx:144"}, "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-6a276aa5cb118f65", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GpxImportPage.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GpxImportPage.tsx:361"}, "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-3a3d20ceb276053a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/inventory/SwipeableInventoryCard.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/inventory/SwipeableInventoryCard.tsx:76"}, "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-6e240229c41b7a39", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/checklists/SwipeableItemCard.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/checklists/SwipeableItemCard.tsx:150"}, "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-51e44a3dca8fa419", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/equipment/SwipeableEquipmentCard.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/equipment/SwipeableEquipmentCard.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d430c1d7c12c6e07", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/maintenance/SwipeableTaskCard.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/maintenance/SwipeableTaskCard.tsx:105"}, "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-3badfde013837e46", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/SwipeableDocCard.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/SwipeableDocCard.tsx:140"}, "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-af9cd98084d55b60", "name": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/DocumentForm.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/DocumentForm.tsx:125"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbac8b3a1b0930c8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageBanner.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageBanner.tsx:245"}, "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-290263135de63d2c", "name": "Icon-only button without accessible name \u2014 components/map/useAisStreamLayer.ts:766", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/map/useAisStreamLayer.ts:766"}, "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-48dde726984ebc27", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/StormPicker.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/StormPicker.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d158975d0b502b4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/MapHubOverlays.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/MapHubOverlays.tsx:94"}, "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-6b61178ec42e9b45", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/RadialHelmMenu.tsx:869", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/RadialHelmMenu.tsx:869"}, "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-b04764acebda275a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/EncRouteButton.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/EncRouteButton.tsx:82"}, "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-841451d9ff5cfb6c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageDataPanel.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageDataPanel.tsx:136"}, "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-6e561effe3b2530a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/map/RouteTrackPicker.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/RouteTrackPicker.tsx:193"}, "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-e33be7f7fc9b86d1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageLogTable.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageLogTable.tsx:54"}, "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-c63434b29be14f4e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageOverviewCard.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageOverviewCard.tsx:53"}, "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-0edf9be95503f260", "name": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/RouteNodeGrid.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/RouteNodeGrid.tsx:67"}, "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-dc0c745c517073e9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/music/GlobalNowPlayingBar.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/music/GlobalNowPlayingBar.tsx:269"}, "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-c0eff475c90d3869", "name": "`truncate` class without `title=` for hover reveal \u2014 components/music/MusicPage.tsx:792", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/music/MusicPage.tsx:792"}, "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-0832a143e6ed1119", "name": "Stray `console.log` in TS/JS \u2014 pi-cache/src/scheduler.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/scheduler.ts:78"}, "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-70518a76e25cca67", "name": "Stray `console.log` in TS/JS \u2014 pi-cache/src/server.ts:132", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/server.ts:132"}, "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-be4f562e45a9cf9c", "name": "Stray `console.log` in TS/JS \u2014 pi-cache/src/encWatcher.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/encWatcher.ts:63"}, "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-f9ed6b37c4660f29", "name": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/proxy.ts:367", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/proxy.ts:367"}, "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-3b301521703a1971", "name": "Stray `console.log` in TS/JS \u2014 pi-cache/src/routes/charts.ts:381", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/routes/charts.ts:381"}, "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-c7675dfc9faf5f32", "name": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/routes/enc.ts:489", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/routes/enc.ts:489"}, "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-769fdbd0c7cf249b", "name": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/index.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/index.ts:67"}, "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-facd2398f3232830", "name": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/watchdog.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/watchdog.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fd31d6070c38959", "name": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/db.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/db.ts:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93632b0382c8e0ea", "name": "`truncate` class without `title=` for hover reveal \u2014 pages/log/LogSubComponents.tsx:473", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 pages/log/LogSubComponents.tsx:473"}, "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-a72e354a4577bc2c", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/import-csv.ts:240", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/import-csv.ts:240"}, "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-2276892dd36b7bf8", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/index.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/index.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-5645adc654096018", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/supabase.ts:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/supabase.ts:143"}, "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-24de502133e865b0", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/ItuMarsScraper.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/ItuMarsScraper.ts:26"}, "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-2fcf509e4026db23", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/UscgScraper.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/UscgScraper.ts:34"}, "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-9ad72566402aeb37", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AisSeedScraper.ts:331", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AisSeedScraper.ts:331"}, "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-6cd410cca537fb47", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:41"}, "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-84934636dca33a4e", "name": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ffb1a87eaa61f19", "name": "Icon-only button without accessible name \u2014 stories/AuthBanner.stories.tsx:27", "shortDescription": {"text": "Icon-only button without accessible name \u2014 stories/AuthBanner.stories.tsx:27"}, "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-9f16d10390f9d892", "name": "Icon-only button without accessible name \u2014 stories/ToastNotification.stories.tsx:35", "shortDescription": {"text": "Icon-only button without accessible name \u2014 stories/ToastNotification.stories.tsx:35"}, "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-0325f16eb24e6961", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/index.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/index.ts:49"}, "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-ca5599c4b5877e78", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/supabase.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/supabase.ts:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e39c5052be29ad12", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/ItuMarsScraper.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/ItuMarsScraper.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67e04b34504122ab", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/UscgScraper.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/UscgScraper.ts:14"}, "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-3f339136bc861e13", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AisSeedScraper.ts:315", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AisSeedScraper.ts:315"}, "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-b6904caad951533c", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.ts:30"}, "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-bb6cedc1b9a3b98b", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:29"}, "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-95cff04171a1b6e2", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/sweep-stale-vessels/index.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sweep-stale-vessels/index.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00d8e0bed1ab4a34", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/anthropic-proxy/index.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/anthropic-proxy/index.ts:67"}, "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-5e3b7db51e188962", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-token/index.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-token/index.ts:133"}, "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-6984433408b5b0b5", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-ws-proxy/index.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-ws-proxy/index.ts:69"}, "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-380f206bdc7b25c1", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/proxy-bosun-fallback/index.ts:257", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/proxy-bosun-fallback/index.ts:257"}, "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-b7cc66ccc111c48e", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:325", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:325"}, "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-87303ac74a6f4550", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/maritime-intel/index.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/maritime-intel/index.ts:115"}, "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-261e505f0a1325c9", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-weather-alerts/index.ts:362", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-weather-alerts/index.ts:362"}, "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-52f5a872a6aa7646", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/lookup-vessel/index.ts:287", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/lookup-vessel/index.ts:287"}, "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-31521aedd3b4a2d9", "name": "TODO/FIXME marker in shipping code \u2014 services/ProfilePhotoService.ts:157", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 services/ProfilePhotoService.ts:157"}, "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-09f2e647aae4032e", "name": "Stray `console.log` in TS/JS \u2014 services/voice/speechRecognizer.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/voice/speechRecognizer.ts:80"}, "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-a6f4f1dd17f43f2d", "name": "Stray `console.log` in TS/JS \u2014 services/voice/deepgramRecognizer.ts:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/voice/deepgramRecognizer.ts:168"}, "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-a4c14ed90dd239c4", "name": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/routeTest.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/routeTest.ts:110"}, "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-d4c40be7304d0fd6", "name": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/cli.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/cli.ts:67"}, "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-2df393d13c7dc78a", "name": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/scan.ts:146", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/scan.ts:146"}, "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-9f6d04e1c16ee69b", "name": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/decryptBatch.ts:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/decryptBatch.ts:136"}, "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-c287f51b134fea9f", "name": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/extract.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/extract.ts:18"}, "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-3cd15e580196c05f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TopNav.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TopNav.tsx:28"}, "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-b59bb3e8a2ebbf38", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MapContainer.tsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MapContainer.tsx:312"}, "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-f8c3700e1d33406b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/DiarySidebar.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/DiarySidebar.tsx:95"}, "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-b470b5fe4a28b021", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0dfcac2b7e01d59f", "name": "Privileged port 15 in use", "shortDescription": {"text": "Privileged port 15 in use"}, "fullDescription": {"text": "Port 15 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e7fbfc8068afc6bf", "name": "Privileged port 17 in use", "shortDescription": {"text": "Privileged port 17 in use"}, "fullDescription": {"text": "Port 17 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b00d3414ca42be66", "name": "Dockerfile runs as root: workers/ais-ingest/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: workers/ais-ingest/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c712468f74331236", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-534629d955b67b22", "name": "Dockerfile runs as root: vessel-scraper/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: vessel-scraper/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c94eeec6f63ec66c", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-119ad587100b2b66", "name": "Insecure pattern 'cors_wildcard' in vite.config.ts:202", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in vite.config.ts:202"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e599fc6e5f06f904", "name": "Insecure pattern 'cors_wildcard' in scripts/mock-signalk-server.cjs:110", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in scripts/mock-signalk-server.cjs:110"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18d74941193fcd42", "name": "Insecure pattern 'local_storage_auth_token' in components/ChatPage.tsx:754", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in components/ChatPage.tsx:754"}, "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-54f440577198ea5c", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useCycloneLayer.ts:2003", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useCycloneLayer.ts:2003"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ceb6086214e5b51", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useAisStreamLayer.ts:764", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useAisStreamLayer.ts:764"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52404638070fdbfd", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useDestinationFlag.ts:87", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useDestinationFlag.ts:87"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed58653fc5c1dbe9", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useVesselTracker.ts:74", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useVesselTracker.ts:74"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e17667cef15096d", "name": "Possible secret in pi-cache/setup-opencpn.sh", "shortDescription": {"text": "Possible secret in pi-cache/setup-opencpn.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-1befa76380c13923", "name": "Insecure pattern 'cors_wildcard' in pi-cache/src/server.ts:48", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in pi-cache/src/server.ts:48"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fac10ed565bd7823", "name": "Insecure pattern 'node_child_process' in pi-cache/src/encWatcher.ts:38", "shortDescription": {"text": "Insecure pattern 'node_child_process' in pi-cache/src/encWatcher.ts:38"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e1fcf6542270a3bb", "name": "Insecure pattern 'node_child_process' in pi-cache/src/routes/enc.ts:51", "shortDescription": {"text": "Insecure pattern 'node_child_process' in pi-cache/src/routes/enc.ts:51"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a946ef83c38b6abf", "name": "Possible secret in bosun-pi/bosun_network_apply.py", "shortDescription": {"text": "Possible secret in bosun-pi/bosun_network_apply.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4358d338be90818f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/elevenlabs-tts/index.ts:34", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/elevenlabs-tts/index.ts:34"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f5d529eb0529656", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/scrape-vessel-metadata/index.ts:32", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/scrape-vessel-metadata/index.ts:32"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2a55452eeb5532f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-himawari-ir/index.ts:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-himawari-ir/index.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9e98a2ffe73ff9e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/create-marketplace-payment/index.ts:20", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-marketplace-payment/index.ts:20"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b41b7ac7e28e9f38", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-ukho-msi/index.ts:27", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-ukho-msi/index.ts:27"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9bcbb97c39e31b5f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-stale-vessels/index.ts:10", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-stale-vessels/index.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7bbed9baaff86da0", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-user/index.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-user/index.ts:19"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1dfeb068b06afa62", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-precip-grid/index.ts:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-precip-grid/index.ts:24"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b25b8b3ddb2ef2b", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-openmeteo/index.ts:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-openmeteo/index.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-033f36fad659d2b7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/anthropic-proxy/index.ts:30", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/anthropic-proxy/index.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a55c4d915fa8a066", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/deepgram-token/index.ts:41", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/deepgram-token/index.ts:41"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d076ec2e8531b13", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/vessels-nearby/index.ts:18", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/vessels-nearby/index.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84b17c3b3214923d", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-gemini/index.ts:29", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-gemini/index.ts:29"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50376a31a4a0efab", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/musickit-token/index.ts:42", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/musickit-token/index.ts:42"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3437d54b76c3dbb7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-gfs-tracker/index.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-gfs-tracker/index.ts:19"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61c3ffb830a6d96f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-velocity/index.ts:24", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-velocity/index.ts:24"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74a63d4014945a0e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-amsa-msi/index.ts:38", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-amsa-msi/index.ts:38"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb8d23fb8112163a", "name": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-anchor-alarm/index.ts:30", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-anchor-alarm/index.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-007b6bc872ac240e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/gemini-diary/index.ts:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gemini-diary/index.ts:25"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c02af9290506cfa", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-tides/index.ts:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-tides/index.ts:25"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a313670ac187319a", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/voyage-log/index.ts:40", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/voyage-log/index.ts:40"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-babbe3f5f4314d3c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-linz-msi/index.ts:37", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-linz-msi/index.ts:37"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46d3951ce40b1b5a", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-bosun-fallback/index.ts:30", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-bosun-fallback/index.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64baa58d2176a059", "name": "Insecure pattern 'private_key_in_repo' in supabase/functions/fetch-weatherkit/index.ts:56", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/fetch-weatherkit/index.ts:56"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-02983a7c0b70fd78", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-weatherkit/index.ts:30", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-weatherkit/index.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0d228f5e5ff2e9f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-grid/index.ts:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-grid/index.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-076a69b8de365759", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-expired-escrows/index.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-expired-escrows/index.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23a0d0e8cbc5ffc5", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/route-weather/index.ts:32", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/route-weather/index.ts:32"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38fc13730770c540", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/capture-escrow-payment/index.ts:16", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/capture-escrow-payment/index.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b32d4c9f784e93d1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-rainbow/index.ts:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-rainbow/index.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d12d727c59f6899b", "name": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push/index.ts:64", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push/index.ts:64"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ee62dd013eb6c7a5", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/maritime-intel/index.ts:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/maritime-intel/index.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d620fdbfad6392e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/gebco-depth/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gebco-depth/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0aa8e60440ae090", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-stormglass/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-stormglass/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5433c366ab023d76", "name": "Insecure pattern 'private_key_in_repo' in supabase/functions/get-weather/index.ts:158", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/get-weather/index.ts:158"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e9bdb643eedb4aca", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/get-weather/index.ts:34", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/get-weather/index.ts:34"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecee668483ffced3", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-pressure-grid/index.ts:16", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-pressure-grid/index.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8d38fb8e07ec9028", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/satellite-tile/index.ts:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/satellite-tile/index.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16abcdf914d8bad5", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/route-bathymetric/index.ts:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/route-bathymetric/index.ts:25"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8965fb06d29f83ab", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-vessel/index.ts:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-vessel/index.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe55830697aebd27", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-overpass/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-overpass/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2aa324654fff0d14", "name": "Insecure pattern 'new_function_used' in services/AvNavDiscoveryService.ts:110", "shortDescription": {"text": "Insecure pattern 'new_function_used' in services/AvNavDiscoveryService.ts:110"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e0eef07735fc33c", "name": "Insecure pattern 'node_child_process' in tools/senc-extractor/src/oexserverd.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in tools/senc-extractor/src/oexserverd.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bac54824175ba1e8", "name": "Insecure pattern 'cors_wildcard' in public/voyage-log-api.html:167", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in public/voyage-log-api.html:167"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2df6200eed8f8dd", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-deddfe459837e93a", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65aa740cba4a4a73", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-a118ec7c6c1fc31c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-d3853a15a967f2c4", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-84576ea3587b14a5", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d28275bab3168ad", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-f27ccc10db930424", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70cec907b7e0ca4d", "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-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@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-1dd0ab95eeed0274", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-d2075c37f720bb5b", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0840d07864313e3", "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-ebe12be0a8dd6120", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-ce970c4d354ec48f", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f029227ace523bc", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-2bd5769827885cf6", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed1c2f218170bd91", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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-1c172ef918b5b7eb", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49582109aa92d933", "name": "Very large file: App.tsx (1126 lines)", "shortDescription": {"text": "Very large file: App.tsx (1126 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-4f1b26467333adf5", "name": "Very large file: scripts/build_nav_graph.py (1383 lines)", "shortDescription": {"text": "Very large file: scripts/build_nav_graph.py (1383 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-14c48be18b399728", "name": "Very large file: utils/logExportPdf.ts (1403 lines)", "shortDescription": {"text": "Very large file: utils/logExportPdf.ts (1403 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-f76de1e5a13594e1", "name": "Very large file: components/VesselHub.tsx (2127 lines)", "shortDescription": {"text": "Very large file: components/VesselHub.tsx (2127 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-c25dbd23f8f20e16", "name": "Very large file: components/CrewManagement.tsx (1402 lines)", "shortDescription": {"text": "Very large file: components/CrewManagement.tsx (1402 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-e1b87fc9596b08c3", "name": "Very large file: components/SettingsModal.tsx (1025 lines)", "shortDescription": {"text": "Very large file: components/SettingsModal.tsx (1025 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-997bf3ce7cb83fce", "name": "Very large file: components/Dashboard.tsx (1057 lines)", "shortDescription": {"text": "Very large file: components/Dashboard.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-07c1011c90d348cf", "name": "Very large file: components/TrackMapViewer.tsx (1037 lines)", "shortDescription": {"text": "Very large file: components/TrackMapViewer.tsx (1037 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-7ce1b432569bffb0", "name": "Very large file: components/AnchorWatchPage.tsx (1302 lines)", "shortDescription": {"text": "Very large file: components/AnchorWatchPage.tsx (1302 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-a7c7ebc37e99f807", "name": "Very large file: components/dashboard/HeroSlide.tsx (1310 lines)", "shortDescription": {"text": "Very large file: components/dashboard/HeroSlide.tsx (1310 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-5ac8808ea4d5bfe9", "name": "Very large file: components/chat/CaptainsTable.tsx (1107 lines)", "shortDescription": {"text": "Very large file: components/chat/CaptainsTable.tsx (1107 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-04c0f7c6c84cb6f8", "name": "Very large file: components/chat/MealCalendar.tsx (1045 lines)", "shortDescription": {"text": "Very large file: components/chat/MealCalendar.tsx (1045 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-1db11c8538e2c583", "name": "Very large file: components/voice/BosunConsole.tsx (1784 lines)", "shortDescription": {"text": "Very large file: components/voice/BosunConsole.tsx (1784 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-ee4caf30db551430", "name": "Very large file: components/vessel/AvNavPage.tsx (1422 lines)", "shortDescription": {"text": "Very large file: components/vessel/AvNavPage.tsx (1422 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-0a34a2aa775241c4", "name": "Very large file: components/map/useCycloneLayer.ts (2181 lines)", "shortDescription": {"text": "Very large file: components/map/useCycloneLayer.ts (2181 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-faa3c3dc738ce5be", "name": "Very large file: components/map/usePassagePlanner.ts (2161 lines)", "shortDescription": {"text": "Very large file: components/map/usePassagePlanner.ts (2161 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-ae019acf17f18cd6", "name": "Very large file: components/map/CurrentParticleLayer.ts (1119 lines)", "shortDescription": {"text": "Very large file: components/map/CurrentParticleLayer.ts (1119 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-afaf491b0c78cee4", "name": "Very large file: components/map/useWeatherLayers.ts (1939 lines)", "shortDescription": {"text": "Very large file: components/map/useWeatherLayers.ts (1939 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-e820b7f063bb5e57", "name": "Very large file: components/map/MapHubOverlays.tsx (1657 lines)", "shortDescription": {"text": "Very large file: components/map/MapHubOverlays.tsx (1657 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-87ee6f34d50ba249", "name": "Very large file: components/map/RadialHelmMenu.tsx (1257 lines)", "shortDescription": {"text": "Very large file: components/map/RadialHelmMenu.tsx (1257 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-2081009873b36c68", "name": "Very large file: components/map/WaveParticleLayer.ts (1111 lines)", "shortDescription": {"text": "Very large file: components/map/WaveParticleLayer.ts (1111 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-4ad3edbaf77b06bf", "name": "Very large file: components/map/EncVectorLayer.ts (1352 lines)", "shortDescription": {"text": "Very large file: components/map/EncVectorLayer.ts (1352 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-17af8782595868f5", "name": "Very large file: components/map/WindParticleLayer.ts (1368 lines)", "shortDescription": {"text": "Very large file: components/map/WindParticleLayer.ts (1368 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-c299f63930ddc8f6", "name": "Very large file: components/map/MapHub.tsx (2839 lines)", "shortDescription": {"text": "Very large file: components/map/MapHub.tsx (2839 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-95099ddb943b14cb", "name": "Very large file: components/map/useMapInit.ts (1205 lines)", "shortDescription": {"text": "Very large file: components/map/useMapInit.ts (1205 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-362ea2729233f867", "name": "Very large file: components/music/MusicPage.tsx (1889 lines)", "shortDescription": {"text": "Very large file: components/music/MusicPage.tsx (1889 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-9e7d9f9be1168b1d", "name": "Very large file: pi-cache/src/routes/enc.ts (1508 lines)", "shortDescription": {"text": "Very large file: pi-cache/src/routes/enc.ts (1508 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-f435d2648b484315", "name": "Very large file: pi-cache/src/services/inshoreRouter.ts (2566 lines)", "shortDescription": {"text": "Very large file: pi-cache/src/services/inshoreRouter.ts (2566 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-fd02b1e98089a82c", "name": "Very large file: pages/LogPage.tsx (1319 lines)", "shortDescription": {"text": "Very large file: pages/LogPage.tsx (1319 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-7f31c7713131a442", "name": "Very large file: hooks/useLogPageState.ts (1311 lines)", "shortDescription": {"text": "Very large file: hooks/useLogPageState.ts (1311 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-cb92e754d9718e61", "name": "Very large file: hooks/useVoyageForm.ts (1204 lines)", "shortDescription": {"text": "Very large file: hooks/useVoyageForm.ts (1204 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-d629d31408375886", "name": "Very large file: supabase/functions/route-weather/index.ts (2477 lines)", "shortDescription": {"text": "Very large file: supabase/functions/route-weather/index.ts (2477 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-b3ecb6216215ca5b", "name": "Very large file: services/ChartLockerService.ts (2054 lines)", "shortDescription": {"text": "Very large file: services/ChartLockerService.ts (2054 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-613f811d7a8064a7", "name": "Very large file: services/GalleyRecipeService.ts (2085 lines)", "shortDescription": {"text": "Very large file: services/GalleyRecipeService.ts (2085 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-24b104a651a791be", "name": "Very large file: services/DiaryService.ts (1159 lines)", "shortDescription": {"text": "Very large file: services/DiaryService.ts (1159 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-f9d300e7dc3ea9ee", "name": "Very large file: services/ChatService.ts (1413 lines)", "shortDescription": {"text": "Very large file: services/ChatService.ts (1413 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-b70fe7636f8e4465", "name": "Very large file: services/AvNavService.ts (1716 lines)", "shortDescription": {"text": "Very large file: services/AvNavService.ts (1716 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-2870b5f6c382f9c1", "name": "Very large file: services/InshoreRouter.ts (2615 lines)", "shortDescription": {"text": "Very large file: services/InshoreRouter.ts (2615 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-5d23be17f270b91f", "name": "Very large file: services/inshoreRouterEngine.ts (3798 lines)", "shortDescription": {"text": "Very large file: services/inshoreRouterEngine.ts (3798 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-fc8c8948168efe4c", "name": "Very large file: services/voice/deepgramRecognizer.ts (1538 lines)", "shortDescription": {"text": "Very large file: services/voice/deepgramRecognizer.ts (1538 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-537c7248d07c5223", "name": "Very large file: services/voice/orchestrator.ts (1373 lines)", "shortDescription": {"text": "Very large file: services/voice/orchestrator.ts (1373 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-c7b7c3751afcb72f", "name": "Very large file: pack-generator/spikes/brisbane-bathymetry.sh (1420 lines)", "shortDescription": {"text": "Very large file: pack-generator/spikes/brisbane-bathymetry.sh (1420 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "243 tests / 987 src (ratio 0.25)."}, "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-1e12423b06908cee", "name": "Node manifest has dependencies but no lockfile: scripts/linz-msi-scrape/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: scripts/linz-msi-scrape/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f46282dc749434af", "name": "Node manifest has dependencies but no lockfile: vessel-scraper/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: vessel-scraper/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc704165b0fa2448", "name": "Node manifest has dependencies but no lockfile: tools/senc-extractor/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: tools/senc-extractor/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 953 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 418 placeholder/mock markers across 121 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b39b2e35fcd0733", "name": "Commented-code block (7 lines) in vite.config.ts:51", "shortDescription": {"text": "Commented-code block (7 lines) in vite.config.ts:51"}, "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-0970bd53ea591afc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js: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-40ee464ad581393c", "name": "Commented-code block (10 lines) in capacitor.config.ts:10", "shortDescription": {"text": "Commented-code block (10 lines) in capacitor.config.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49d431820448f0d3", "name": "Commented-code block (7 lines) in index.tsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in index.tsx:4"}, "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-e7d9340759703bec", "name": "Commented-code block (5 lines) in middleware.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in middleware.ts:21"}, "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-f55ba8564cc9ad11", "name": "`fetch()` without try/.catch or AbortSignal \u2014 middleware.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 middleware.ts:47"}, "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-b29bea55e27227e1", "name": "Commented-code block (5 lines) in eslint.config.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in eslint.config.js:19"}, "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-d3c74a160a506f78", "name": "Commented-code block (6 lines) in viewRegistry.tsx:211", "shortDescription": {"text": "Commented-code block (6 lines) in viewRegistry.tsx:211"}, "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-68a6f8b0a7bf8dde", "name": "Commented-code block (7 lines) in App.tsx:90", "shortDescription": {"text": "Commented-code block (7 lines) in App.tsx:90"}, "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-945e57c8c6eb9922", "name": "Commented-code block (7 lines) in stores/settingsStore.ts:252", "shortDescription": {"text": "Commented-code block (7 lines) in stores/settingsStore.ts:252"}, "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-af50304987e6fe09", "name": "Commented-code block (7 lines) in stores/uiStore.ts:69", "shortDescription": {"text": "Commented-code block (7 lines) in stores/uiStore.ts:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af75657d4819efe4", "name": "Commented-code block (8 lines) in stores/authStore.ts:49", "shortDescription": {"text": "Commented-code block (8 lines) in stores/authStore.ts:49"}, "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-b38fdae072cd009d", "name": "Commented-code block (10 lines) in tests/inshoreRouter.uncharted.test.ts:230", "shortDescription": {"text": "Commented-code block (10 lines) in tests/inshoreRouter.uncharted.test.ts:230"}, "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-c4811f32529c9182", "name": "Legacy-named symbol `thalassa_chat_channels_v1` in tests/ChatService.test.ts:294", "shortDescription": {"text": "Legacy-named symbol `thalassa_chat_channels_v1` in tests/ChatService.test.ts:294"}, "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-4b6ead292625bfce", "name": "Commented-code block (6 lines) in tests/anchorWatch.test.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in tests/anchorWatch.test.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a15e14b41e74587f", "name": "Commented-code block (9 lines) in tests/inshoreRouter.seamanship.test.ts:125", "shortDescription": {"text": "Commented-code block (9 lines) in tests/inshoreRouter.seamanship.test.ts:125"}, "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-332d0530e823639f", "name": "Commented-code block (5 lines) in tests/seawayConnector.test.ts:94", "shortDescription": {"text": "Commented-code block (5 lines) in tests/seawayConnector.test.ts:94"}, "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-f89fa89d6944a3c3", "name": "Commented-code block (6 lines) in tests/locationType.test.ts:33", "shortDescription": {"text": "Commented-code block (6 lines) in tests/locationType.test.ts:33"}, "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-d91d2ae13f65b913", "name": "Legacy-named symbol `cloud_old` in tests/voyageData.test.ts:329", "shortDescription": {"text": "Legacy-named symbol `cloud_old` in tests/voyageData.test.ts:329"}, "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-5ba85bef1a1ce66c", "name": "Commented-code block (7 lines) in tests/inshoreRouter.regression.test.ts:123", "shortDescription": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.regression.test.ts:123"}, "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-351c72fe64c8e615", "name": "Commented-code block (5 lines) in tests/inshoreRouter.pairing.test.ts:60", "shortDescription": {"text": "Commented-code block (5 lines) in tests/inshoreRouter.pairing.test.ts:60"}, "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-a892f2927d2afeee", "name": "Commented-code block (5 lines) in tests/aisDecoder.test.ts:163", "shortDescription": {"text": "Commented-code block (5 lines) in tests/aisDecoder.test.ts:163"}, "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-04f7f0b058472d9e", "name": "Commented-code block (5 lines) in tests/shiplog-CourseChangeDetector.test.ts:109", "shortDescription": {"text": "Commented-code block (5 lines) in tests/shiplog-CourseChangeDetector.test.ts:109"}, "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-dbae8c395d81d24d", "name": "Commented-code block (5 lines) in tests/mergeByUpdatedAt.test.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in tests/mergeByUpdatedAt.test.ts:74"}, "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-c4c4289860e24f82", "name": "Commented-code block (5 lines) in tests/vesselUnits.test.ts:56", "shortDescription": {"text": "Commented-code block (5 lines) in tests/vesselUnits.test.ts:56"}, "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-c30260fd1ed29651", "name": "Commented-code block (7 lines) in tests/inshoreRouter.marina.test.ts:76", "shortDescription": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.marina.test.ts:76"}, "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-03b7eb998603d996", "name": "Commented-code block (5 lines) in tests/fairlead.test.ts:114", "shortDescription": {"text": "Commented-code block (5 lines) in tests/fairlead.test.ts:114"}, "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-72139123a91acb02", "name": "Commented-code block (7 lines) in tests/inshoreRouter.golden.test.ts:72", "shortDescription": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.golden.test.ts:72"}, "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-3c61eef1c6ac4481", "name": "Commented-code block (7 lines) in tests/seawayShadow.test.ts:257", "shortDescription": {"text": "Commented-code block (7 lines) in tests/seawayShadow.test.ts:257"}, "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-6ea63b80a5a5cd40", "name": "Commented-code block (6 lines) in tests/LogPage.test.tsx:174", "shortDescription": {"text": "Commented-code block (6 lines) in tests/LogPage.test.tsx:174"}, "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-25619972795cb42c", "name": "Commented-code block (5 lines) in tests/seawayArbitration.corpus.test.ts:89", "shortDescription": {"text": "Commented-code block (5 lines) in tests/seawayArbitration.corpus.test.ts:89"}, "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-fc811f6970bf2a93", "name": "Commented-code block (7 lines) in tests/inshoreRouter.approachDivert.test.ts:98", "shortDescription": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.approachDivert.test.ts:98"}, "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-f7140743392d9735", "name": "Commented-code block (7 lines) in tests/seawayCrossLine.test.ts:142", "shortDescription": {"text": "Commented-code block (7 lines) in tests/seawayCrossLine.test.ts:142"}, "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-2a58bb999dc419b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/sst/[file].ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/sst/[file].ts:28"}, "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-f5e9d67c6b4985f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/chl/[file].ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/chl/[file].ts:25"}, "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-d01d787270aea322", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/mld/[file].ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/mld/[file].ts:25"}, "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-18e8f79d42509734", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/waves/[file].ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/waves/[file].ts:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea4ebdb4d6a23d41", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/currents/[file].ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/currents/[file].ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-318b3cdcae299f3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/seaice/[file].ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/seaice/[file].ts:25"}, "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-c3625b7e9208a7a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/mpa/[file].ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/mpa/[file].ts:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6321f0bfde4fa871", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-reef-edge-markers.mjs:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-reef-edge-markers.mjs:110"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba67b9943f20c63f", "name": "Commented-code block (5 lines) in scripts/audit-orphan-routes.mjs:62", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/audit-orphan-routes.mjs:62"}, "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-e0853f22679896b9", "name": "Commented-code block (5 lines) in scripts/cmems-sst-pipeline/pipeline.py:158", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/cmems-sst-pipeline/pipeline.py:158"}, "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-7b197df9dda6f7e6", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-sst-pipeline/pipeline.py:208", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-sst-pipeline/pipeline.py:208"}, "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-68a6304a181c8298", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-chl-pipeline/pipeline.py:219", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-chl-pipeline/pipeline.py:219"}, "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-4512001051b58684", "name": "Commented-code block (7 lines) in scripts/mpa-pipeline/pipeline.py:46", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/mpa-pipeline/pipeline.py:46"}, "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-29dc8744726de33b", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/mpa-pipeline/pipeline.py:256", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/mpa-pipeline/pipeline.py:256"}, "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-048762b261ed8110", "name": "Commented-code block (5 lines) in scripts/linz-msi-scrape/scrape.mjs:45", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/linz-msi-scrape/scrape.mjs:45"}, "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-2640871475a5d443", "name": "Commented-code block (7 lines) in scripts/cmems-seaice-pipeline/pipeline.py:43", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/cmems-seaice-pipeline/pipeline.py:43"}, "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-02dccd1a038fbc15", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-seaice-pipeline/pipeline.py:219", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-seaice-pipeline/pipeline.py:219"}, "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-ce8c5a80394b9d67", "name": "Commented-code block (6 lines) in scripts/cmems-currents-pipeline/pipeline.py:51", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/cmems-currents-pipeline/pipeline.py:51"}, "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-0430c9600fdf990f", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-currents-pipeline/pipeline.py:209", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-currents-pipeline/pipeline.py:209"}, "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-562db47aaa4e117a", "name": "Commented-code block (5 lines) in scripts/cmems-mld-pipeline/pipeline.py:60", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/cmems-mld-pipeline/pipeline.py:60"}, "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-6f7645dc5ef45a2f", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-mld-pipeline/pipeline.py:223", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-mld-pipeline/pipeline.py:223"}, "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-cd07e52b51b344b4", "name": "Commented-code block (6 lines) in scripts/cmems-waves-pipeline/pipeline.py:187", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/cmems-waves-pipeline/pipeline.py:187"}, "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-81a656fce674a2fe", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-waves-pipeline/pipeline.py:235", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-waves-pipeline/pipeline.py:235"}, "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-592444e8697abe8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 utils/gpsFollow.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/gpsFollow.ts:47"}, "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-548685541aa2b11b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 utils/pdfExport.ts:419", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/pdfExport.ts:419"}, "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-69df3ce86b8d113c", "name": "Commented-code block (5 lines) in utils/defaultVessel.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in utils/defaultVessel.ts:13"}, "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-073f9953ddc17def", "name": "`fetch()` without try/.catch or AbortSignal \u2014 utils/logExportHelpers.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/logExportHelpers.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9978e3721ee6ee7e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 utils/rateLimiter.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/rateLimiter.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-2dce4cf29bef819a", "name": "Commented-code block (7 lines) in cloudflare-worker/src/index.ts:153", "shortDescription": {"text": "Commented-code block (7 lines) in cloudflare-worker/src/index.ts:153"}, "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-7adb5609ce947710", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/src/index.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/src/index.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc6416ae19e84082", "name": "Commented-code block (6 lines) in components/UpgradeModal.tsx:49", "shortDescription": {"text": "Commented-code block (6 lines) in components/UpgradeModal.tsx:49"}, "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-b23dc8275fe3ee1a", "name": "Commented-code block (15 lines) in components/NavButton.tsx:52", "shortDescription": {"text": "Commented-code block (15 lines) in components/NavButton.tsx:52"}, "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-3ed23fb02fb09c7a", "name": "Commented-code block (6 lines) in components/WarningDetails.tsx:81", "shortDescription": {"text": "Commented-code block (6 lines) in components/WarningDetails.tsx:81"}, "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-9947f0fc487e3c16", "name": "Commented-code block (22 lines) in components/VesselHub.tsx:77", "shortDescription": {"text": "Commented-code block (22 lines) in components/VesselHub.tsx:77"}, "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-32ddf50bf0c68321", "name": "Commented-code block (6 lines) in components/CrewManagement.tsx:77", "shortDescription": {"text": "Commented-code block (6 lines) in components/CrewManagement.tsx:77"}, "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-49a795cbc9d4dcaf", "name": "Commented-code block (10 lines) in components/SettingsModal.tsx:30", "shortDescription": {"text": "Commented-code block (10 lines) in components/SettingsModal.tsx:30"}, "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-71c0a9bd255391e2", "name": "Commented-code block (5 lines) in components/ChatPage.tsx:255", "shortDescription": {"text": "Commented-code block (5 lines) in components/ChatPage.tsx:255"}, "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-3a16635b9896da82", "name": "Commented-code block (6 lines) in components/Dashboard.tsx:176", "shortDescription": {"text": "Commented-code block (6 lines) in components/Dashboard.tsx:176"}, "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-4f2f2d5fadac2efa", "name": "Commented-code block (12 lines) in components/OnboardingWizard.tsx:69", "shortDescription": {"text": "Commented-code block (12 lines) in components/OnboardingWizard.tsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd7bec3eb63142ce", "name": "Commented-code block (6 lines) in components/RoutePlanner.tsx:98", "shortDescription": {"text": "Commented-code block (6 lines) in components/RoutePlanner.tsx:98"}, "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-1d2a14c50c8e8c56", "name": "Commented-code block (6 lines) in components/TrackMapViewer.tsx:238", "shortDescription": {"text": "Commented-code block (6 lines) in components/TrackMapViewer.tsx:238"}, "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-98a1534120d881d6", "name": "Commented-code block (5 lines) in components/LiveMiniMap.tsx:66", "shortDescription": {"text": "Commented-code block (5 lines) in components/LiveMiniMap.tsx:66"}, "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-14f171ce72756212", "name": "Commented-code block (9 lines) in components/DiaryPage.tsx:530", "shortDescription": {"text": "Commented-code block (9 lines) in components/DiaryPage.tsx:530"}, "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-d77b78dbc75ab5e6", "name": "Commented-code block (7 lines) in components/PushToast.tsx:115", "shortDescription": {"text": "Commented-code block (7 lines) in components/PushToast.tsx:115"}, "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-d048e27ac84c5889", "name": "Commented-code block (5 lines) in components/AnchorWatchPage.tsx:379", "shortDescription": {"text": "Commented-code block (5 lines) in components/AnchorWatchPage.tsx:379"}, "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-fd601af07b1a39a7", "name": "Commented-code block (5 lines) in components/SystemStatusButton.tsx:596", "shortDescription": {"text": "Commented-code block (5 lines) in components/SystemStatusButton.tsx:596"}, "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-b39e8d33ba50c919", "name": "Commented-code block (5 lines) in components/SignInScreen.tsx:38", "shortDescription": {"text": "Commented-code block (5 lines) in components/SignInScreen.tsx:38"}, "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-3bafc19ce1bb52e2", "name": "Commented-code block (5 lines) in components/settings/CalypsoIntegrationsTab.tsx:195", "shortDescription": {"text": "Commented-code block (5 lines) in components/settings/CalypsoIntegrationsTab.tsx:195"}, "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-523152aa202d1d2c", "name": "Commented-code block (5 lines) in components/settings/VoyageLogTab.tsx:121", "shortDescription": {"text": "Commented-code block (5 lines) in components/settings/VoyageLogTab.tsx:121"}, "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-96a315eaa514998f", "name": "Commented-code block (8 lines) in components/settings/VesselTab.tsx:59", "shortDescription": {"text": "Commented-code block (8 lines) in components/settings/VesselTab.tsx:59"}, "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-1da9258d4649825b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/marketplace/CreateListingModal.tsx:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/marketplace/CreateListingModal.tsx:146"}, "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-461504fa803be1ac", "name": "Commented-code block (5 lines) in components/nmea/TheGlassPage.tsx:530", "shortDescription": {"text": "Commented-code block (5 lines) in components/nmea/TheGlassPage.tsx:530"}, "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-02490671d1fe83bd", "name": "Commented-code block (5 lines) in components/ui/ConnectivityBanner.tsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in components/ui/ConnectivityBanner.tsx:75"}, "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-4318cf3f03481092", "name": "Commented-code block (6 lines) in components/ui/PageHeader.tsx:81", "shortDescription": {"text": "Commented-code block (6 lines) in components/ui/PageHeader.tsx:81"}, "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-1c80ea742e1d0867", "name": "Commented-code block (8 lines) in components/ui/OnboardingOverlay.tsx:82", "shortDescription": {"text": "Commented-code block (8 lines) in components/ui/OnboardingOverlay.tsx:82"}, "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-622592dcaab2ef04", "name": "Commented-code block (6 lines) in components/ui/SlideToAction.tsx:102", "shortDescription": {"text": "Commented-code block (6 lines) in components/ui/SlideToAction.tsx:102"}, "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-91e08db4ea716403", "name": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/ui/CoachMark.tsx:15", "shortDescription": {"text": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/ui/CoachMark.tsx:15"}, "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-62db6ab453a2bc28", "name": "Legacy-named symbol `thalassa_tooltip_tour_v2` in components/ui/OnboardingTooltips.tsx:16", "shortDescription": {"text": "Legacy-named symbol `thalassa_tooltip_tour_v2` in components/ui/OnboardingTooltips.tsx:16"}, "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-7247cb1611df1c62", "name": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/dashboard/HeroHeader.tsx:252", "shortDescription": {"text": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/dashboard/HeroHeader.tsx:252"}, "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-d14bcd6f611e0f58", "name": "Commented-code block (5 lines) in components/dashboard/HeroHeader.tsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/HeroHeader.tsx:101"}, "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-d598ccb5695469ec", "name": "Commented-code block (5 lines) in components/dashboard/HeroSlide.test.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/HeroSlide.test.tsx:47"}, "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-2cf5774cb7f2f2ab", "name": "Commented-code block (5 lines) in components/dashboard/StatusBadges.tsx:66", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/StatusBadges.tsx:66"}, "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-de84e61635e45601", "name": "Commented-code block (5 lines) in components/dashboard/HeroWidgets.tsx:535", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/HeroWidgets.tsx:535"}, "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-374bbba44588dc3d", "name": "Commented-code block (5 lines) in components/dashboard/MetricPinSheet.tsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/MetricPinSheet.tsx:19"}, "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-f9909ee3186456f8", "name": "Commented-code block (8 lines) in components/dashboard/RainForecastCard.tsx:70", "shortDescription": {"text": "Commented-code block (8 lines) in components/dashboard/RainForecastCard.tsx:70"}, "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-46d92a17468087d7", "name": "Legacy-named symbol `thalassa_swipe_hint_seen_v1` in components/dashboard/HeroSlide.tsx:268", "shortDescription": {"text": "Legacy-named symbol `thalassa_swipe_hint_seen_v1` in components/dashboard/HeroSlide.tsx:268"}, "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-8b76c8811e7141ca", "name": "Commented-code block (9 lines) in components/dashboard/HeroSlide.tsx:229", "shortDescription": {"text": "Commented-code block (9 lines) in components/dashboard/HeroSlide.tsx:229"}, "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-1881f7a2779d8a06", "name": "Commented-code block (8 lines) in components/dashboard/StalenessBanner.tsx:152", "shortDescription": {"text": "Commented-code block (8 lines) in components/dashboard/StalenessBanner.tsx:152"}, "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-9ca271eb759bb780", "name": "Commented-code block (6 lines) in components/dashboard/Hero.tsx:131", "shortDescription": {"text": "Commented-code block (6 lines) in components/dashboard/Hero.tsx:131"}, "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-8758dd6c7fa2c19c", "name": "Legacy-named symbol `thalassa_anchor_view_coach_v1` in components/dashboard/hero/EssentialAnchorView.tsx:354", "shortDescription": {"text": "Legacy-named symbol `thalassa_anchor_view_coach_v1` in components/dashboard/hero/EssentialAnchorView.tsx:354"}, "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-40522bd675a3522a", "name": "Commented-code block (5 lines) in components/dashboard/hero/EssentialAnchorView.tsx:94", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/hero/EssentialAnchorView.tsx:94"}, "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-7c1641200d520181", "name": "Commented-code block (8 lines) in components/chat/PinMapViewer.tsx:176", "shortDescription": {"text": "Commented-code block (8 lines) in components/chat/PinMapViewer.tsx:176"}, "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-1c2e8bde6e7aae80", "name": "Commented-code block (8 lines) in components/chat/GalleyCard.tsx:100", "shortDescription": {"text": "Commented-code block (8 lines) in components/chat/GalleyCard.tsx:100"}, "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-ff04db600d40a4ea", "name": "Commented-code block (5 lines) in components/chat/CaptainsTable.tsx:248", "shortDescription": {"text": "Commented-code block (5 lines) in components/chat/CaptainsTable.tsx:248"}, "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-ef3797ae1d517e78", "name": "Commented-code block (7 lines) in components/chat/ChannelList.tsx:115", "shortDescription": {"text": "Commented-code block (7 lines) in components/chat/ChannelList.tsx:115"}, "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-dd942a8204a762b4", "name": "Commented-code block (5 lines) in components/chat/MealCalendar.tsx:136", "shortDescription": {"text": "Commented-code block (5 lines) in components/chat/MealCalendar.tsx:136"}, "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-94c2a7df11916288", "name": "Commented-code block (6 lines) in components/chat/CustomRecipeForm.tsx:540", "shortDescription": {"text": "Commented-code block (6 lines) in components/chat/CustomRecipeForm.tsx:540"}, "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-a3fcd58889bc5b67", "name": "Commented-code block (8 lines) in components/voice/BosunConsole.tsx:138", "shortDescription": {"text": "Commented-code block (8 lines) in components/voice/BosunConsole.tsx:138"}, "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-f0bfec5fd3320624", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/diary/SwipeableDiaryCard.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/diary/SwipeableDiaryCard.tsx:81"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53faebcd03aab856", "name": "Commented-code block (7 lines) in components/crew/ReadinessCardStack.tsx:26", "shortDescription": {"text": "Commented-code block (7 lines) in components/crew/ReadinessCardStack.tsx:26"}, "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-90afd83cb7c323c7", "name": "Commented-code block (7 lines) in components/onboarding/VesselDetailsStep.tsx:188", "shortDescription": {"text": "Commented-code block (7 lines) in components/onboarding/VesselDetailsStep.tsx:188"}, "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-82e26a2e5a3f585d", "name": "Commented-code block (6 lines) in components/passage/LegPickerDropdown.tsx:519", "shortDescription": {"text": "Commented-code block (6 lines) in components/passage/LegPickerDropdown.tsx:519"}, "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-bc9fbf5497b2b259", "name": "Commented-code block (5 lines) in components/passage/TripOverviewSheet.tsx:89", "shortDescription": {"text": "Commented-code block (5 lines) in components/passage/TripOverviewSheet.tsx:89"}, "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-4502d901324a7282", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/passage/PassageCanvas.tsx:395", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/passage/PassageCanvas.tsx:395"}, "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-560a7403b882249b", "name": "Commented-code block (6 lines) in components/passage/CustomsClearanceCard.tsx:86", "shortDescription": {"text": "Commented-code block (6 lines) in components/passage/CustomsClearanceCard.tsx:86"}, "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-994b130dc1b70546", "name": "Commented-code block (7 lines) in components/passage/PassageRouteMap.tsx:47", "shortDescription": {"text": "Commented-code block (7 lines) in components/passage/PassageRouteMap.tsx:47"}, "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-87eca84834d5e7de", "name": "Commented-code block (5 lines) in components/passage/AccordionSection.tsx:129", "shortDescription": {"text": "Commented-code block (5 lines) in components/passage/AccordionSection.tsx:129"}, "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-592ad2139d3d9a38", "name": "Commented-code block (5 lines) in components/passage/RouteEnhancementChip.tsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in components/passage/RouteEnhancementChip.tsx:59"}, "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-50446812766005f7", "name": "Commented-code block (7 lines) in components/passage/VesselProfileSummary.tsx:80", "shortDescription": {"text": "Commented-code block (7 lines) in components/passage/VesselProfileSummary.tsx:80"}, "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-77f8ae80f4b3f156", "name": "Commented-code block (8 lines) in components/passage/PassageSummaryCard.tsx:111", "shortDescription": {"text": "Commented-code block (8 lines) in components/passage/PassageSummaryCard.tsx:111"}, "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-fdafdc5a7d693017", "name": "Commented-code block (6 lines) in components/passage/WatchScheduleCard.tsx:173", "shortDescription": {"text": "Commented-code block (6 lines) in components/passage/WatchScheduleCard.tsx:173"}, "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-4016b612f13e48d0", "name": "Commented-code block (6 lines) in components/passage/OceanCurrentsCard.tsx:40", "shortDescription": {"text": "Commented-code block (6 lines) in components/passage/OceanCurrentsCard.tsx:40"}, "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-2dbedc79a34ff8fc", "name": "Commented-code block (9 lines) in components/passage/WeatherWindowCard.tsx:70", "shortDescription": {"text": "Commented-code block (9 lines) in components/passage/WeatherWindowCard.tsx:70"}, "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-74998ab1ab9b6b33", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/vessel/DocumentsHub.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/vessel/DocumentsHub.tsx:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84e3c37fb3abde44", "name": "Commented-code block (7 lines) in components/vessel/CastOffPanel.tsx:136", "shortDescription": {"text": "Commented-code block (7 lines) in components/vessel/CastOffPanel.tsx:136"}, "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-b2587c121768b2f7", "name": "Commented-code block (9 lines) in components/vessel/MobPage.tsx:193", "shortDescription": {"text": "Commented-code block (9 lines) in components/vessel/MobPage.tsx:193"}, "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-d0a8ada8ff959f50", "name": "Commented-code block (5 lines) in components/vessel/RadioConsolePage.tsx:334", "shortDescription": {"text": "Commented-code block (5 lines) in components/vessel/RadioConsolePage.tsx:334"}, "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-f74f111895ddf69c", "name": "Commented-code block (5 lines) in components/vessel/NoticesPage.tsx:83", "shortDescription": {"text": "Commented-code block (5 lines) in components/vessel/NoticesPage.tsx:83"}, "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-505301edefd2c7f9", "name": "Commented-code block (7 lines) in components/vessel/AvNavPage.tsx:240", "shortDescription": {"text": "Commented-code block (7 lines) in components/vessel/AvNavPage.tsx:240"}, "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-4bda2d02ad6bd193", "name": "Legacy-named symbol `daysOld` in components/vessel/EncCellManager.tsx:77", "shortDescription": {"text": "Legacy-named symbol `daysOld` in components/vessel/EncCellManager.tsx:77"}, "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-438f725b22edc51c", "name": "Commented-code block (5 lines) in components/vessel/EncCellManager.tsx:401", "shortDescription": {"text": "Commented-code block (5 lines) in components/vessel/EncCellManager.tsx:401"}, "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-e1468364bab16d68", "name": "Commented-code block (9 lines) in components/map/useEncVectorLayer.ts:67", "shortDescription": {"text": "Commented-code block (9 lines) in components/map/useEncVectorLayer.ts:67"}, "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-c3bacc1cc9e469ba", "name": "Commented-code block (7 lines) in components/map/useCycloneLayer.ts:65", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/useCycloneLayer.ts:65"}, "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-d2f017674b5ec5de", "name": "Commented-code block (7 lines) in components/map/useOceanWaveParticleLayer.ts:230", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/useOceanWaveParticleLayer.ts:230"}, "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-7d90831f3e65ec34", "name": "Commented-code block (6 lines) in components/map/PassageBanner.tsx:226", "shortDescription": {"text": "Commented-code block (6 lines) in components/map/PassageBanner.tsx:226"}, "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-71680c828c480d75", "name": "Commented-code block (6 lines) in components/map/usePassagePlanner.ts:312", "shortDescription": {"text": "Commented-code block (6 lines) in components/map/usePassagePlanner.ts:312"}, "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-8a67317e30113cbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/usePassagePlanner.ts:1358", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/usePassagePlanner.ts:1358"}, "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-6e9c9df21d7bea28", "name": "Commented-code block (5 lines) in components/map/ThreatBanner.tsx:264", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/ThreatBanner.tsx:264"}, "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-58f83a4c90b68e64", "name": "Commented-code block (11 lines) in components/map/CurrentParticleLayer.ts:94", "shortDescription": {"text": "Commented-code block (11 lines) in components/map/CurrentParticleLayer.ts:94"}, "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-77c8049deeda4535", "name": "Commented-code block (5 lines) in components/map/useWeatherLayers.ts:240", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/useWeatherLayers.ts:240"}, "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-f9205fc69d224a12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useWeatherLayers.ts:1444", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useWeatherLayers.ts:1444"}, "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-2ff9bc505e7a9ad5", "name": "Commented-code block (5 lines) in components/map/MapHubOverlays.tsx:467", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/MapHubOverlays.tsx:467"}, "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-ac289a62512448e6", "name": "Commented-code block (7 lines) in components/map/useLightningLayer.ts:33", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/useLightningLayer.ts:33"}, "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-90de48bc74f6838a", "name": "Commented-code block (6 lines) in components/map/ChartModes.tsx:257", "shortDescription": {"text": "Commented-code block (6 lines) in components/map/ChartModes.tsx:257"}, "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-431daa8964d5246a", "name": "Commented-code block (5 lines) in components/map/useAvNavCharts.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/useAvNavCharts.ts:86"}, "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-5d4cd95ca4ebfe42", "name": "Commented-code block (8 lines) in components/map/mapConstants.ts:65", "shortDescription": {"text": "Commented-code block (8 lines) in components/map/mapConstants.ts:65"}, "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-6d4222589bd0c247", "name": "Commented-code block (7 lines) in components/map/useRouteTrackLayer.ts:32", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/useRouteTrackLayer.ts:32"}, "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-4ef152b7b51024c3", "name": "Commented-code block (7 lines) in components/map/RadialHelmMenu.tsx:166", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/RadialHelmMenu.tsx:166"}, "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-12aa9861a47bd6d8", "name": "Commented-code block (5 lines) in components/map/SstRasterLayer.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/SstRasterLayer.ts:28"}, "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-b77e65e2d918f58f", "name": "Commented-code block (11 lines) in components/map/WaveParticleLayer.ts:86", "shortDescription": {"text": "Commented-code block (11 lines) in components/map/WaveParticleLayer.ts:86"}, "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-38fd9f14b43fc450", "name": "Commented-code block (10 lines) in components/map/MldRasterLayer.ts:90", "shortDescription": {"text": "Commented-code block (10 lines) in components/map/MldRasterLayer.ts:90"}, "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-8b896b96065b058a", "name": "Commented-code block (6 lines) in components/map/useVesselTracker.ts:270", "shortDescription": {"text": "Commented-code block (6 lines) in components/map/useVesselTracker.ts:270"}, "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-a23851176275587f", "name": "Commented-code block (5 lines) in components/map/PerfDowntierToast.tsx:34", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/PerfDowntierToast.tsx:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d902a654546a54d8", "name": "Commented-code block (5 lines) in components/map/EncVectorLayer.ts:61", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/EncVectorLayer.ts:61"}, "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-003f2e2498e9592b", "name": "Commented-code block (7 lines) in components/map/WindParticleLayer.ts:1093", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/WindParticleLayer.ts:1093"}, "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-0b4fc97d76a7d765", "name": "Legacy-named symbol `thalassa_map_enc_chart_detail_v2` in components/map/MapHub.tsx:401", "shortDescription": {"text": "Legacy-named symbol `thalassa_map_enc_chart_detail_v2` in components/map/MapHub.tsx:401"}, "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-2214a58f7ace0da8", "name": "Commented-code block (5 lines) in components/map/MapHub.tsx:114", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/MapHub.tsx:114"}, "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-8628ed67585b57d3", "name": "Commented-code block (5 lines) in components/map/WindGLEngine.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/WindGLEngine.ts:21"}, "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-036988d4853d68c3", "name": "Commented-code block (8 lines) in components/map/useMapInit.ts:232", "shortDescription": {"text": "Commented-code block (8 lines) in components/map/useMapInit.ts:232"}, "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-9344f353a69d3645", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useMapInit.ts:759", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useMapInit.ts:759"}, "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-d4757c734662383e", "name": "Commented-code block (5 lines) in components/map/OfflineTileControl.tsx:38", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/OfflineTileControl.tsx:38"}, "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-9b2d86f3cb46a8c2", "name": "Commented-code block (5 lines) in components/map/useMpaLayer.ts:194", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/useMpaLayer.ts:194"}, "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-88fc46cad7f799d7", "name": "Commented-code block (9 lines) in components/map/SeaIceRasterLayer.ts:93", "shortDescription": {"text": "Commented-code block (9 lines) in components/map/SeaIceRasterLayer.ts:93"}, "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-47900f4c635bae11", "name": "Commented-code block (5 lines) in components/map/ChlRasterLayer.ts:87", "shortDescription": {"text": "Commented-code block (5 lines) in components/map/ChlRasterLayer.ts:87"}, "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-5e9bc4816fc606bb", "name": "Commented-code block (6 lines) in components/map/MapboxVelocityOverlay.tsx:599", "shortDescription": {"text": "Commented-code block (6 lines) in components/map/MapboxVelocityOverlay.tsx:599"}, "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-52e471dcc6668615", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/MapboxVelocityOverlay.tsx:430", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/MapboxVelocityOverlay.tsx:430"}, "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-5b2c6993fbf73976", "name": "Commented-code block (7 lines) in components/map/useOceanCurrentParticleLayer.ts:230", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/useOceanCurrentParticleLayer.ts:230"}, "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-f5b6728ba815b6c4", "name": "Commented-code block (7 lines) in components/map/ConnectivityChip.tsx:83", "shortDescription": {"text": "Commented-code block (7 lines) in components/map/ConnectivityChip.tsx:83"}, "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-935f172c673127fb", "name": "Commented-code block (7 lines) in components/music/GlobalNowPlayingBar.tsx:59", "shortDescription": {"text": "Commented-code block (7 lines) in components/music/GlobalNowPlayingBar.tsx:59"}, "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-bf1b99882c0121cb", "name": "Commented-code block (5 lines) in components/music/MusicPage.tsx:208", "shortDescription": {"text": "Commented-code block (5 lines) in components/music/MusicPage.tsx:208"}, "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-9e01d4231189242f", "name": "Commented-code block (5 lines) in pi-cache/src/server.ts:49", "shortDescription": {"text": "Commented-code block (5 lines) in pi-cache/src/server.ts:49"}, "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-357a2967be3249c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/server.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/server.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-4d714f37979d63ef", "name": "Commented-code block (7 lines) in pi-cache/src/routes/charts.ts:276", "shortDescription": {"text": "Commented-code block (7 lines) in pi-cache/src/routes/charts.ts:276"}, "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-6b43fe48006b594d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/routes/charts.ts:231", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/routes/charts.ts:231"}, "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-6d9b07e4714cebd9", "name": "Commented-code block (6 lines) in pi-cache/src/routes/weather.ts:169", "shortDescription": {"text": "Commented-code block (6 lines) in pi-cache/src/routes/weather.ts:169"}, "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-f34cdd3baa97c1e8", "name": "Commented-code block (5 lines) in pi-cache/src/routes/enc.ts:154", "shortDescription": {"text": "Commented-code block (5 lines) in pi-cache/src/routes/enc.ts:154"}, "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-583119d8e42ca7fe", "name": "Commented-code block (6 lines) in pi-cache/src/services/inshoreRouter.ts:59", "shortDescription": {"text": "Commented-code block (6 lines) in pi-cache/src/services/inshoreRouter.ts:59"}, "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-614679ebe386c1ed", "name": "Commented-code block (9 lines) in pi-cache/src/services/osm.ts:28", "shortDescription": {"text": "Commented-code block (9 lines) in pi-cache/src/services/osm.ts:28"}, "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-7a21a1f6dd922352", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/services/osm.ts:192", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/services/osm.ts:192"}, "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-03544293e0bf73c1", "name": "Commented-code block (5 lines) in pages/LogPage.tsx:60", "shortDescription": {"text": "Commented-code block (5 lines) in pages/LogPage.tsx:60"}, "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-e544972066db3751", "name": "Commented-code block (5 lines) in pages/log/StatsSheet.tsx:29", "shortDescription": {"text": "Commented-code block (5 lines) in pages/log/StatsSheet.tsx:29"}, "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-c37e0a1d4db04e08", "name": "Commented-code block (5 lines) in bosun-pi/bosun_n2k_api.py:41", "shortDescription": {"text": "Commented-code block (5 lines) in bosun-pi/bosun_n2k_api.py:41"}, "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-d0e362cfaeff3e12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:105"}, "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-01617124252bbca6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:50"}, "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-1ce85d4d58233061", "name": "Commented-code block (10 lines) in hooks/useLogPageState.ts:288", "shortDescription": {"text": "Commented-code block (10 lines) in hooks/useLogPageState.ts:288"}, "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-b4300bb50778cc9f", "name": "Commented-code block (7 lines) in hooks/useAppController.ts:17", "shortDescription": {"text": "Commented-code block (7 lines) in hooks/useAppController.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be97dca93a8502c6", "name": "Commented-code block (7 lines) in hooks/useLiveLocationName.ts:33", "shortDescription": {"text": "Commented-code block (7 lines) in hooks/useLiveLocationName.ts:33"}, "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-2d9e9ec3dab37ccf", "name": "Commented-code block (6 lines) in hooks/useVoyageForm.ts:37", "shortDescription": {"text": "Commented-code block (6 lines) in hooks/useVoyageForm.ts:37"}, "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-e4861a61160506bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useVoyageForm.ts:873", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useVoyageForm.ts:873"}, "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-6a0bcb6cb7f8f49f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/chat/useChatProposals.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/chat/useChatProposals.ts:74"}, "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-5674ba04293c188b", "name": "Commented-code block (7 lines) in hooks/chat/useChatMessages.ts:103", "shortDescription": {"text": "Commented-code block (7 lines) in hooks/chat/useChatMessages.ts:103"}, "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-2cec4f6c9e88d4c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/elevenlabs-tts/index.ts:239", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/elevenlabs-tts/index.ts:239"}, "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-97857faa249862c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.ts:89"}, "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-387d0472b1e0f2f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51c0bf1e478f0a0f", "name": "Commented-code block (7 lines) in supabase/functions/create-marketplace-payment/index.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/create-marketplace-payment/index.ts:4"}, "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-38ef753c565496a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-ukho-msi/index.ts:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-ukho-msi/index.ts: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-ce385464cd9b2006", "name": "Commented-code block (5 lines) in supabase/functions/fetch-precip-grid/index.ts:172", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/fetch-precip-grid/index.ts:172"}, "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-9b12daf406d7b9b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-openmeteo/index.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-openmeteo/index.ts:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f7c1fee3a72b9a5f", "name": "Commented-code block (5 lines) in supabase/functions/anthropic-proxy/index.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/anthropic-proxy/index.ts:57"}, "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-f2a1e505cae0a3f8", "name": "Commented-code block (9 lines) in supabase/functions/deepgram-token/index.ts:114", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/deepgram-token/index.ts:114"}, "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-c2cd025f71dff7b0", "name": "Commented-code block (5 lines) in supabase/functions/deepgram-ws-proxy/index.ts:97", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/deepgram-ws-proxy/index.ts:97"}, "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-72961da13e68e8ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-gemini/index.ts:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-gemini/index.ts:85"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8329c87f86ed78ab", "name": "Commented-code block (5 lines) in supabase/functions/fetch-wind-velocity/index.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/fetch-wind-velocity/index.ts:92"}, "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-74cf027c73a6e655", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fetch-wind-velocity/index.ts:416", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fetch-wind-velocity/index.ts:416"}, "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-983dbfb29b148ef0", "name": "Commented-code block (5 lines) in supabase/functions/proxy-amsa-msi/index.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/proxy-amsa-msi/index.ts:8"}, "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-3c78e923f0fcfad5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-amsa-msi/index.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-amsa-msi/index.ts:155"}, "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-b747caceb0774bc1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-tides/index.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-tides/index.ts:88"}, "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-67f8f9f243b7a3f5", "name": "Commented-code block (5 lines) in supabase/functions/voyage-log/index.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/voyage-log/index.ts:46"}, "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-c114915befbc2fcb", "name": "Commented-code block (8 lines) in supabase/functions/proxy-linz-msi/index.ts:7", "shortDescription": {"text": "Commented-code block (8 lines) in supabase/functions/proxy-linz-msi/index.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fa55cff5290968f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-linz-msi/index.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-linz-msi/index.ts:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8f9c29f8e2a0225", "name": "Legacy-named symbol `scribe_v1` in supabase/functions/proxy-bosun-fallback/index.ts:550", "shortDescription": {"text": "Legacy-named symbol `scribe_v1` in supabase/functions/proxy-bosun-fallback/index.ts:550"}, "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-9337e0d9ec9d2bfc", "name": "Commented-code block (6 lines) in supabase/functions/proxy-bosun-fallback/index.ts:174", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/proxy-bosun-fallback/index.ts:174"}, "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-1a21a246de09bef2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-bosun-fallback/index.ts:194", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-bosun-fallback/index.ts:194"}, "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-d3f44e3772e539fd", "name": "Commented-code block (6 lines) in supabase/functions/route-weather/index.ts:2043", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/route-weather/index.ts:2043"}, "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-7a733c39cb2e52a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-weather/index.ts:1303", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-weather/index.ts:1303"}, "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-a511c60ef0fae5c1", "name": "Commented-code block (5 lines) in supabase/functions/proxy-rainbow/index.ts:220", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/proxy-rainbow/index.ts:220"}, "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-95ea7fc8e74579a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-rainbow/index.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-rainbow/index.ts:84"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-438ba3d2055a1a36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push/index.ts:202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push/index.ts:202"}, "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-02f194eaf6f34633", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-stormglass/index.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-stormglass/index.ts:76"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88d7e9bb35ab9007", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-weather-alerts/index.ts:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-weather-alerts/index.ts:149"}, "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-49e0857cad52c93d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/get-weather/index.ts:247", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/get-weather/index.ts:247"}, "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-1525ddc3847c0bac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/satellite-tile/index.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/satellite-tile/index.ts:88"}, "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-9b7deb75eb015897", "name": "Commented-code block (6 lines) in supabase/functions/route-bathymetric/index.ts:89", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/route-bathymetric/index.ts:89"}, "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-9ec9316c1f511af6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-bathymetric/index.ts:210", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-bathymetric/index.ts:210"}, "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-dc2c6ed2aa1a5b3f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-overpass/index.ts:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-overpass/index.ts:133"}, "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-18c2d537171d56a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/ChartLockerService.ts:1149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ChartLockerService.ts:1149"}, "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-9f34977d83c24921", "name": "Legacy-named symbol `thalassa_ntm_cache_v1` in services/NoticeToMarinersService.ts:279", "shortDescription": {"text": "Legacy-named symbol `thalassa_ntm_cache_v1` in services/NoticeToMarinersService.ts:279"}, "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-a32b579fb5b33d07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/NoticeToMarinersService.ts:318", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/NoticeToMarinersService.ts:318"}, "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-0f47a6b7575b4289", "name": "Commented-code block (9 lines) in services/WeatherOrchestrator.ts:42", "shortDescription": {"text": "Commented-code block (9 lines) in services/WeatherOrchestrator.ts:42"}, "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-f47a95b5cb8efd86", "name": "Commented-code block (5 lines) in services/GalleyRecipeService.ts:2072", "shortDescription": {"text": "Commented-code block (5 lines) in services/GalleyRecipeService.ts:2072"}, "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-60429d513bff2a90", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/GalleyRecipeService.ts:487", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/GalleyRecipeService.ts:487"}, "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-49e044d2c2950c10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/SatLinkClient.ts:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/SatLinkClient.ts:157"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff5b2cbbc03532e4", "name": "Commented-code block (6 lines) in services/marinaCenterline.ts:424", "shortDescription": {"text": "Commented-code block (6 lines) in services/marinaCenterline.ts:424"}, "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-fdbdbf17815b6c3e", "name": "Commented-code block (7 lines) in services/n2kStatus.ts:29", "shortDescription": {"text": "Commented-code block (7 lines) in services/n2kStatus.ts:29"}, "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-d918fc50f374964f", "name": "Commented-code block (7 lines) in services/TripPdfService.ts:565", "shortDescription": {"text": "Commented-code block (7 lines) in services/TripPdfService.ts:565"}, "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-98b483d31f0e79e9", "name": "Commented-code block (5 lines) in services/NmeaListenerService.ts:350", "shortDescription": {"text": "Commented-code block (5 lines) in services/NmeaListenerService.ts:350"}, "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-3c3e4a47b72e5ad4", "name": "Commented-code block (5 lines) in services/ShipLogService.ts:83", "shortDescription": {"text": "Commented-code block (5 lines) in services/ShipLogService.ts:83"}, "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-f91abaeb5363ea2e", "name": "Commented-code block (7 lines) in services/AustralianPortsService.ts:77", "shortDescription": {"text": "Commented-code block (7 lines) in services/AustralianPortsService.ts:77"}, "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-b4b2ad1f9992c1ab", "name": "Legacy-named symbol `thalassa_diary_entries_v2` in services/DiaryService.ts:76", "shortDescription": {"text": "Legacy-named symbol `thalassa_diary_entries_v2` in services/DiaryService.ts:76"}, "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-0070140546c86ae5", "name": "Commented-code block (6 lines) in services/DiaryService.ts:210", "shortDescription": {"text": "Commented-code block (6 lines) in services/DiaryService.ts:210"}, "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-4ffe5f946bb982df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/DiaryService.ts:1025", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/DiaryService.ts:1025"}, "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-6ad9629b3c093b49", "name": "Commented-code block (6 lines) in services/PiCacheService.ts:114", "shortDescription": {"text": "Commented-code block (6 lines) in services/PiCacheService.ts:114"}, "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-966b7300065cee74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/PiCacheService.ts:906", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/PiCacheService.ts:906"}, "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-81c9efa0c3351bbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConsensusMatrixEngine.ts:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConsensusMatrixEngine.ts:115"}, "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-8bee9fdee5e6d03f", "name": "Commented-code block (5 lines) in services/leadingLine.ts:238", "shortDescription": {"text": "Commented-code block (5 lines) in services/leadingLine.ts:238"}, "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-da0fca35de6683b0", "name": "Commented-code block (6 lines) in services/BoatNetworkService.ts:69", "shortDescription": {"text": "Commented-code block (6 lines) in services/BoatNetworkService.ts:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe6054295a7a7aa5", "name": "Legacy-named symbol `thalassa_smart_polars_v1` in services/SmartPolarStore.ts:9", "shortDescription": {"text": "Legacy-named symbol `thalassa_smart_polars_v1` in services/SmartPolarStore.ts:9"}, "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-b3a43825ab04b16e", "name": "Commented-code block (7 lines) in services/SubscriptionService.ts:123", "shortDescription": {"text": "Commented-code block (7 lines) in services/SubscriptionService.ts:123"}, "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-bb722506d6fcabd9", "name": "Commented-code block (5 lines) in services/TripOverviewService.ts:426", "shortDescription": {"text": "Commented-code block (5 lines) in services/TripOverviewService.ts:426"}, "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-134e4df80a7436b5", "name": "Commented-code block (7 lines) in services/GpsService.ts:131", "shortDescription": {"text": "Commented-code block (7 lines) in services/GpsService.ts:131"}, "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-dc7229d0938b3095", "name": "Commented-code block (5 lines) in services/isochroneEnhancer.ts:152", "shortDescription": {"text": "Commented-code block (5 lines) in services/isochroneEnhancer.ts:152"}, "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-76d30624aff525b4", "name": "Legacy-named symbol `seamark_cache_v2` in services/SeamarkService.ts:57", "shortDescription": {"text": "Legacy-named symbol `seamark_cache_v2` in services/SeamarkService.ts:57"}, "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-ddf574f79a1f033e", "name": "Legacy-named symbol `thalassa_mob_active_v1` in services/MobService.ts:19", "shortDescription": {"text": "Legacy-named symbol `thalassa_mob_active_v1` in services/MobService.ts:19"}, "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-3e552e354ccabf51", "name": "Commented-code block (5 lines) in services/AlertNotifier.ts:112", "shortDescription": {"text": "Commented-code block (5 lines) in services/AlertNotifier.ts:112"}, "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-4421bc36a8788456", "name": "Commented-code block (5 lines) in services/AnchorWatchSyncService.ts:117", "shortDescription": {"text": "Commented-code block (5 lines) in services/AnchorWatchSyncService.ts:117"}, "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-0d21822e723fd379", "name": "Commented-code block (5 lines) in services/supabase.ts:166", "shortDescription": {"text": "Commented-code block (5 lines) in services/supabase.ts:166"}, "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-2d2b56eacaef27c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConnectionPriorityService.ts:141", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConnectionPriorityService.ts:141"}, "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-2a22de3ab1e52b99", "name": "Commented-code block (8 lines) in services/AnchorWatchService.ts:33", "shortDescription": {"text": "Commented-code block (8 lines) in services/AnchorWatchService.ts:33"}, "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-2b594930d65d563a", "name": "Commented-code block (12 lines) in services/IsochroneRouter.ts:285", "shortDescription": {"text": "Commented-code block (12 lines) in services/IsochroneRouter.ts:285"}, "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-92c745f38a066924", "name": "Commented-code block (6 lines) in services/ReadinessCheckService.ts:283", "shortDescription": {"text": "Commented-code block (6 lines) in services/ReadinessCheckService.ts:283"}, "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-39a854fac09ec52f", "name": "Commented-code block (10 lines) in services/BgGeoManager.ts:281", "shortDescription": {"text": "Commented-code block (10 lines) in services/BgGeoManager.ts:281"}, "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-d5f49f694f21a3e7", "name": "Legacy-named symbol `thalassa_voyage_cache_v2` in services/nativeStorage.ts:8", "shortDescription": {"text": "Legacy-named symbol `thalassa_voyage_cache_v2` in services/nativeStorage.ts:8"}, "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-6dbc7db61bb4a9c7", "name": "Commented-code block (5 lines) in services/nativeStorage.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in services/nativeStorage.ts:54"}, "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-80a07d8e4956f918", "name": "Commented-code block (6 lines) in services/TideHeightService.ts:219", "shortDescription": {"text": "Commented-code block (6 lines) in services/TideHeightService.ts:219"}, "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-0df5ccc2b3fec5dc", "name": "Commented-code block (7 lines) in services/OceanCurrentService.ts:105", "shortDescription": {"text": "Commented-code block (7 lines) in services/OceanCurrentService.ts:105"}, "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-ed84c4cd3be2b4cc", "name": "Commented-code block (5 lines) in services/EncImportService.ts:238", "shortDescription": {"text": "Commented-code block (5 lines) in services/EncImportService.ts:238"}, "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-4f2fee618f1ab2a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/MBTilesService.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/MBTilesService.ts: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-f2ba5951a4d861ef", "name": "Commented-code block (7 lines) in services/AvNavService.ts:71", "shortDescription": {"text": "Commented-code block (7 lines) in services/AvNavService.ts:71"}, "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-8d0740a83b3b9529", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/AvNavService.ts:1378", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/AvNavService.ts:1378"}, "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-40a2ce69c0fd3de5", "name": "Commented-code block (5 lines) in services/MapboxDirectionsService.ts:113", "shortDescription": {"text": "Commented-code block (5 lines) in services/MapboxDirectionsService.ts:113"}, "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-3a5f0241e9ebeaec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/MapboxDirectionsService.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/MapboxDirectionsService.ts: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-6f07fbe17a53cbed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/AisStreamService.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/AisStreamService.ts:76"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71f8da7260a27c40", "name": "Commented-code block (5 lines) in services/OsmRouteOverlayService.ts:120", "shortDescription": {"text": "Commented-code block (5 lines) in services/OsmRouteOverlayService.ts:120"}, "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-ecad538108e05d7d", "name": "Commented-code block (7 lines) in services/InshoreRouter.ts:83", "shortDescription": {"text": "Commented-code block (7 lines) in services/InshoreRouter.ts:83"}, "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-230503824c858eda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/InshoreRouter.ts:1970", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/InshoreRouter.ts:1970"}, "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-97c8903427808433", "name": "Commented-code block (5 lines) in services/WeatherWindowService.ts:105", "shortDescription": {"text": "Commented-code block (5 lines) in services/WeatherWindowService.ts:105"}, "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-4146f8c3785e0267", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/WeatherWindowService.ts:250", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/WeatherWindowService.ts:250"}, "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-6db5d0b3bf26c5aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/geminiService.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/geminiService.ts:57"}, "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-8d1ffdbd23d1b35e", "name": "Commented-code block (6 lines) in services/inshoreRouterEngine.ts:74", "shortDescription": {"text": "Commented-code block (6 lines) in services/inshoreRouterEngine.ts:74"}, "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-252cb9d853d04fb9", "name": "Commented-code block (5 lines) in services/fairlead.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in services/fairlead.ts:182"}, "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-d836168a2c557e75", "name": "Commented-code block (5 lines) in services/AlertMonitorService.ts:289", "shortDescription": {"text": "Commented-code block (5 lines) in services/AlertMonitorService.ts:289"}, "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-26fd7a94e856602e", "name": "Commented-code block (6 lines) in services/voyageCompute.ts:92", "shortDescription": {"text": "Commented-code block (6 lines) in services/voyageCompute.ts:92"}, "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-1b0e7f06df9eb1d2", "name": "Commented-code block (8 lines) in services/VoyageService.ts:169", "shortDescription": {"text": "Commented-code block (8 lines) in services/VoyageService.ts:169"}, "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-c558b2d981a5784d", "name": "Commented-code block (6 lines) in services/weatherRouter.ts:201", "shortDescription": {"text": "Commented-code block (6 lines) in services/weatherRouter.ts:201"}, "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-fc7d05f1ec57c624", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/ww3CacheClient.ts:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ww3CacheClient.ts:136"}, "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-984e7255666eb6af", "name": "Commented-code block (9 lines) in services/enc/EncHazardService.ts:557", "shortDescription": {"text": "Commented-code block (9 lines) in services/enc/EncHazardService.ts:557"}, "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-a5dea488166579cc", "name": "Commented-code block (5 lines) in services/nmea2000/pgnDecoder.ts:118", "shortDescription": {"text": "Commented-code block (5 lines) in services/nmea2000/pgnDecoder.ts:118"}, "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-8484b281783ccf72", "name": "Commented-code block (8 lines) in services/nmea2000/types.ts:34", "shortDescription": {"text": "Commented-code block (8 lines) in services/nmea2000/types.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fa240bc90a50c66", "name": "Commented-code block (20 lines) in services/seaway/connector.ts:563", "shortDescription": {"text": "Commented-code block (20 lines) in services/seaway/connector.ts:563"}, "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-63f04d69be28403c", "name": "Commented-code block (5 lines) in services/seaway/seawayRouter.ts:292", "shortDescription": {"text": "Commented-code block (5 lines) in services/seaway/seawayRouter.ts:292"}, "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-9d6146ce43726099", "name": "Commented-code block (5 lines) in services/weather/locationType.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/locationType.ts:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f91612f4ad6d34d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/windField.ts:270", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/windField.ts:270"}, "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-170adbf3860d6287", "name": "Legacy-named symbol `Active_Hurricanes_v1` in services/weather/CycloneTrackingService.ts:54", "shortDescription": {"text": "Legacy-named symbol `Active_Hurricanes_v1` in services/weather/CycloneTrackingService.ts:54"}, "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-2f22770545a16981", "name": "Commented-code block (5 lines) in services/weather/CycloneTrackingService.ts:374", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/CycloneTrackingService.ts:374"}, "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-4e08a3e7d6ee997a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/CycloneTrackingService.ts:175", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/CycloneTrackingService.ts:175"}, "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-9c6207f2de559f71", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/pointWeather.ts:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/pointWeather.ts:94"}, "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-93f0f6d593e20ac9", "name": "Commented-code block (6 lines) in services/weather/WindDataController.ts:26", "shortDescription": {"text": "Commented-code block (6 lines) in services/weather/WindDataController.ts:26"}, "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-b04c42831a58f667", "name": "Commented-code block (5 lines) in services/weather/index.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/index.ts:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd98a32a25e962bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/ResumableGribFetcher.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/ResumableGribFetcher.ts:50"}, "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-8429512934bebbba", "name": "Commented-code block (5 lines) in services/weather/isobars.ts:884", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/isobars.ts:884"}, "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-ef75ad9c6852974b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/isobars.ts:269", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/isobars.ts:269"}, "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-e160437141a223cd", "name": "Commented-code block (8 lines) in services/weather/marineProximity.ts:51", "shortDescription": {"text": "Commented-code block (8 lines) in services/weather/marineProximity.ts:51"}, "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-e0460cb96250fcd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/useGribDownload.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/useGribDownload.ts:4"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-929e89833c0e3fa0", "name": "Commented-code block (6 lines) in services/weather/decodeGrib2Wind.ts:204", "shortDescription": {"text": "Commented-code block (6 lines) in services/weather/decodeGrib2Wind.ts:204"}, "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-cfac96f99901ff02", "name": "Commented-code block (6 lines) in services/weather/transformers.ts:105", "shortDescription": {"text": "Commented-code block (6 lines) in services/weather/transformers.ts:105"}, "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-de918049ab5254c2", "name": "Commented-code block (5 lines) in services/weather/api/unified.ts:139", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/api/unified.ts:139"}, "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-54b4e1a92465a205", "name": "Commented-code block (10 lines) in services/weather/api/blitzortungLightning.ts:64", "shortDescription": {"text": "Commented-code block (10 lines) in services/weather/api/blitzortungLightning.ts:64"}, "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-950e38811af2d07b", "name": "Commented-code block (7 lines) in services/weather/api/stormglass.ts:17", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/stormglass.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-baf6b56b0c68c462", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/stormglass.ts:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/stormglass.ts:149"}, "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-1e703692941da7f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/globalWind.ts:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/globalWind.ts:106"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f702b4e0064afd7", "name": "Commented-code block (7 lines) in services/weather/api/currentsGrid.ts:112", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/currentsGrid.ts:112"}, "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-5c954f9930b477a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/currentsGrid.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/currentsGrid.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ccdc2109c4f506d", "name": "Commented-code block (7 lines) in services/weather/api/wavesGrid.ts:112", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/wavesGrid.ts:112"}, "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-e242fea5e97e5ed4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/wavesGrid.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/wavesGrid.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0d11752ac6e0e5a", "name": "Commented-code block (8 lines) in services/weather/api/geocoding.ts:28", "shortDescription": {"text": "Commented-code block (8 lines) in services/weather/api/geocoding.ts:28"}, "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-8797be8ee001d32a", "name": "Commented-code block (11 lines) in services/weather/api/openmeteo.ts:144", "shortDescription": {"text": "Commented-code block (11 lines) in services/weather/api/openmeteo.ts:144"}, "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-a2891b1e3e7885dd", "name": "Commented-code block (9 lines) in services/weather/api/base.ts:34", "shortDescription": {"text": "Commented-code block (9 lines) in services/weather/api/base.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c364efff2cfbef1b", "name": "Commented-code block (5 lines) in services/weather/api/rainviewerIndex.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in services/weather/api/rainviewerIndex.ts:63"}, "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-e01e5ca5c0c51f59", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainviewerIndex.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainviewerIndex.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed5cb961445e5ba0", "name": "Commented-code block (7 lines) in services/weather/api/sstGrid.ts:112", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/sstGrid.ts:112"}, "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-4e624a0fbc6e237b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/sstGrid.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/sstGrid.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e9475f56763d4db", "name": "Commented-code block (7 lines) in services/weather/api/rainbowPrecip.ts:148", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/rainbowPrecip.ts:148"}, "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-44270166554505cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainbowPrecip.ts:148", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainbowPrecip.ts:148"}, "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-ef12beab94981008", "name": "Commented-code block (7 lines) in services/weather/api/chlGrid.ts:112", "shortDescription": {"text": "Commented-code block (7 lines) in services/weather/api/chlGrid.ts:112"}, "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-413c4606047e827c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/chlGrid.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/chlGrid.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b1045dab53636b2", "name": "Commented-code block (8 lines) in services/weather/api/weatherkit.ts:342", "shortDescription": {"text": "Commented-code block (8 lines) in services/weather/api/weatherkit.ts:342"}, "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-b66713943c6d5c22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/seaiceGrid.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/seaiceGrid.ts:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c6ea37a24b924a3", "name": "Legacy-named symbol `thalassa_wt_rate_v1` in services/weather/api/worldtides.ts:24", "shortDescription": {"text": "Legacy-named symbol `thalassa_wt_rate_v1` in services/weather/api/worldtides.ts:24"}, "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-a5305c7f80fcf39a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/worldtides.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/worldtides.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-1e88b721bddc1255", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/mldGrid.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/mldGrid.ts:34"}, "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-3c29317789b5b8a2", "name": "Legacy-named symbol `thalassa_chat_channels_v1` in services/chat/constants.ts:16", "shortDescription": {"text": "Legacy-named symbol `thalassa_chat_channels_v1` in services/chat/constants.ts:16"}, "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-267af45e5ea3b45d", "name": "Commented-code block (6 lines) in services/voice/safetyTts.ts:199", "shortDescription": {"text": "Commented-code block (6 lines) in services/voice/safetyTts.ts:199"}, "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-d206f55355d020a8", "name": "Commented-code block (9 lines) in services/voice/speechRecognizer.ts:24", "shortDescription": {"text": "Commented-code block (9 lines) in services/voice/speechRecognizer.ts:24"}, "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-5ad9bc05c4b18472", "name": "Commented-code block (6 lines) in services/voice/deepgramRecognizer.ts:326", "shortDescription": {"text": "Commented-code block (6 lines) in services/voice/deepgramRecognizer.ts:326"}, "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-fa5c90f9efc51936", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudTools.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudTools.ts:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1095cc204266575d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/bosunVoice.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/bosunVoice.ts:14"}, "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-2e2736940e19ac82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudFallback.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudFallback.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdb6f66f0afb4e27", "name": "Commented-code block (7 lines) in services/voice/orchestrator.ts:1047", "shortDescription": {"text": "Commented-code block (7 lines) in services/voice/orchestrator.ts:1047"}, "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-461975c0e434dd14", "name": "Commented-code block (5 lines) in services/voice/piTools.ts:174", "shortDescription": {"text": "Commented-code block (5 lines) in services/voice/piTools.ts:174"}, "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-ce3e741534e94eb0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/integrations/gmail.ts:324", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/integrations/gmail.ts:324"}, "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-f5843ce3625b9e09", "name": "Commented-code block (6 lines) in services/voice/integrations/spokenAudio.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in services/voice/integrations/spokenAudio.ts:46"}, "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-2d02a5da76f563d1", "name": "Commented-code block (5 lines) in services/voice/integrations/appleMusic.ts:173", "shortDescription": {"text": "Commented-code block (5 lines) in services/voice/integrations/appleMusic.ts:173"}, "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-314bc3db77b24358", "name": "Commented-code block (5 lines) in services/isochrone/output.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in services/isochrone/output.ts:45"}, "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-9ffabc6c1e4558aa", "name": "Commented-code block (7 lines) in services/isochrone/landAvoidance.ts:731", "shortDescription": {"text": "Commented-code block (7 lines) in services/isochrone/landAvoidance.ts:731"}, "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-c03018e5581a9454", "name": "Commented-code block (8 lines) in services/shiplog/EntrySave.ts:46", "shortDescription": {"text": "Commented-code block (8 lines) in services/shiplog/EntrySave.ts:46"}, "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-8411f1c41899c4eb", "name": "Commented-code block (6 lines) in services/shiplog/PassagePlanSave.ts:55", "shortDescription": {"text": "Commented-code block (6 lines) in services/shiplog/PassagePlanSave.ts:55"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-840539ef477dc576", "name": "Legacy-named symbol `thalassa_voyage_track_cache_v1` in services/shiplog/VoyageTrackCache.ts:28", "shortDescription": {"text": "Legacy-named symbol `thalassa_voyage_track_cache_v1` in services/shiplog/VoyageTrackCache.ts:28"}, "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-dfb80e0d22da9fd6", "name": "Commented-code block (5 lines) in services/shiplog/RoutesAndTracks.ts:191", "shortDescription": {"text": "Commented-code block (5 lines) in services/shiplog/RoutesAndTracks.ts:191"}, "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-a57ac430b1909163", "name": "Commented-code block (8 lines) in services/shiplog/GpsSubscriptionManager.ts:43", "shortDescription": {"text": "Commented-code block (8 lines) in services/shiplog/GpsSubscriptionManager.ts:43"}, "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-4370e02d4b32f96f", "name": "Commented-code block (5 lines) in services/shiplog/CourseChangeDetector.ts:231", "shortDescription": {"text": "Commented-code block (5 lines) in services/shiplog/CourseChangeDetector.ts:231"}, "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-80ef269a636fde4c", "name": "Commented-code block (8 lines) in services/shiplog/EntryCrud.ts:314", "shortDescription": {"text": "Commented-code block (8 lines) in services/shiplog/EntryCrud.ts:314"}, "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-448a4e88a9fe4b0b", "name": "Commented-code block (6 lines) in services/shiplog/CapturePipeline.ts:66", "shortDescription": {"text": "Commented-code block (6 lines) in services/shiplog/CapturePipeline.ts:66"}, "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-2cb043912d877e22", "name": "Commented-code block (8 lines) in services/shiplog/OfflineQueue.ts:21", "shortDescription": {"text": "Commented-code block (8 lines) in services/shiplog/OfflineQueue.ts:21"}, "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-2075490db3234d41", "name": "`fetch()` without try/.catch or AbortSignal \u2014 services/native/weatherKit.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/native/weatherKit.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-993d3d42be7098b4", "name": "Commented-code block (5 lines) in tools/senc-extractor/src/featureParser.ts:140", "shortDescription": {"text": "Commented-code block (5 lines) in tools/senc-extractor/src/featureParser.ts:140"}, "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-16218c45ef242621", "name": "Commented-code block (8 lines) in tools/senc-extractor/src/s57Classes.ts:102", "shortDescription": {"text": "Commented-code block (8 lines) in tools/senc-extractor/src/s57Classes.ts:102"}, "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-959affe95a27be86", "name": "Commented-code block (5 lines) in context/WeatherContext.tsx:67", "shortDescription": {"text": "Commented-code block (5 lines) in context/WeatherContext.tsx:67"}, "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-486bab95dbbd175b", "name": "Commented-code block (12 lines) in public/sw.js:1", "shortDescription": {"text": "Commented-code block (12 lines) in public/sw.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c692dbf3270b360", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:115"}, "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-c25049b194b3823e", "name": "Commented-code block (5 lines) in backend/generate_global_cog.py:191", "shortDescription": {"text": "Commented-code block (5 lines) in backend/generate_global_cog.py:191"}, "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-ac6ce0e6d1dca97a", "name": "61 env vars used in code but missing from .env.example", "shortDescription": {"text": "61 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AISSTREAM_KEY`, `AMSA_API_URL`, `API_KEY`, `BATCH_FLUSH_MS`, `BATCH_MAX_SIZE`, `BOSUN_USER_ID`, `BOUNDING_BOXES`, `CHART_DIR` + 53 more. 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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/build_nav_graph.py:way, scripts/build_nav_graph.py:way, scripts/build_nav_graph.py:way\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/build_nav_graph.py:node, scripts/build_nav_graph.py:node\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/cmems-sst-pipeline/pipeline.py:require_env, scripts/cmems-chl-pipeline/pipeline.py:require_env, scripts/mpa-pipeline/pipeline.py:require_env, scripts/cmems-seaice-pipeline/pipeline.py:require_env\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68c565cc85ef85aa", "name": "Dangling fetch: GET https://api.stormglass.io/... (utils/rateLimiter.ts:13)", "shortDescription": {"text": "Dangling fetch: GET https://api.stormglass.io/... (utils/rateLimiter.ts:13)"}, "fullDescription": {"text": "`utils/rateLimiter.ts:13` calls `GET https://api.stormglass.io/...` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stormglass.io/...`\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-1c35a56fe718b4b5", "name": "Dangling fetch: GET /wind_test.json (components/map/MapboxVelocityOverlay.tsx:430)", "shortDescription": {"text": "Dangling fetch: GET /wind_test.json (components/map/MapboxVelocityOverlay.tsx:430)"}, "fullDescription": {"text": "`components/map/MapboxVelocityOverlay.tsx:430` calls `GET /wind_test.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wind_test.json`\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-1ff39d57143c688e", "name": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${loc.lat}&lon=${loc.lon}&format=json&zoom=10&addres", "shortDescription": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${loc.lat}&lon=${loc.lon}&format=json&zoom=10&addressdetails=1 (hooks/useCrewFinderActions.ts:276)"}, "fullDescription": {"text": "`hooks/useCrewFinderActions.ts:276` calls `GET https://nominatim.openstreetmap.org/reverse?lat=${loc.lat}&lon=${loc.lon}&format=json&zoom=10&addressdetails=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/nominatim.openstreetmap.org/reverse`\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-ee073e440f4c7797", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/elevenlabs-tts/index.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/elevenlabs-tts/index.ts:239)"}, "fullDescription": {"text": "`supabase/functions/elevenlabs-tts/index.ts:239` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/text-to-speech/<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-9ef1aad41e3237bd", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (supabase/functions/proxy-bosun-fallback/index.ts:194)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (supabase/functions/proxy-bosun-fallback/index.ts:194)"}, "fullDescription": {"text": "`supabase/functions/proxy-bosun-fallback/index.ts:194` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-3fb4c7b94f1ce945", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/proxy-bosun-fallback/ind", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/proxy-bosun-fallback/index.ts:494)"}, "fullDescription": {"text": "`supabase/functions/proxy-bosun-fallback/index.ts:494` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/text-to-speech/<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-536a9d35e376a5e1", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/speech-to-text (supabase/functions/proxy-bosun-fallback/index.ts:562)", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/speech-to-text (supabase/functions/proxy-bosun-fallback/index.ts:562)"}, "fullDescription": {"text": "`supabase/functions/proxy-bosun-fallback/index.ts:562` calls `POST https://api.elevenlabs.io/v1/speech-to-text` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/speech-to-text`\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-79672e1a31a101d9", "name": "Dangling fetch: POST https://overpass-api.de/api/interpreter (supabase/functions/route-weather/index.ts:222)", "shortDescription": {"text": "Dangling fetch: POST https://overpass-api.de/api/interpreter (supabase/functions/route-weather/index.ts:222)"}, "fullDescription": {"text": "`supabase/functions/route-weather/index.ts:222` calls `POST https://overpass-api.de/api/interpreter` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/overpass-api.de/api/interpreter`\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-0dff60f546ac21c0", "name": "Dangling fetch: POST https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json&zoom=14&addressdetail", "shortDescription": {"text": "Dangling fetch: POST https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json&zoom=14&addressdetails=1 (services/DiaryService.ts:982)"}, "fullDescription": {"text": "`services/DiaryService.ts:982` calls `POST https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json&zoom=14&addressdetails=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/nominatim.openstreetmap.org/reverse`\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-6e20917a89fad9ea", "name": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/forecast?${params} (services/weather/pointWeather.ts:94)", "shortDescription": {"text": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/forecast?${params} (services/weather/pointWeather.ts:94)"}, "fullDescription": {"text": "`services/weather/pointWeather.ts:94` calls `GET https://customer-api.open-meteo.com/v1/forecast?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/customer-api.open-meteo.com/v1/forecast`\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-a7d134c8bc09aaf5", "name": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/marine?${params} (services/weather/pointWeather.ts:131)", "shortDescription": {"text": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/marine?${params} (services/weather/pointWeather.ts:131)"}, "fullDescription": {"text": "`services/weather/pointWeather.ts:131` calls `GET https://customer-api.open-meteo.com/v1/marine?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/customer-api.open-meteo.com/v1/marine`\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-535bec6eabffe8df", "name": "Dangling fetch: GET /pcm-worklet.js (services/voice/deepgramRecognizer.ts:543)", "shortDescription": {"text": "Dangling fetch: GET /pcm-worklet.js (services/voice/deepgramRecognizer.ts:543)"}, "fullDescription": {"text": "`services/voice/deepgramRecognizer.ts:543` calls `GET /pcm-worklet.js` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pcm-worklet.js`\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-99b1c39ba76dd804", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:165)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:165)"}, "fullDescription": {"text": "`services/voice/integrations/gmail.ts:165` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-44bc4fa42f250a99", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:296)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:296)"}, "fullDescription": {"text": "`services/voice/integrations/gmail.ts:296` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-df58271d6841c045", "name": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (services/voice/integrations/gmail.ts:324)", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (services/voice/integrations/gmail.ts:324)"}, "fullDescription": {"text": "`services/voice/integrations/gmail.ts:324` calls `GET https://www.googleapis.com/oauth2/v2/userinfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/oauth2/v2/userinfo`\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-10bb185c90b821a1", "name": "Dangling fetch: GET https://gmail.googleapis.com/gmail/v1${path} (services/voice/integrations/gmail.ts:413)", "shortDescription": {"text": "Dangling fetch: GET https://gmail.googleapis.com/gmail/v1${path} (services/voice/integrations/gmail.ts:413)"}, "fullDescription": {"text": "`services/voice/integrations/gmail.ts:413` calls `GET https://gmail.googleapis.com/gmail/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/gmail.googleapis.com/gmail/v1/<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-3103c47763e94c88", "name": "Unused endpoint: ANY /scan", "shortDescription": {"text": "Unused endpoint: ANY /scan"}, "fullDescription": {"text": "`bosun-pi/bosun_network_api.py` declares `ANY /scan` 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-93e0499a4cccdb84", "name": "Unused endpoint: ANY /configure", "shortDescription": {"text": "Unused endpoint: ANY /configure"}, "fullDescription": {"text": "`bosun-pi/bosun_network_api.py` declares `ANY /configure` 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-6f2b812a7d0822f4", "name": "Unused endpoint: USE /__chart-proxy", "shortDescription": {"text": "Unused endpoint: USE /__chart-proxy"}, "fullDescription": {"text": "`vite.config.ts` declares `USE /__chart-proxy` 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-bf57b523f8e38c84", "name": "Unused endpoint: POST /api/configure", "shortDescription": {"text": "Unused endpoint: POST /api/configure"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `POST /api/configure` 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-2693d6713b74063d", "name": "Unused endpoint: POST /cache/purge", "shortDescription": {"text": "Unused endpoint: POST /cache/purge"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `POST /cache/purge` 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-eae4f6f211cad08b", "name": "Unused endpoint: GET /api/passthrough", "shortDescription": {"text": "Unused endpoint: GET /api/passthrough"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `GET /api/passthrough` 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-e348df69b8d24c1b", "name": "Unused endpoint: GET /api/passthrough-tile", "shortDescription": {"text": "Unused endpoint: GET /api/passthrough-tile"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `GET /api/passthrough-tile` 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-83e27b789830003c", "name": "Unused endpoint: USE /api/weather", "shortDescription": {"text": "Unused endpoint: USE /api/weather"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/weather` 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-5e74f241469bb428", "name": "Unused endpoint: USE /api/tiles", "shortDescription": {"text": "Unused endpoint: USE /api/tiles"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/tiles` 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-197725f7373dd55e", "name": "Unused endpoint: USE /api/grib", "shortDescription": {"text": "Unused endpoint: USE /api/grib"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/grib` 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-ae03a0feb97f40ed", "name": "Unused endpoint: USE /api/tides", "shortDescription": {"text": "Unused endpoint: USE /api/tides"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/tides` 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-c05932b2e4ecf935", "name": "Unused endpoint: USE /api/misc", "shortDescription": {"text": "Unused endpoint: USE /api/misc"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/misc` 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-36deb4d183565705", "name": "Unused endpoint: USE /api/charts", "shortDescription": {"text": "Unused endpoint: USE /api/charts"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/charts` 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-5b869c94ab9c2f15", "name": "Unused endpoint: USE /api/enc", "shortDescription": {"text": "Unused endpoint: USE /api/enc"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/enc` 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-db374bee080704ff", "name": "Unused endpoint: USE /api/osm", "shortDescription": {"text": "Unused endpoint: USE /api/osm"}, "fullDescription": {"text": "`pi-cache/src/server.ts` declares `USE /api/osm` 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-5654b898499633a4", "name": "Unused endpoint: POST /download", "shortDescription": {"text": "Unused endpoint: POST /download"}, "fullDescription": {"text": "`pi-cache/src/routes/charts.ts` declares `POST /download` 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-09ee72aea5a0a2b7", "name": "Unused endpoint: GET /jobs/:id", "shortDescription": {"text": "Unused endpoint: GET /jobs/:id"}, "fullDescription": {"text": "`pi-cache/src/routes/charts.ts` declares `GET /jobs/: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-1008c575819b3d37", "name": "Unused endpoint: GET /jobs", "shortDescription": {"text": "Unused endpoint: GET /jobs"}, "fullDescription": {"text": "`pi-cache/src/routes/charts.ts` declares `GET /jobs` 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-ab4c2b12dfecc620", "name": "Unused endpoint: GET /local", "shortDescription": {"text": "Unused endpoint: GET /local"}, "fullDescription": {"text": "`pi-cache/src/routes/charts.ts` declares `GET /local` 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-25b23a43c01624e1", "name": "Unused endpoint: DELETE /local/:name", "shortDescription": {"text": "Unused endpoint: DELETE /local/:name"}, "fullDescription": {"text": "`pi-cache/src/routes/charts.ts` declares `DELETE /local/:name` 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-959e83c0a87139d8", "name": "Unused endpoint: GET /current", "shortDescription": {"text": "Unused endpoint: GET /current"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /current` 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-441c9cf1a68ef8e7", "name": "Unused endpoint: GET /forecast", "shortDescription": {"text": "Unused endpoint: GET /forecast"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /forecast` 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-3e425a5b4242593d", "name": "Unused endpoint: GET /marine", "shortDescription": {"text": "Unused endpoint: GET /marine"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /marine` 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-40f67c739707368b", "name": "Unused endpoint: GET /combined", "shortDescription": {"text": "Unused endpoint: GET /combined"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /combined` 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-e6d536ad0938cb18", "name": "Unused endpoint: GET /unified", "shortDescription": {"text": "Unused endpoint: GET /unified"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /unified` 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-2eee892bc5d610ce", "name": "Unused endpoint: GET /stormglass", "shortDescription": {"text": "Unused endpoint: GET /stormglass"}, "fullDescription": {"text": "`pi-cache/src/routes/weather.ts` declares `GET /stormglass` 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-285702a1808bf98b", "name": "Unused endpoint: GET /gibs/:layer/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /gibs/:layer/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /gibs/:layer/:z/:x/:y` 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-a20fe3ef12a61333", "name": "Unused endpoint: GET /realearth/:product/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /realearth/:product/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /realearth/:product/:z/:x/:y` 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-7e48d7c02bde16b0", "name": "Unused endpoint: GET /nowcoast/:layer/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /nowcoast/:layer/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /nowcoast/:layer/:z/:x/:y` 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-c3d6f2b95539b695", "name": "Unused endpoint: GET /openseamap/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /openseamap/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /openseamap/:z/:x/:y` 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-2ce2c16ba2fee3cd", "name": "Unused endpoint: GET /gebco/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /gebco/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /gebco/:z/:x/:y` 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-e3ab1b3ccec519bd", "name": "Unused endpoint: GET /rainviewer/:z/:x/:y", "shortDescription": {"text": "Unused endpoint: GET /rainviewer/:z/:x/:y"}, "fullDescription": {"text": "`pi-cache/src/routes/tiles.ts` declares `GET /rainviewer/:z/:x/:y` 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-7a41ee867a3007a5", "name": "Unused endpoint: GET /cyclones", "shortDescription": {"text": "Unused endpoint: GET /cyclones"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /cyclones` 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-1d802da5f02a8abc", "name": "Unused endpoint: GET /cyclones/:id", "shortDescription": {"text": "Unused endpoint: GET /cyclones/:id"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /cyclones/: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-bf0e253f0242c164", "name": "Unused endpoint: GET /buoys", "shortDescription": {"text": "Unused endpoint: GET /buoys"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /buoys` 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-e8a3f62be3874314", "name": "Unused endpoint: GET /buoys/:stationId", "shortDescription": {"text": "Unused endpoint: GET /buoys/:stationId"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /buoys/:stationId` 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-3a1d171910619e87", "name": "Unused endpoint: GET /seamarks", "shortDescription": {"text": "Unused endpoint: GET /seamarks"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /seamarks` 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-0ac1eab3f2a34b2e", "name": "Unused endpoint: GET /geocode", "shortDescription": {"text": "Unused endpoint: GET /geocode"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /geocode` 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-8e2307836cad63ff", "name": "Unused endpoint: GET /precipitation", "shortDescription": {"text": "Unused endpoint: GET /precipitation"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /precipitation` 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-60dac49b47f3c8b6", "name": "Unused endpoint: GET /proxy/:functionName", "shortDescription": {"text": "Unused endpoint: GET /proxy/:functionName"}, "fullDescription": {"text": "`pi-cache/src/routes/misc.ts` declares `GET /proxy/:functionName` 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-d79f11aaf559c991", "name": "Unused endpoint: GET /wind", "shortDescription": {"text": "Unused endpoint: GET /wind"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /wind` 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-7ef627628a12e4eb", "name": "Unused endpoint: GET /pressure", "shortDescription": {"text": "Unused endpoint: GET /pressure"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /pressure` 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-9a601ea39c1bc804", "name": "Unused endpoint: GET /waves", "shortDescription": {"text": "Unused endpoint: GET /waves"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /waves` 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-26ea4fbba1638b54", "name": "Unused endpoint: GET /precip", "shortDescription": {"text": "Unused endpoint: GET /precip"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /precip` 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-5209a627265c212f", "name": "Unused endpoint: GET /composite", "shortDescription": {"text": "Unused endpoint: GET /composite"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /composite` 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-413c1dd2f1e61c75", "name": "Unused endpoint: POST /wind-grid", "shortDescription": {"text": "Unused endpoint: POST /wind-grid"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `POST /wind-grid` 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-d4c173947c138f9f", "name": "Unused endpoint: GET /noaa", "shortDescription": {"text": "Unused endpoint: GET /noaa"}, "fullDescription": {"text": "`pi-cache/src/routes/grib.ts` declares `GET /noaa` 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-a30972c54bee6925", "name": "Unused endpoint: GET /overlay", "shortDescription": {"text": "Unused endpoint: GET /overlay"}, "fullDescription": {"text": "`pi-cache/src/routes/osm.ts` declares `GET /overlay` 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-37583ca7e4c862e2", "name": "Unused endpoint: POST /convert", "shortDescription": {"text": "Unused endpoint: POST /convert"}, "fullDescription": {"text": "`pi-cache/src/routes/enc.ts` declares `POST /convert` 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-2b25200cad51d564", "name": "Unused endpoint: GET /result/:id", "shortDescription": {"text": "Unused endpoint: GET /result/:id"}, "fullDescription": {"text": "`pi-cache/src/routes/enc.ts` declares `GET /result/: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}}]}}, "automationDetails": {"id": "repobility/19394"}, "properties": {"repository": "shanestratton/thalassa-marine-weather", "repoUrl": "https://github.com/shanestratton/thalassa-marine-weather", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467174, "scanner": "foundry_dataset", "fingerprint": "faac6f1b748e1930c0e7ff0c5438eec611a304c7107d63474c795717bb3b4d2f", "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": {"bug_fix": 2, "test_or_ci": 7, "test_ci_gap": 2, "api_integration_gap": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 4, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 2, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 8, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 73, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 7, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 8, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 7, "thread_has_comment_chain": 3, "comment_chain_links_commit": 5, "comment_chain_touches_file": 21, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 34, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 3, "pr_file": 7, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#7", "issue_number": "7", "quality_tiers": {"unresolved": 2, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-9082ed0a4101deda", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 42}}, "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: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode types: {'link_quality': 8, 'pr_file': 7, 'commit': 5, 'comment': 3, 'comment_chain': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 21, 'chain_has_link_quality': 8, 'thread_touches_file': 7, 'issue_chain_touches_file': 7, 'comment_chain_links_commit': 5, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'test_or_ci': 7, 'not_resolved_or_not_observed': 4, 'verification_or_tests': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'human_reported_issue_no_linked_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 8, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 3, 'unresolved': 2}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-3dfbe446e8bc2b6f", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467173, "scanner": "foundry_dataset", "fingerprint": "fbdc451c577a4c829315ea184e9512f2c79457cdb429a9a302d3017153ca1cb9", "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": {"bug_fix": 5, "api_or_backend": 2, "ui_or_frontend": 4, "source_or_other": 2, "api_integration_gap": 1, "dependency_or_build": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_no_linked_fix": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"claimed_resolved_unverified": 6, "not_resolved_or_not_observed": 2}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 61, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 9, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 5, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 9, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 18, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 29, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 9, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#6", "issue_number": "6", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-9fb7ddfe6a634891", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 10, "ui_or_frontend": 20, "source_or_other": 10, "dependency_or_build": 5}}, "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: weak_supervision_needs_review\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 6\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 61\nNode types: {'pr_file': 9, 'commit': 5, 'link_quality': 5, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 18, 'thread_touches_file': 9, 'issue_chain_touches_file': 9, 'comment_chain_links_commit': 5, 'chain_has_link_quality': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'bug_fix': 5, 'ui_or_frontend': 4, 'claimed_resolved_unverified': 3, 'source_or_other': 2, 'api_or_backend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'api_integration_gap': 1, 'dependency_or_build': 1, 'human_reported_issue_then_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_unverified': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1, 'assumption_check': 1}\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/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-1967432a0524f016", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467172, "scanner": "foundry_dataset", "fingerprint": "266534d1257573fe4afc9c94434013fbbfd7fbe0b47fdbe329a4eb98732376e4", "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": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 1, "docs_or_claims": 1, "ui_or_frontend": 12, "source_or_other": 4, "api_integration_gap": 1, "dependency_or_build": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 84, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 19, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 24, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 41, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 19, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#5", "issue_number": "5", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-fdf551b5111bf9bd", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 5, "docs_or_claims": 5, "ui_or_frontend": 60, "source_or_other": 20, "dependency_or_build": 5}}, "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: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#5\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 5\nGraph consistency label: supported_by_verification_signal\nNodes: 41\nEdges: 84\nNode types: {'pr_file': 19, 'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 19, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 6, 'comment_chain_links_commit': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 12, 'source_or_other': 4, 'verification_or_tests': 3, 'claimed_resolved_with_verification_signal': 3, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'test_or_ci': 1, 'docs_or_claims': 1, 'dependency_or_build': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\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/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-986e837217d95d3b", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467171, "scanner": "foundry_dataset", "fingerprint": "c47cae73c4d11872fb440c801c459ed42b2a50e66515b09c858771bf71865bd5", "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": {"test_or_ci": 3, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 56, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 28, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#4", "issue_number": "4", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-ef5be9e6abb3a9c7", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#4\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 4\nGraph consistency label: assumption_check\nNodes: 28\nEdges: 56\nNode types: {'link_quality': 9, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 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/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-8e79390b560ae644", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467170, "scanner": "foundry_dataset", "fingerprint": "111f482d4aa7b18de31de372197fe1cbf788e5cb53bf6b24a487e8e0e201a3e1", "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": {"test_or_ci": 4, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 62, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 4, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 4, "thread_has_comment_chain": 4, "comment_chain_touches_file": 16, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 29, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 4, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#3", "issue_number": "3", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-bf50e8a2a408f2d1", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 28}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#3\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 3\nGraph consistency label: assumption_check\nNodes: 29\nEdges: 62\nNode types: {'link_quality': 9, 'comment': 4, 'pr_file': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 16, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_touches_file': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'issue_chain_touches_file': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'test_or_ci': 4, 'human_reported_issue_no_linked_fix': 4, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 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/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-99cc024fe0eb9dd5", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467169, "scanner": "foundry_dataset", "fingerprint": "f6e60fcff978389df7c81c6ba773266a2d8b67cc70a9105d8f580244a183f3e0", "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": {"test_or_ci": 3, "test_ci_gap": 1, "api_integration_gap": 1, "security_auth_secret": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 52, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 8, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 26, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#2", "issue_number": "2", "quality_tiers": {"unresolved": 6, "assumption_check": 2}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-234bab2ccb58ee9b", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#2\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 2\nGraph consistency label: assumption_check\nNodes: 26\nEdges: 52\nNode types: {'link_quality': 8, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 8, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'security_auth_secret': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 2}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-5121c8a780dcf2a3", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 467168, "scanner": "foundry_dataset", "fingerprint": "0947809a60027bd403120adef831208f25ceb5490fc98a8b140f19b3f6a4f030", "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": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 10, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 49, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 1, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 1, "thread_has_comment_chain": 4, "comment_chain_links_commit": 5, "comment_chain_touches_file": 4, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 31, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 4, "pr_file": 1, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#1", "issue_number": "1", "quality_tiers": {"unresolved": 3, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-31f45cd8fc881c8a", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 7}}, "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: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#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: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#1\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 31\nEdges: 49\nNode types: {'link_quality': 9, 'commit': 5, 'comment': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'pr_file': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'chain_has_link_quality': 9, 'comment_chain_links_commit': 5, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'comment_chain_touches_file': 4, 'issue_chain_has_comment_chain': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_touches_file': 1, 'thread_has_issue_chain': 1, 'issue_chain_touches_file': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 5, 'verification_or_tests': 3, 'human_reported_issue_no_linked_fix': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'test_or_ci': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 3, 'assumption_check': 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/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-27c3edee5f53f79a", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449704, "scanner": "foundry_dataset", "fingerprint": "d5921de9d73d9783e24b254c3a3a08d124f31afc953a731d4b9391b0870472cc", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 2, "test_or_ci": 7, "test_ci_gap": 2, "api_integration_gap": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 4, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 2, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 8, "claimed_resolved_with_verification_signal": 2}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 73, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 7, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 8, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 7, "thread_has_comment_chain": 3, "comment_chain_links_commit": 5, "comment_chain_touches_file": 21, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 34, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 3, "pr_file": 7, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#7", "issue_number": "7", "quality_tiers": {"unresolved": 2, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-b2820fd7417725e6", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 42}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode types: {'link_quality': 8, 'pr_file': 7, 'commit': 5, 'comment': 3, 'comment_chain': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 21, 'chain_has_link_quality': 8, 'thread_touches_file': 7, 'issue_chain_touches_file': 7, 'comment_chain_links_commit': 5, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'test_or_ci': 7, 'not_resolved_or_not_observed': 4, 'verification_or_tests': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'human_reported_issue_no_linked_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 8, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 3, 'unresolved': 2}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-649ae6c8e3bf3d8c", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449703, "scanner": "foundry_dataset", "fingerprint": "dd4466d4be1adfb18758ff327965d7bed0a111a1cb5ab634556bedc9512d4e62", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 5, "api_or_backend": 2, "ui_or_frontend": 4, "source_or_other": 2, "api_integration_gap": 1, "dependency_or_build": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_no_linked_fix": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"claimed_resolved_unverified": 6, "not_resolved_or_not_observed": 2}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 61, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 9, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 5, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 9, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 18, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 29, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 9, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#6", "issue_number": "6", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-0d1fe16b0c801bd5", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 10, "ui_or_frontend": 20, "source_or_other": 10, "dependency_or_build": 5}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: weak_supervision_needs_review\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 6\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 61\nNode types: {'pr_file': 9, 'commit': 5, 'link_quality': 5, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 18, 'thread_touches_file': 9, 'issue_chain_touches_file': 9, 'comment_chain_links_commit': 5, 'chain_has_link_quality': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'bug_fix': 5, 'ui_or_frontend': 4, 'claimed_resolved_unverified': 3, 'source_or_other': 2, 'api_or_backend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'api_integration_gap': 1, 'dependency_or_build': 1, 'human_reported_issue_then_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_unverified': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-035b48b8f9c36e43", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449702, "scanner": "foundry_dataset", "fingerprint": "0ffea4d557d098183dc89e5a97a99d4f443a98f572d9f860c7801203ab2b8bef", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 1, "docs_or_claims": 1, "ui_or_frontend": 12, "source_or_other": 4, "api_integration_gap": 1, "dependency_or_build": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 84, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 19, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 24, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 41, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 19, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#5", "issue_number": "5", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-623d63cd84b64f64", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 5, "docs_or_claims": 5, "ui_or_frontend": 60, "source_or_other": 20, "dependency_or_build": 5}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#5\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 5\nGraph consistency label: supported_by_verification_signal\nNodes: 41\nEdges: 84\nNode types: {'pr_file': 19, 'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 19, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 6, 'comment_chain_links_commit': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 12, 'source_or_other': 4, 'verification_or_tests': 3, 'claimed_resolved_with_verification_signal': 3, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'test_or_ci': 1, 'docs_or_claims': 1, 'dependency_or_build': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-d0c1259e1309a10b", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449701, "scanner": "foundry_dataset", "fingerprint": "3362a8963612b68803f8265a5582573095c4a9f75dcc345f21d829e108a16c1b", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"test_or_ci": 3, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 56, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 28, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#4", "issue_number": "4", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-3fc9d922ee70e48a", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#4\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 4\nGraph consistency label: assumption_check\nNodes: 28\nEdges: 56\nNode types: {'link_quality': 9, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-f59f465e0bd282cd", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449700, "scanner": "foundry_dataset", "fingerprint": "26b0395ad5c51ca55a0e9577e9b0ab72c61da9a55e555c06a2614ec268b9345e", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"test_or_ci": 4, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 62, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 4, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 4, "thread_has_comment_chain": 4, "comment_chain_touches_file": 16, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 29, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 4, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#3", "issue_number": "3", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-5e21b92cee7bfbf9", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 28}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#3\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 3\nGraph consistency label: assumption_check\nNodes: 29\nEdges: 62\nNode types: {'link_quality': 9, 'comment': 4, 'pr_file': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 16, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_touches_file': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'issue_chain_touches_file': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'test_or_ci': 4, 'human_reported_issue_no_linked_fix': 4, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-64499f897ad58bf1", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449699, "scanner": "foundry_dataset", "fingerprint": "d4244dd3c6d02ed18edd6ab50e1ab405c942874fc0717df8044c0625cde9b6f0", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"test_or_ci": 3, "test_ci_gap": 1, "api_integration_gap": 1, "security_auth_secret": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 52, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 8, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 26, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#2", "issue_number": "2", "quality_tiers": {"unresolved": 6, "assumption_check": 2}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-0329e5a33736c28e", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#2\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 2\nGraph consistency label: assumption_check\nNodes: 26\nEdges: 52\nNode types: {'link_quality': 8, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 8, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'security_auth_secret': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 2}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-410d75556c624e44", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 449698, "scanner": "foundry_dataset", "fingerprint": "62a098dbb00ed9d4bda5d6ab758583deec1c8c826c64c6bcc36dfb6ff910810e", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 10, "claimed_resolved_with_verification_signal": 2}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 49, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 1, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 1, "thread_has_comment_chain": 4, "comment_chain_links_commit": 5, "comment_chain_touches_file": 4, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 31, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 4, "pr_file": 1, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#1", "issue_number": "1", "quality_tiers": {"unresolved": 3, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-24dfb7fdb48cb16c", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 7}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#1\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 31\nEdges: 49\nNode types: {'link_quality': 9, 'commit': 5, 'comment': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'pr_file': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'chain_has_link_quality': 9, 'comment_chain_links_commit': 5, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'comment_chain_touches_file': 4, 'issue_chain_has_comment_chain': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_touches_file': 1, 'thread_has_issue_chain': 1, 'issue_chain_touches_file': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 5, 'verification_or_tests': 3, 'human_reported_issue_no_linked_fix': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'test_or_ci': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 3, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-9ed790667db55b67", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 439378, "scanner": "foundry_dataset", "fingerprint": "e891abc5ed5022a8ae0051acc04eecea19b69139a534f0ba8626937a37526460", "category": "practices", "severity": "medium", "confidence": 0.62, "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": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "shanestratton/thalassa-marine-weather#6", "human_labels": ["api_integration_gap", "api_or_backend", "dependency_or_build", "security_auth_secret", "source_or_other", "ui_or_frontend"], "issue_number": "6", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-e8f08749f8420e57", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 9, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 2, "ui_or_frontend": 4, "source_or_other": 2, "dependency_or_build": 1}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: assumption_checks\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 9\nLabels: {'security_auth_secret': 1, 'api_integration_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'ui_or_frontend': 4, 'source_or_other': 2, 'api_or_backend': 2, 'dependency_or_build': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-8fbaa87222cd2eb9\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/6\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: shanestratton (User)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/6\\nTitle: feat: CMEMS currents (full stack) + staleness banner + inflight dedup\\nBody:\\n## Summary\\n\\nMerges 7 commits from the claude/magical-wu-f3a609 branch to master:\\n\\n- **Roadmap #2 (staleness banner)** \u2014 4-tier severity strip above the hero + age-aware timer badge replacing the misleading \\\\\\\"LIVE\\\\\\\" literal. Already merged to master earlier via PR #5; this PR re-includes the work.\\n- **Roadmap #3 (CMEMS currents)** \u2014 full-stack pivot from Mapbox MTS raster-array to GitHub-Release-backed binary tiles + custom WebGL particle layer (reuses existing WindParticleLayer engine).\\n- **Roadmap #9.5 (API audit)** \u2014 inflight-promise dedup on fetchStormGlassWeather to coalesce concurrent same-coord calls.\\n\\nThe CMEMS pipeline + recipe work on master (Python, workflows, recipe.json) was landed directly; this PR brings across the **frontend** side (data fetch, layer hook, Vite/Vercel proxy).\\n\\n## Key changes\\n\\n### Currents\\n- \\\\`services/weather/api/currentsGrid.ts\\\\` \u2014 fetches binary manifes\"\n  },\n  {\n    \"id\": \"github-feedback-comment-21b1397d93e62739\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/6#issuecomment-4276752029\",\n    \"text\": \"GitHub feedback: api_integration_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/6#issuecomment-42767\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-assumption_checks-94e7204bf8f7da24", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460385, "scanner": "foundry_dataset", "fingerprint": "6033956b7674ceabd88e9a65733842bc684bd197bc6703c41e67a84f14114750", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"bug_fix": 2, "test_or_ci": 7, "test_ci_gap": 2, "api_integration_gap": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 4, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 2, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 8, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 73, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 3, "thread_has_comment": 3, "thread_touches_file": 7, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 8, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 7, "thread_has_comment_chain": 3, "comment_chain_links_commit": 5, "comment_chain_touches_file": 21, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 3}, "node_count": 34, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 3, "pr_file": 7, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 3, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#7", "issue_number": "7", "quality_tiers": {"unresolved": 2, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-ebe419801b68ca86", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 42}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 7\nGraph consistency label: supported_by_verification_signal\nNodes: 34\nEdges: 73\nNode types: {'link_quality': 8, 'pr_file': 7, 'commit': 5, 'comment': 3, 'comment_chain': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 21, 'chain_has_link_quality': 8, 'thread_touches_file': 7, 'issue_chain_touches_file': 7, 'comment_chain_links_commit': 5, 'thread_has_comment': 3, 'thread_has_comment_chain': 3, 'comment_has_chain': 3, 'issue_chain_has_comment_chain': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'test_or_ci': 7, 'not_resolved_or_not_observed': 4, 'verification_or_tests': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'human_reported_issue_no_linked_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 8, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 3, 'unresolved': 2}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-df32671d25110e61", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460384, "scanner": "foundry_dataset", "fingerprint": "5a66038bb13f9dc12f5a4757fdf38de888f6115a581ebecd208140f9ca2afe27", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 1, "docs_or_claims": 1, "ui_or_frontend": 12, "source_or_other": 4, "api_integration_gap": 1, "dependency_or_build": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 84, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 19, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 24, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 41, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 19, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#5", "issue_number": "5", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-69d59824119f2ae9", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 5, "docs_or_claims": 5, "ui_or_frontend": 60, "source_or_other": 20, "dependency_or_build": 5}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#5\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#5\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 5\nGraph consistency label: supported_by_verification_signal\nNodes: 41\nEdges: 84\nNode types: {'pr_file': 19, 'link_quality': 6, 'commit': 5, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 19, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 6, 'comment_chain_links_commit': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 12, 'source_or_other': 4, 'verification_or_tests': 3, 'claimed_resolved_with_verification_signal': 3, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'test_or_ci': 1, 'docs_or_claims': 1, 'dependency_or_build': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-9f66758f6a96a745", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460383, "scanner": "foundry_dataset", "fingerprint": "1a2604de061a8653f61185e05f9ace8ba7d9d73cb17ffc9f65c6e43ab93d64e1", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"test_or_ci": 3, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 56, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 28, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#4", "issue_number": "4", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-6364c58a1bea8516", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#4\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 4\nGraph consistency label: assumption_check\nNodes: 28\nEdges: 56\nNode types: {'link_quality': 9, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-f945023d6c0f8e20", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460382, "scanner": "foundry_dataset", "fingerprint": "c6ccf5b380cd38a55a987df46179b80873a783021a6544e1d0282d32b2848376", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"test_or_ci": 4, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 62, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 4, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 4, "thread_has_comment_chain": 4, "comment_chain_touches_file": 16, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 29, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 4, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#3", "issue_number": "3", "quality_tiers": {"unresolved": 6, "assumption_check": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-dcee1faf34331ee3", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 28}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#3\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 3\nGraph consistency label: assumption_check\nNodes: 29\nEdges: 62\nNode types: {'link_quality': 9, 'comment': 4, 'pr_file': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 16, 'chain_has_link_quality': 9, 'thread_has_comment': 4, 'thread_touches_file': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'issue_chain_touches_file': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'test_or_ci': 4, 'human_reported_issue_no_linked_fix': 4, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-6201d86dff53df7c", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460381, "scanner": "foundry_dataset", "fingerprint": "4324641f72669ed063424da12b2800d4fe1bb41763f23de40c6a9cccb22a7818", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"test_or_ci": 3, "test_ci_gap": 1, "api_integration_gap": 1, "security_auth_secret": 2, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 6, "blueprint_human_gap_disagreement": 2, "human_reported_issue_no_linked_fix": 4, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 12}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 52, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 3, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 8, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 4, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 26, "node_types": {"repo": 1, "thread": 1, "comment": 4, "pr_file": 3, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 8, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#2", "issue_number": "2", "quality_tiers": {"unresolved": 6, "assumption_check": 2}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-ab3b6408c845aca9", "graph_gold_label": "assumption_check", "changed_file_labels": {"test_or_ci": 21}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: assumption_check\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nGraph gold label: assumption_check\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#2\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 2\nGraph consistency label: assumption_check\nNodes: 26\nEdges: 52\nNode types: {'link_quality': 8, 'comment': 4, 'comment_chain': 4, 'pr_file': 3, 'alignment': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 12, 'chain_has_link_quality': 8, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'issue_chain_has_comment_chain': 4, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 6, 'human_reported_issue_no_linked_fix': 4, 'test_or_ci': 3, 'security_auth_secret': 2, 'thread_has_human_issue_without_fix_context': 2, 'blueprint_human_gap_disagreement': 2, 'issue_or_pull_request_thread': 1, 'test_ci_gap': 1, 'api_integration_gap': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 12}\nQuality tiers: {'unresolved': 6, 'assumption_check': 2}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-b0c06c90809cba14", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_test_ci_gap", "level": "error", "message": {"text": "Foundry mined test ci gap after feedback: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 460380, "scanner": "foundry_dataset", "fingerprint": "374aebc6f0edd1697f3b82161cd8ed17b3026990b998a88f51f5dc7ae906a996", "category": "testing", "severity": "high", "confidence": 0.78, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Feedback exposes missing tests or CI", "intent": "Hard negatives for feedback/fix chains without adequate guardrails.", "labels": {"bug_fix": 2, "test_or_ci": 1, "test_ci_gap": 2, "api_integration_gap": 1, "security_auth_secret": 1, "verification_or_tests": 3, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 5, "blueprint_human_gap_disagreement": 3, "human_reported_issue_no_linked_fix": 3, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 1, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "test_ci_gap_after_feedback", "outcomes": {"not_resolved_or_not_observed": 10, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "test_ci_gap_after_feedback", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 49, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 4, "thread_has_comment": 4, "thread_touches_file": 1, "alignment_uses_comment": 3, "alignment_uses_finding": 3, "chain_has_link_quality": 9, "comment_aligns_finding": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 1, "thread_has_comment_chain": 4, "comment_chain_links_commit": 5, "comment_chain_touches_file": 4, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 4}, "node_count": 31, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 4, "pr_file": 1, "alignment": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 9, "comment_chain": 4, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#1", "issue_number": "1", "quality_tiers": {"unresolved": 3, "assumption_check": 3, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "hard_negative", "source_motif_id": "graph-pattern-motif-thread-a3b1b556b0c64906", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 7}}, "text": "Graph query export: Feedback exposes missing tests or CI\nQuery id: test_ci_gap_after_feedback\nQuery type: motif_query\nIntent: Hard negatives for feedback/fix chains without adequate guardrails.\nMotif: test_ci_gap_after_feedback\nTraining usage: hard_negative\nGraph gold label: supported_by_verification_signal\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nEvidence:\nGraph motif: Feedback or fix context exposes missing test/CI guardrails\nMotif id: test_ci_gap_after_feedback\nPolarity: bad\nTraining usage: hard_negative\nSeverity: high\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#1\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 31\nEdges: 49\nNode types: {'link_quality': 9, 'commit': 5, 'comment': 4, 'comment_chain': 4, 'alignment': 3, 'thread': 1, 'repo': 1, 'pr_file': 1, 'issue_chain': 1, 'fix_outcome': 1, 'blueprint_finding': 1}\nEdge types: {'chain_has_link_quality': 9, 'comment_chain_links_commit': 5, 'thread_has_comment': 4, 'thread_has_comment_chain': 4, 'comment_has_chain': 4, 'comment_chain_touches_file': 4, 'issue_chain_has_comment_chain': 4, 'alignment_uses_comment': 3, 'alignment_uses_finding': 3, 'comment_aligns_finding': 3, 'repo_has_thread': 1, 'thread_touches_file': 1, 'thread_has_issue_chain': 1, 'issue_chain_touches_file': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'not_resolved_or_not_observed': 5, 'verification_or_tests': 3, 'human_reported_issue_no_linked_fix': 3, 'blueprint_human_gap_disagreement': 3, 'test_ci_gap': 2, 'bug_fix': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'security_auth_secret': 1, 'test_or_ci': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'claimed_resolved_with_verification_signal': 1, 'mostly follows blueprint': 1}\nOutcomes: {'not_resolved_or_not_observed': 10, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 3, 'assumption_check': 3}\nCI labels: {}\nCurriculum targets:\n- Turn human feedback into regression tests and CI gates.\n- Penalize fixes that do not add or exercise verification for affected workflows.\nAssumption checks:\n- Did the fix add tests for the exact complaint?\n- Does CI run those tests, or is verification only implied?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-90e7abc1640f3b9f", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/test_ci_gap_after_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/test_ci_gap_after_feedback", "training_usage": "hard_negative"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 444881, "scanner": "foundry_dataset", "fingerprint": "1154f999e291b0649fa0358876d058208b5e325f8fe08eea38cb985c5071afcf", "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": "shanestratton/thalassa-marine-weather#7", "human_labels": ["api_integration_gap", "test_ci_gap", "test_or_ci"], "issue_number": "7", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.607, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-b644ed87f066c534", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 7, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 7}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#7\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#7\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_and_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 3\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 7\nLabels: {'test_ci_gap': 2, 'api_integration_gap': 1}\nPolarities: {'bad': 3}\nChanged file labels: {'test_or_ci': 7}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-73dfffc57530c700\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/7\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/7\\nTitle: build(deps): bump actions/setup-python from 5 to 6\\nBody:\\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.\\n<details>\\n<summary>Release notes</summary>\\n<p><em>Sourced from <a href=\\\"https://github.com/actions/setup-python/releases\\\">actions/setup-python's releases</a>.</em></p>\\n<blockquote>\\n<h2>v6.0.0</h2>\\n<h2>What's Changed</h2>\\n<h3>Breaking Changes</h3>\\n<ul>\\n<li>Upgrade to node 24 by <a href=\\\"https://github.com/salmanmkc\\\"><code>@\u200bsalmanmkc</code></a> in <a href=\\\"https://redirect.github.com/actions/setup-python/pull/1164\\\">actions/setup-python#1164</a></li>\\n</ul>\\n<p>Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. <a href=\\\"https://github.com/actions/runner/releases/tag/v2.327.1\\\">See Release Notes</a></p>\\n<h3>Enhancements:</h3>\\n<ul>\\n<li>Add support for <code>pip-version</code>  by <a href=\\\"https://github.com/priyagupta108\\\"><code>@\u200bpriyagupta108</code></a> in <a href=\\\"https://redirect.github.com\"\n  },\n  {\n    \"id\": \"github-feedback-comment-079a11dc0a4fdc55\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/7#issuecomment-4278835227\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/7#issuecomment-4278835227\\nTitle: \\nBody:\\n### Labels\\n\\nThe following labels could not be found: `ci`, `dependencies`. Pl\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-bad_chains-49faca640035df50", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 444880, "scanner": "foundry_dataset", "fingerprint": "ec25735c66f54f2891ffffa0aea69100eb1aefa6bde754f9d9c237fdfeb76296", "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": "shanestratton/thalassa-marine-weather#4", "human_labels": ["api_integration_gap", "security_auth_secret", "test_ci_gap", "test_or_ci"], "issue_number": "4", "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": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-0d3e9a2653612972", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 3}, "linked_commit_count": 0, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_unresolved", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#4\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#4\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 4\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'test_ci_gap': 2, 'api_integration_gap': 1, 'security_auth_secret': 1}\nPolarities: {'bad': 4}\nChanged file labels: {'test_or_ci': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-3b57958b62d16a18\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/4\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/4\\nTitle: chore(deps): bump actions/setup-node from 4 to 6\\nBody:\\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.\\n<details>\\n<summary>Release notes</summary>\\n<p><em>Sourced from <a href=\\\"https://github.com/actions/setup-node/releases\\\">actions/setup-node's releases</a>.</em></p>\\n<blockquote>\\n<h2>v6.0.0</h2>\\n<h2>What's Changed</h2>\\n<p><strong>Breaking Changes</strong></p>\\n<ul>\\n<li>Limit automatic caching to npm, update workflows and documentation by <a href=\\\"https://github.com/priyagupta108\\\"><code>@\u200bpriyagupta108</code></a> in <a href=\\\"https://redirect.github.com/actions/setup-node/pull/1374\\\">actions/setup-node#1374</a></li>\\n</ul>\\n<p><strong>Dependency Upgrades</strong></p>\\n<ul>\\n<li>Upgrade ts-jest from 29.1.2 to 29.4.1 and document breaking changes in v5 by <a href=\\\"https://github.com/dependabot\\\"><code>@\u200bdependabot</code></a>[bot] in <a href=\\\"https://redirect.github.com/actions/setup-node/pull/1336\\\">#1336</a></li>\\n<li>Upgrade prettier from 2.8.8 to 3.\"\n  },\n  {\n    \"id\": \"github-feedback-comment-bf06423f972069b5\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/4#issuecomment-4109766009\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/4#issuecomment-4109766009\\nTitle: \\nBody:\\n### Labels\\n\\nThe following labels could not be fou\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-bad_chains-e0e7a499208f1b63", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 444879, "scanner": "foundry_dataset", "fingerprint": "9168df673fd92551fe60a4f2b892ae9185b5f69e9f6325f6b2bb4679a2e25981", "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": "shanestratton/thalassa-marine-weather#3", "human_labels": ["api_integration_gap", "security_auth_secret", "test_ci_gap", "test_or_ci"], "issue_number": "3", "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": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-b19f3c09f4342da0", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 4, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 4}, "linked_commit_count": 0, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_unresolved", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#3\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#3\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 4\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 4\nLabels: {'test_ci_gap': 2, 'api_integration_gap': 1, 'security_auth_secret': 1}\nPolarities: {'bad': 4}\nChanged file labels: {'test_or_ci': 4}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-c457b059ea054b85\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/3\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/3\\nTitle: chore(deps): bump actions/checkout from 4 to 6\\nBody:\\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\\n<details>\\n<summary>Release notes</summary>\\n<p><em>Sourced from <a href=\\\"https://github.com/actions/checkout/releases\\\">actions/checkout's releases</a>.</em></p>\\n<blockquote>\\n<h2>v6.0.0</h2>\\n<h2>What's Changed</h2>\\n<ul>\\n<li>Update README to include Node.js 24 support details and requirements by <a href=\\\"https://github.com/salmanmkc\\\"><code>@\u200bsalmanmkc</code></a> in <a href=\\\"https://redirect.github.com/actions/checkout/pull/2248\\\">actions/checkout#2248</a></li>\\n<li>Persist creds to a separate file by <a href=\\\"https://github.com/ericsciple\\\"><code>@\u200bericsciple</code></a> in <a href=\\\"https://redirect.github.com/actions/checkout/pull/2286\\\">actions/checkout#2286</a></li>\\n<li>v6-beta by <a href=\\\"https://github.com/ericsciple\\\"><code>@\u200bericsciple</code></a> in <a href=\\\"https://redirect.github.com/actions/checkout/pull/2298\\\">actions/checkout#2298</a></li>\\n<\"\n  },\n  {\n    \"id\": \"github-feedback-comment-8258ad5595c76910\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/3#issuecomment-4109765565\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/3#issuecomment-4109765565\\nTitle: \\nBody:\\n### Labels\\n\\nThe following labels could not be fo\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-bad_chains-140266b331a06f3f", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 444878, "scanner": "foundry_dataset", "fingerprint": "73b6b7d571351848fb2860d8c466f598fc7b571bcabd940db55a1b990a11da87", "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": "shanestratton/thalassa-marine-weather#2", "human_labels": ["api_integration_gap", "security_auth_secret", "test_ci_gap", "test_or_ci"], "issue_number": "2", "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": "shanestratton/thalassa-marine-weather", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-29dfe48afa38d14f", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 3}, "linked_commit_count": 0, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_unresolved", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#2\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#2\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 4\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'security_auth_secret': 2, 'test_ci_gap': 1, 'api_integration_gap': 1}\nPolarities: {'bad': 4}\nChanged file labels: {'test_or_ci': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-83235844d393905f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/2\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/2\\nTitle: chore(deps): bump actions/upload-artifact from 4 to 7\\nBody:\\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.\\n<details>\\n<summary>Release notes</summary>\\n<p><em>Sourced from <a href=\\\"https://github.com/actions/upload-artifact/releases\\\">actions/upload-artifact's releases</a>.</em></p>\\n<blockquote>\\n<h2>v7.0.0</h2>\\n<h2>v7 What's new</h2>\\n<h3>Direct Uploads</h3>\\n<p>Adds support for uploading single files directly (unzipped). Callers can set the new <code>archive</code> parameter to <code>false</code> to skip zipping the file during upload. Right now, we only support single files. The action will fail if the glob passed resolves to multiple files. The <code>name</code> parameter is also ignored with this setting. Instead, the name of the artifact will be the name of the uploaded file.</p>\\n<h3>ESM</h3>\\n<p>To support new versions of the <code>@actions/*</code> packages, we've upgraded the package to ESM.</p>\\n<h2>What's Changed</h\"\n  },\n  {\n    \"id\": \"github-feedback-comment-1800264a0d82b39f\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/2#issuecomment-4109765066\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/2#issuecomment-4109765066\\nTitle: \\nBody:\\n### Labels\\n\\nThe following labels could not be found\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-bad_chains-44fcff005d26da4f", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 444877, "scanner": "foundry_dataset", "fingerprint": "3e0fd4273b347731109e1fdfb016f56232c05d3f0cc5233ab8e58747ec7803d4", "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": "shanestratton/thalassa-marine-weather#1", "human_labels": ["api_integration_gap", "security_auth_secret", "test_ci_gap", "test_or_ci"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.58, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-aa54fad038e67bd0", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 2, "docs": 1, "architecture": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 1, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 1}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 5, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: bad_chains\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#1\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: shanestratton/thalassa-marine-weather#1\nRepo: shanestratton/thalassa-marine-weather\nThread label: thread_has_human_issue_and_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 4\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 1\nLabels: {'test_ci_gap': 2, 'api_integration_gap': 1, 'security_auth_secret': 1}\nPolarities: {'bad': 4}\nChanged file labels: {'test_or_ci': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-bd0b72abed2daf23\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/1\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/1\\nTitle: chore(deps): bump github/codeql-action from 3 to 4\\nBody:\\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.\\n<details>\\n<summary>Release notes</summary>\\n<p><em>Sourced from <a href=\\\"https://github.com/github/codeql-action/releases\\\">github/codeql-action's releases</a>.</em></p>\\n<blockquote>\\n<h2>v3.34.1</h2>\\n<ul>\\n<li>Downgrade default CodeQL bundle version to <a href=\\\"https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.24.3\\\">2.24.3</a> due to issues with a small percentage of Actions and JavaScript analyses. <a href=\\\"https://redirect.github.com/github/codeql-action/pull/3762\\\">#3762</a></li>\\n</ul>\\n<h2>v3.34.0</h2>\\n<ul>\\n<li>Added an experimental change which disables TRAP caching when <a href=\\\"https://redirect.github.com/github/roadmap/issues/1158\\\">improved incremental analysis</a> is enabled, since improved incremental analysis supersedes TRAP caching. This will improve performance and reduce Actions cache usage. We expect t\"\n  },\n  {\n    \"id\": \"github-feedback-comment-bbe0dfd3b3f80d14\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"test_ci_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/shanestratton/thalassa-marine-weather/pull/1#issuecomment-4109764627\",\n    \"text\": \"GitHub feedback: test_ci_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: shanestratton/thalassa-marine-weather\\nAuthor: dependabot[bot] (Bot)\\nURL: https://github.com/shanestratton/thalassa-marine-weather/pull/1#issuecomment-4109764627\\nTitle: \\nBody:\\n### Labels\\n\\nThe following labels could not be found: `ci\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "comment-chain-pattern-bad_chains-988a144671641291", "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": "shanestratton/thalassa-marine-weather", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: shanestratton/thalassa-marine-weather"}, "properties": {"repobilityId": 456278, "scanner": "foundry_dataset", "fingerprint": "b37d08c1ece3358eac35e7dab05f90c466b0e98c23a76badfb8a08ddaa300e75", "category": "auth", "severity": "critical", "confidence": 0.78, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Security/auth changes without enough guardrails", "intent": "Assumption-check security/auth examples requiring stronger tests or CI.", "labels": {"bug_fix": 5, "api_or_backend": 2, "ui_or_frontend": 4, "source_or_other": 2, "api_integration_gap": 1, "dependency_or_build": 1, "security_auth_secret": 1, "mostly follows blueprint": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_no_linked_fix": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"claimed_resolved_unverified": 6, "not_resolved_or_not_observed": 2}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 61, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 9, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 5, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 9, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 18, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 29, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 9, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "shanestratton/thalassa-marine-weather#6", "issue_number": "6", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "shanestratton/thalassa-marine-weather", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-04b5d7f5da2e9d76", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 10, "ui_or_frontend": 20, "source_or_other": 10, "dependency_or_build": 5}}, "text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: shanestratton/thalassa-marine-weather\nThread: shanestratton/thalassa-marine-weather#6\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: shanestratton/thalassa-marine-weather#6\nRepo: shanestratton/thalassa-marine-weather\nIssue/PR number: 6\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 61\nNode types: {'pr_file': 9, 'commit': 5, 'link_quality': 5, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 18, 'thread_touches_file': 9, 'issue_chain_touches_file': 9, 'comment_chain_links_commit': 5, 'chain_has_link_quality': 5, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'bug_fix': 5, 'ui_or_frontend': 4, 'claimed_resolved_unverified': 3, 'source_or_other': 2, 'api_or_backend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'api_integration_gap': 1, 'dependency_or_build': 1, 'human_reported_issue_then_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_unverified': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Train auth boundary repair with tests, permission matrices, and secret-handling checks.\n- Keep risky auth changes separate from ordinary bug-fix examples.\nAssumption checks:\n- Are auth/permission paths covered by tests?\n- Are secrets, CORS, or access rules verified rather than summarized?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/shanestratton/thalassa-marine-weather", "source_id": "graph-query-motif_query-f95d429eeb9057b5", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/security_auth_guardrail_gaps/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "shanestratton/thalassa-marine-weather", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-91a339d70964ea91", "level": "note", "message": {"text": "Possibly dead Python function: way"}, "properties": {"repobilityId": "94af1b2a36e6006b", "scanner": "scanner-primary", "fingerprint": "91a339d70964ea91", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scan_depth_fairway.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d271680b46827251", "level": "note", "message": {"text": "Possibly dead Python function: relation"}, "properties": {"repobilityId": "a20215d8c4799b8f", "scanner": "scanner-primary", "fingerprint": "d271680b46827251", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scan_depth_fairway.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27bed85a8f0d9a51", "level": "note", "message": {"text": "Possibly dead Python function: way"}, "properties": {"repobilityId": "94af1b2a36e6006b", "scanner": "scanner-primary", "fingerprint": "27bed85a8f0d9a51", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_nav_graph.py:556"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab55d4fa3e7c16cd", "level": "note", "message": {"text": "Possibly dead Python function: decode_type"}, "properties": {"repobilityId": "0ba0ee6bf45a22b9", "scanner": "scanner-primary", "fingerprint": "ab55d4fa3e7c16cd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vessel-scraper/extract_marine_cadastre.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-019266428e540af2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-apple-client-secret.js:80"}, "properties": {"repobilityId": "a58ff023ab538416", "scanner": "scanner-primary", "fingerprint": "019266428e540af2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6e5a6edcadf1f9cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build_channel_walls.js:22"}, "properties": {"repobilityId": "e31fbdc215db7e00", "scanner": "scanner-primary", "fingerprint": "6e5a6edcadf1f9cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74487a1f8634e61f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-bundle-size.js:52"}, "properties": {"repobilityId": "3ca2fa657d7d6b6e", "scanner": "scanner-primary", "fingerprint": "74487a1f8634e61f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-766612806e9eaf0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 cloudflare-worker/src/index.ts:185"}, "properties": {"repobilityId": "0e73cf6ea8534d89", "scanner": "scanner-primary", "fingerprint": "766612806e9eaf0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5108ba707a720970", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CommunityTrackBrowser.tsx:466"}, "properties": {"repobilityId": "c80bf13b93dd6cb3", "scanner": "scanner-primary", "fingerprint": "5108ba707a720970", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-668ad6d5f94d6b36", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/DateGroupedTimeline.tsx:394"}, "properties": {"repobilityId": "8bdc786956bd19c4", "scanner": "scanner-primary", "fingerprint": "668ad6d5f94d6b36", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-724973de41be87b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MarketplaceThread.tsx:230"}, "properties": {"repobilityId": "fdc590a139c62bf4", "scanner": "scanner-primary", "fingerprint": "724973de41be87b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56cd044aea60673a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/VesselHub.tsx:1545"}, "properties": {"repobilityId": "3977e0ebd8f1dbcc", "scanner": "scanner-primary", "fingerprint": "56cd044aea60673a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97a9bc45e3e3781e", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/SettingsModal.tsx:56"}, "properties": {"repobilityId": "00012db5efc009fb", "scanner": "scanner-primary", "fingerprint": "97a9bc45e3e3781e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-dbb5e3266b74557e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RoutePlanner.tsx:549"}, "properties": {"repobilityId": "669724460208080a", "scanner": "scanner-primary", "fingerprint": "dbb5e3266b74557e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b29db525a246ee37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GuardianPage.tsx:369"}, "properties": {"repobilityId": "c447aa8bcdd5d899", "scanner": "scanner-primary", "fingerprint": "b29db525a246ee37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-743c7a29bd79e285", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TrackMapViewer.tsx:829"}, "properties": {"repobilityId": "63157dbb48cc6f76", "scanner": "scanner-primary", "fingerprint": "743c7a29bd79e285", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1067ef456afd3ea3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/VoyageHeader.tsx:224"}, "properties": {"repobilityId": "e4162f790f6b16a1", "scanner": "scanner-primary", "fingerprint": "1067ef456afd3ea3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fc8049183192790", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PushToast.tsx:178"}, "properties": {"repobilityId": "7f65418402ac926a", "scanner": "scanner-primary", "fingerprint": "3fc8049183192790", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90e86675a93da0c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AnchorWatchPage.tsx:698"}, "properties": {"repobilityId": "71ec30ffd8268c6e", "scanner": "scanner-primary", "fingerprint": "90e86675a93da0c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4d4a59125ca0744", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ChatHub.tsx:247"}, "properties": {"repobilityId": "ccf274d51ffe812f", "scanner": "scanner-primary", "fingerprint": "a4d4a59125ca0744", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c1deef9070eaeda", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FollowRouteBadge.tsx:257"}, "properties": {"repobilityId": "552a0c1c234e43b6", "scanner": "scanner-primary", "fingerprint": "5c1deef9070eaeda", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f0114cb0d6d2c1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AddEntryModal.tsx:205"}, "properties": {"repobilityId": "0f01bae1ce5b31e4", "scanner": "scanner-primary", "fingerprint": "5f0114cb0d6d2c1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c9c305a2b2a8fca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SettingsRestoredModal.tsx:183"}, "properties": {"repobilityId": "ab45a1fef7a04aa2", "scanner": "scanner-primary", "fingerprint": "1c9c305a2b2a8fca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e6a53137d240ee9", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/SystemStatusButton.tsx:456"}, "properties": {"repobilityId": "ca1d76b39f1a052c", "scanner": "scanner-primary", "fingerprint": "6e6a53137d240ee9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-44ef01d4ca647768", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AdminPanel.tsx:506"}, "properties": {"repobilityId": "a61e180611d6b6d8", "scanner": "scanner-primary", "fingerprint": "44ef01d4ca647768", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-500650144fd2b944", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/VoyageLogTab.tsx:270"}, "properties": {"repobilityId": "d19d0fb7207871ca", "scanner": "scanner-primary", "fingerprint": "500650144fd2b944", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-906283b042ad1989", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerSetupGuide.tsx:461"}, "properties": {"repobilityId": "fa50f11e65e9a391", "scanner": "scanner-primary", "fingerprint": "906283b042ad1989", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ad5979bb1d777e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/ChartServerTab.tsx:232"}, "properties": {"repobilityId": "e986b87684208736", "scanner": "scanner-primary", "fingerprint": "1ad5979bb1d777e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19e76421f7b6019f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/settings/LocationsTab.tsx:53"}, "properties": {"repobilityId": "3e35d10c82695c96", "scanner": "scanner-primary", "fingerprint": "19e76421f7b6019f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2667d04300b8acbc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chandlery/BasketDrawer.tsx:110"}, "properties": {"repobilityId": "126464cb989f8807", "scanner": "scanner-primary", "fingerprint": "2667d04300b8acbc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92c40e963a267b24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/marketplace/CheckoutModal.tsx:171"}, "properties": {"repobilityId": "5a8dad73d37d896c", "scanner": "scanner-primary", "fingerprint": "92c40e963a267b24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c019401b66cfe5c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/PageHeader.tsx:78"}, "properties": {"repobilityId": "44310f31cb551bbb", "scanner": "scanner-primary", "fingerprint": "c019401b66cfe5c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3efb4d8a6e88664", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/UndoToast.tsx:74"}, "properties": {"repobilityId": "3cfaa66e4aeb68fe", "scanner": "scanner-primary", "fingerprint": "f3efb4d8a6e88664", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-473d1fca5601d127", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherGrid.tsx:290"}, "properties": {"repobilityId": "d8ea8541623e68c2", "scanner": "scanner-primary", "fingerprint": "473d1fca5601d127", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-206eb9fc66b6b1a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/MetricPinSheet.tsx:156"}, "properties": {"repobilityId": "c7a7106b5a0d86c5", "scanner": "scanner-primary", "fingerprint": "206eb9fc66b6b1a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19627ddb413db92f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/VesselWidget.tsx:56"}, "properties": {"repobilityId": "f111c0104b9a4a66", "scanner": "scanner-primary", "fingerprint": "19627ddb413db92f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-065a32ffb9469b22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/WeatherCharts.tsx:209"}, "properties": {"repobilityId": "c4bc526aa74c9053", "scanner": "scanner-primary", "fingerprint": "065a32ffb9469b22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1357627511c363e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/hero/EssentialAnchorView.tsx:417"}, "properties": {"repobilityId": "0a2edf2e1e369db1", "scanner": "scanner-primary", "fingerprint": "c1357627511c363e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-715248f04f380dfc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatErrorBoundary.tsx:46"}, "properties": {"repobilityId": "94944be924bda120", "scanner": "scanner-primary", "fingerprint": "715248f04f380dfc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edbba3b5c24154a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatAttachmentSheets.tsx:38"}, "properties": {"repobilityId": "acfa0406dd25dd1f", "scanner": "scanner-primary", "fingerprint": "edbba3b5c24154a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f98a7d8d7d4582b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatDMView.tsx:86"}, "properties": {"repobilityId": "10f05d65c37d37be", "scanner": "scanner-primary", "fingerprint": "f98a7d8d7d4582b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1923c97837eba58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/RecipeCard.tsx:68"}, "properties": {"repobilityId": "c561f229a09c5060", "scanner": "scanner-primary", "fingerprint": "c1923c97837eba58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d34324fb8d5e311", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/PinMapViewer.tsx:205"}, "properties": {"repobilityId": "58bb717b76ac6615", "scanner": "scanner-primary", "fingerprint": "2d34324fb8d5e311", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ddfb08f7f8e01c73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/GalleyCard.tsx:460"}, "properties": {"repobilityId": "7c291677395eea61", "scanner": "scanner-primary", "fingerprint": "ddfb08f7f8e01c73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f37fcf76aae5c31e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChefPlate.tsx:438"}, "properties": {"repobilityId": "aede7261a17d3a38", "scanner": "scanner-primary", "fingerprint": "f37fcf76aae5c31e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-004ee8b42d324f00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CaptainsTable.tsx:1027"}, "properties": {"repobilityId": "658fa79e27e763f8", "scanner": "scanner-primary", "fingerprint": "004ee8b42d324f00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be445687d17f6d24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChannelList.tsx:246"}, "properties": {"repobilityId": "8b33d9b9e473f4eb", "scanner": "scanner-primary", "fingerprint": "be445687d17f6d24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98b9991ee70a67f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/MealCalendar.tsx:432"}, "properties": {"repobilityId": "28697f47419cb376", "scanner": "scanner-primary", "fingerprint": "98b9991ee70a67f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0fdb230f61a0829", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/CustomRecipeForm.tsx:480"}, "properties": {"repobilityId": "99da16518dfc1f16", "scanner": "scanner-primary", "fingerprint": "e0fdb230f61a0829", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fa78a465d767162", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/chat/ChatMessageList.tsx:151"}, "properties": {"repobilityId": "48666ec5fd6a380f", "scanner": "scanner-primary", "fingerprint": "3fa78a465d767162", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d69bf4fc958e1d98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voice/PiSetupWizard.tsx:411"}, "properties": {"repobilityId": "a7b39d556c8f28e5", "scanner": "scanner-primary", "fingerprint": "d69bf4fc958e1d98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c9eff2a095d9fff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryPublishModal.tsx:124"}, "properties": {"repobilityId": "f80c57b7bfcaf0fa", "scanner": "scanner-primary", "fingerprint": "3c9eff2a095d9fff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdd333197e8d69e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/DiaryEntryView.tsx:105"}, "properties": {"repobilityId": "19e46e2e91581c25", "scanner": "scanner-primary", "fingerprint": "bdd333197e8d69e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a24290c0b8ea3823", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/diary/SwipeableDiaryCard.tsx:207"}, "properties": {"repobilityId": "e0d655ad738f1910", "scanner": "scanner-primary", "fingerprint": "a24290c0b8ea3823", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b17c422d81320fdb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/onboarding/HomePortStep.tsx:106"}, "properties": {"repobilityId": "cb4c5975c15849b7", "scanner": "scanner-primary", "fingerprint": "b17c422d81320fdb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a1af5b112e0505f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/LegPickerDropdown.tsx:712"}, "properties": {"repobilityId": "240033654339da5b", "scanner": "scanner-primary", "fingerprint": "3a1af5b112e0505f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f928aae89af46764", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/TripOverviewSheet.tsx:233"}, "properties": {"repobilityId": "b71ca4a0e470eca8", "scanner": "scanner-primary", "fingerprint": "f928aae89af46764", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8099c2c3d4ed450f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/CustomsClearanceCard.tsx:387"}, "properties": {"repobilityId": "d94bc9f7f93e3b48", "scanner": "scanner-primary", "fingerprint": "8099c2c3d4ed450f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8215ef7812b6e9f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureSweepSheet.tsx:225"}, "properties": {"repobilityId": "bf0712cfcc1c2873", "scanner": "scanner-primary", "fingerprint": "8215ef7812b6e9f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9b24d036ccf4647", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/EmergencyPlan.tsx:176"}, "properties": {"repobilityId": "bbbecfa002826c58", "scanner": "scanner-primary", "fingerprint": "e9b24d036ccf4647", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c9006fe45a67782", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VoyageCleanupSheet.tsx:177"}, "properties": {"repobilityId": "3bdcb878b103cd19", "scanner": "scanner-primary", "fingerprint": "0c9006fe45a67782", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-400f4cacfec55319", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/AccordionSection.tsx:127"}, "properties": {"repobilityId": "10a9dbaec157196d", "scanner": "scanner-primary", "fingerprint": "400f4cacfec55319", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fa54ff7dcd6b509", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/GalleyMealPlanner.tsx:389"}, "properties": {"repobilityId": "e23562f52b752050", "scanner": "scanner-primary", "fingerprint": "9fa54ff7dcd6b509", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58ffbfece0d7ac64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ComfortQuickConfig.tsx:124"}, "properties": {"repobilityId": "e0e1087acdee22e9", "scanner": "scanner-primary", "fingerprint": "58ffbfece0d7ac64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7db9fff7fe6a429e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/SavedLocationsPicker.tsx:221"}, "properties": {"repobilityId": "7a197be0e9fd0d38", "scanner": "scanner-primary", "fingerprint": "7db9fff7fe6a429e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-adabd3bb6c99f7dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/DepartureWindowSheet.tsx:145"}, "properties": {"repobilityId": "8df8ca3b8db93a8d", "scanner": "scanner-primary", "fingerprint": "adabd3bb6c99f7dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-901d47aaa9ef8041", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchAssignSheet.tsx:168"}, "properties": {"repobilityId": "6244e12bbe05a2be", "scanner": "scanner-primary", "fingerprint": "901d47aaa9ef8041", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fe66501c23322e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/ResourceCalculator.tsx:530"}, "properties": {"repobilityId": "898926f86606b28a", "scanner": "scanner-primary", "fingerprint": "6fe66501c23322e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e862280d8208bdd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/VesselProfileSummary.tsx:124"}, "properties": {"repobilityId": "32d8b854114bafdc", "scanner": "scanner-primary", "fingerprint": "e862280d8208bdd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f55fa32cec117628", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/PassageSummaryCard.tsx:167"}, "properties": {"repobilityId": "7ec96ed9dea9f644", "scanner": "scanner-primary", "fingerprint": "f55fa32cec117628", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6d2634aec690163", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/passage/WatchScheduleCard.tsx:650"}, "properties": {"repobilityId": "63e3cdb84545147c", "scanner": "scanner-primary", "fingerprint": "d6d2634aec690163", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e5c65428a491a60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/crew-finder/CrewMatchesList.tsx:72"}, "properties": {"repobilityId": "e826ad5941f3927d", "scanner": "scanner-primary", "fingerprint": "6e5c65428a491a60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97cb37995be9ee44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/CastOffPanel.tsx:342"}, "properties": {"repobilityId": "b0c38d09da3f880b", "scanner": "scanner-primary", "fingerprint": "97cb37995be9ee44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e8173a89cb2b9e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EquipmentList.tsx:579"}, "properties": {"repobilityId": "a01d9ecfc0c74c86", "scanner": "scanner-primary", "fingerprint": "1e8173a89cb2b9e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6324b3ae865e70fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/NmeaPage.tsx:194"}, "properties": {"repobilityId": "85de06b58cc0fda9", "scanner": "scanner-primary", "fingerprint": "6324b3ae865e70fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb9978635af5021e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/AvNavPage.tsx:136"}, "properties": {"repobilityId": "1ebf5c89be7f7ca9", "scanner": "scanner-primary", "fingerprint": "bb9978635af5021e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-573dbed899de3e9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GalleyPage.tsx:230"}, "properties": {"repobilityId": "de90f4884533a554", "scanner": "scanner-primary", "fingerprint": "573dbed899de3e9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cd93eb34e658333", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/EncCellManager.tsx:144"}, "properties": {"repobilityId": "f10dacff1d7737b7", "scanner": "scanner-primary", "fingerprint": "3cd93eb34e658333", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a276aa5cb118f65", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/GpxImportPage.tsx:361"}, "properties": {"repobilityId": "244537f1d6775d61", "scanner": "scanner-primary", "fingerprint": "6a276aa5cb118f65", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a3d20ceb276053a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/inventory/SwipeableInventoryCard.tsx:76"}, "properties": {"repobilityId": "f75fa7a2209a33e8", "scanner": "scanner-primary", "fingerprint": "3a3d20ceb276053a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e240229c41b7a39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/checklists/SwipeableItemCard.tsx:150"}, "properties": {"repobilityId": "1a9c12d5f5326aef", "scanner": "scanner-primary", "fingerprint": "6e240229c41b7a39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51e44a3dca8fa419", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/equipment/SwipeableEquipmentCard.tsx:86"}, "properties": {"repobilityId": "fc3ba2e7f1ab7c89", "scanner": "scanner-primary", "fingerprint": "51e44a3dca8fa419", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d430c1d7c12c6e07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/maintenance/SwipeableTaskCard.tsx:105"}, "properties": {"repobilityId": "9e65e21d374a5f71", "scanner": "scanner-primary", "fingerprint": "d430c1d7c12c6e07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3badfde013837e46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/SwipeableDocCard.tsx:140"}, "properties": {"repobilityId": "8d9e75f8b2d308ad", "scanner": "scanner-primary", "fingerprint": "3badfde013837e46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af9cd98084d55b60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/vessel/documents/DocumentForm.tsx:125"}, "properties": {"repobilityId": "2d366ae15844aa78", "scanner": "scanner-primary", "fingerprint": "af9cd98084d55b60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fbac8b3a1b0930c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageBanner.tsx:245"}, "properties": {"repobilityId": "cbb95bea13151a83", "scanner": "scanner-primary", "fingerprint": "fbac8b3a1b0930c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-290263135de63d2c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/map/useAisStreamLayer.ts:766"}, "properties": {"repobilityId": "44133eee5d8c6cce", "scanner": "scanner-primary", "fingerprint": "290263135de63d2c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-48dde726984ebc27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/StormPicker.tsx:169"}, "properties": {"repobilityId": "27b7a25ee03420e4", "scanner": "scanner-primary", "fingerprint": "48dde726984ebc27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d158975d0b502b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/MapHubOverlays.tsx:94"}, "properties": {"repobilityId": "1fbdbe0f29b32d14", "scanner": "scanner-primary", "fingerprint": "8d158975d0b502b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b61178ec42e9b45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/RadialHelmMenu.tsx:869"}, "properties": {"repobilityId": "4c4f1da9b9e6ff9f", "scanner": "scanner-primary", "fingerprint": "6b61178ec42e9b45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b04764acebda275a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/EncRouteButton.tsx:82"}, "properties": {"repobilityId": "cb2cf1a59edc9f09", "scanner": "scanner-primary", "fingerprint": "b04764acebda275a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-841451d9ff5cfb6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/PassageDataPanel.tsx:136"}, "properties": {"repobilityId": "294b4429ff18775b", "scanner": "scanner-primary", "fingerprint": "841451d9ff5cfb6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e561effe3b2530a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/map/RouteTrackPicker.tsx:193"}, "properties": {"repobilityId": "719d9d23b4e7b549", "scanner": "scanner-primary", "fingerprint": "6e561effe3b2530a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e33be7f7fc9b86d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageLogTable.tsx:54"}, "properties": {"repobilityId": "34d0557f9294a400", "scanner": "scanner-primary", "fingerprint": "e33be7f7fc9b86d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c63434b29be14f4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/VoyageOverviewCard.tsx:53"}, "properties": {"repobilityId": "0aa30cceb989d4d3", "scanner": "scanner-primary", "fingerprint": "c63434b29be14f4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0edf9be95503f260", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/voyage-results/RouteNodeGrid.tsx:67"}, "properties": {"repobilityId": "5089e94c74ce9129", "scanner": "scanner-primary", "fingerprint": "0edf9be95503f260", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc0c745c517073e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/music/GlobalNowPlayingBar.tsx:269"}, "properties": {"repobilityId": "678dab9e69fbea9b", "scanner": "scanner-primary", "fingerprint": "dc0c745c517073e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0eff475c90d3869", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/music/MusicPage.tsx:792"}, "properties": {"repobilityId": "27ab5e253cf70781", "scanner": "scanner-primary", "fingerprint": "c0eff475c90d3869", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0832a143e6ed1119", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/scheduler.ts:78"}, "properties": {"repobilityId": "e209938bb3daf049", "scanner": "scanner-primary", "fingerprint": "0832a143e6ed1119", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70518a76e25cca67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/server.ts:132"}, "properties": {"repobilityId": "8bd6f88013f15755", "scanner": "scanner-primary", "fingerprint": "70518a76e25cca67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be4f562e45a9cf9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/encWatcher.ts:63"}, "properties": {"repobilityId": "a7adc96f9d0fa016", "scanner": "scanner-primary", "fingerprint": "be4f562e45a9cf9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9ed6b37c4660f29", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/proxy.ts:367"}, "properties": {"repobilityId": "f133762555462e9c", "scanner": "scanner-primary", "fingerprint": "f9ed6b37c4660f29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3b301521703a1971", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pi-cache/src/routes/charts.ts:381"}, "properties": {"repobilityId": "56bef2d436418139", "scanner": "scanner-primary", "fingerprint": "3b301521703a1971", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7675dfc9faf5f32", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 pi-cache/src/routes/enc.ts:489"}, "properties": {"repobilityId": "a75334242a660436", "scanner": "scanner-primary", "fingerprint": "c7675dfc9faf5f32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-769fdbd0c7cf249b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/index.ts:67"}, "properties": {"repobilityId": "8a3d745acd3e7357", "scanner": "scanner-primary", "fingerprint": "769fdbd0c7cf249b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-facd2398f3232830", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/watchdog.ts:40"}, "properties": {"repobilityId": "43dcc6982d04260a", "scanner": "scanner-primary", "fingerprint": "facd2398f3232830", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4fd31d6070c38959", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workers/ais-ingest/db.ts:35"}, "properties": {"repobilityId": "02cc527f95d466af", "scanner": "scanner-primary", "fingerprint": "4fd31d6070c38959", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-93632b0382c8e0ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 pages/log/LogSubComponents.tsx:473"}, "properties": {"repobilityId": "7f34dd4ce2dc347d", "scanner": "scanner-primary", "fingerprint": "93632b0382c8e0ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a72e354a4577bc2c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/import-csv.ts:240"}, "properties": {"repobilityId": "ec10007a88536191", "scanner": "scanner-primary", "fingerprint": "a72e354a4577bc2c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2276892dd36b7bf8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/index.ts:38"}, "properties": {"repobilityId": "161ecaf0108b9fba", "scanner": "scanner-primary", "fingerprint": "2276892dd36b7bf8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5645adc654096018", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/supabase.ts:143"}, "properties": {"repobilityId": "3c1d060001b35c4c", "scanner": "scanner-primary", "fingerprint": "5645adc654096018", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-24de502133e865b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/ItuMarsScraper.ts:26"}, "properties": {"repobilityId": "95d4ef6bc44bc62d", "scanner": "scanner-primary", "fingerprint": "24de502133e865b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fcf509e4026db23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/UscgScraper.ts:34"}, "properties": {"repobilityId": "eb3d2f78fedfd05b", "scanner": "scanner-primary", "fingerprint": "2fcf509e4026db23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ad72566402aeb37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AisSeedScraper.ts:331"}, "properties": {"repobilityId": "28dbb9c591fc1b35", "scanner": "scanner-primary", "fingerprint": "9ad72566402aeb37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6cd410cca537fb47", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:41"}, "properties": {"repobilityId": "10c92b56f56f5177", "scanner": "scanner-primary", "fingerprint": "6cd410cca537fb47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84934636dca33a4e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:39"}, "properties": {"repobilityId": "0b439be61c49f36b", "scanner": "scanner-primary", "fingerprint": "84934636dca33a4e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ffb1a87eaa61f19", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 stories/AuthBanner.stories.tsx:27"}, "properties": {"repobilityId": "4fd5491d42d0c48c", "scanner": "scanner-primary", "fingerprint": "3ffb1a87eaa61f19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9f16d10390f9d892", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 stories/ToastNotification.stories.tsx:35"}, "properties": {"repobilityId": "fc563cc992b3e834", "scanner": "scanner-primary", "fingerprint": "9f16d10390f9d892", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0325f16eb24e6961", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/index.ts:49"}, "properties": {"repobilityId": "760e4a9a85c1cdce", "scanner": "scanner-primary", "fingerprint": "0325f16eb24e6961", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca5599c4b5877e78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/supabase.ts:124"}, "properties": {"repobilityId": "9ec3b3a173745eb5", "scanner": "scanner-primary", "fingerprint": "ca5599c4b5877e78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e39c5052be29ad12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/ItuMarsScraper.ts:16"}, "properties": {"repobilityId": "a1c0075fbbc3cd56", "scanner": "scanner-primary", "fingerprint": "e39c5052be29ad12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67e04b34504122ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/UscgScraper.ts:14"}, "properties": {"repobilityId": "6b7e68bcff80099e", "scanner": "scanner-primary", "fingerprint": "67e04b34504122ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f339136bc861e13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AisSeedScraper.ts:315"}, "properties": {"repobilityId": "df6358b363e0b9b6", "scanner": "scanner-primary", "fingerprint": "3f339136bc861e13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6904caad951533c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.ts:30"}, "properties": {"repobilityId": "394c81e334b0aedb", "scanner": "scanner-primary", "fingerprint": "b6904caad951533c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb6cedc1b9a3b98b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:29"}, "properties": {"repobilityId": "5aa979a3fb26a64f", "scanner": "scanner-primary", "fingerprint": "bb6cedc1b9a3b98b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95cff04171a1b6e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sweep-stale-vessels/index.ts:39"}, "properties": {"repobilityId": "f90e36d696d0045b", "scanner": "scanner-primary", "fingerprint": "95cff04171a1b6e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00d8e0bed1ab4a34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/anthropic-proxy/index.ts:67"}, "properties": {"repobilityId": "e09b9eeb93032f65", "scanner": "scanner-primary", "fingerprint": "00d8e0bed1ab4a34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e3b7db51e188962", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-token/index.ts:133"}, "properties": {"repobilityId": "7ec5b805b98526ab", "scanner": "scanner-primary", "fingerprint": "5e3b7db51e188962", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6984433408b5b0b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/deepgram-ws-proxy/index.ts:69"}, "properties": {"repobilityId": "d370e1b4cb7c41c6", "scanner": "scanner-primary", "fingerprint": "6984433408b5b0b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-380f206bdc7b25c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/proxy-bosun-fallback/index.ts:257"}, "properties": {"repobilityId": "a77049ec6df9c757", "scanner": "scanner-primary", "fingerprint": "380f206bdc7b25c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7cc66ccc111c48e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:325"}, "properties": {"repobilityId": "deff015bd94f7b00", "scanner": "scanner-primary", "fingerprint": "b7cc66ccc111c48e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-87303ac74a6f4550", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/maritime-intel/index.ts:115"}, "properties": {"repobilityId": "87b7e0f19fd32814", "scanner": "scanner-primary", "fingerprint": "87303ac74a6f4550", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-261e505f0a1325c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-weather-alerts/index.ts:362"}, "properties": {"repobilityId": "8956e1d1560b8d2b", "scanner": "scanner-primary", "fingerprint": "261e505f0a1325c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52f5a872a6aa7646", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/lookup-vessel/index.ts:287"}, "properties": {"repobilityId": "cc16659e4be946ab", "scanner": "scanner-primary", "fingerprint": "52f5a872a6aa7646", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31521aedd3b4a2d9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 services/ProfilePhotoService.ts:157"}, "properties": {"repobilityId": "c103891ec97b2b6b", "scanner": "scanner-primary", "fingerprint": "31521aedd3b4a2d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-09f2e647aae4032e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/voice/speechRecognizer.ts:80"}, "properties": {"repobilityId": "45ae334dc40962f5", "scanner": "scanner-primary", "fingerprint": "09f2e647aae4032e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6f4f1dd17f43f2d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/voice/deepgramRecognizer.ts:168"}, "properties": {"repobilityId": "5e2f9b0ad6557f5d", "scanner": "scanner-primary", "fingerprint": "a6f4f1dd17f43f2d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4c14ed90dd239c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/routeTest.ts:110"}, "properties": {"repobilityId": "aa5a39536be1743c", "scanner": "scanner-primary", "fingerprint": "a4c14ed90dd239c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4c40be7304d0fd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/cli.ts:67"}, "properties": {"repobilityId": "d3634337bc82cafe", "scanner": "scanner-primary", "fingerprint": "d4c40be7304d0fd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2df393d13c7dc78a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/scan.ts:146"}, "properties": {"repobilityId": "5b7c2038c35387f5", "scanner": "scanner-primary", "fingerprint": "2df393d13c7dc78a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f6d04e1c16ee69b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/decryptBatch.ts:136"}, "properties": {"repobilityId": "43a71825ce9450db", "scanner": "scanner-primary", "fingerprint": "9f6d04e1c16ee69b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c287f51b134fea9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/senc-extractor/src/extract.ts:18"}, "properties": {"repobilityId": "4700eb941803845c", "scanner": "scanner-primary", "fingerprint": "c287f51b134fea9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cd15e580196c05f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TopNav.tsx:28"}, "properties": {"repobilityId": "65aea35197b23f4f", "scanner": "scanner-primary", "fingerprint": "3cd15e580196c05f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b59bb3e8a2ebbf38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MapContainer.tsx:312"}, "properties": {"repobilityId": "a9a1fdcc2e7b5000", "scanner": "scanner-primary", "fingerprint": "b59bb3e8a2ebbf38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8c3700e1d33406b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/DiarySidebar.tsx:95"}, "properties": {"repobilityId": "19164ede183aa5d0", "scanner": "scanner-primary", "fingerprint": "f8c3700e1d33406b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b470b5fe4a28b021", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "b470b5fe4a28b021", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0dfcac2b7e01d59f", "level": "warning", "message": {"text": "Privileged port 15 in use"}, "properties": {"repobilityId": "3340f9a170f285cd", "scanner": "scanner-primary", "fingerprint": "0dfcac2b7e01d59f", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7fbfc8068afc6bf", "level": "warning", "message": {"text": "Privileged port 17 in use"}, "properties": {"repobilityId": "0bf38fb8f89ec589", "scanner": "scanner-primary", "fingerprint": "e7fbfc8068afc6bf", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mpa-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b00d3414ca42be66", "level": "warning", "message": {"text": "Dockerfile runs as root: workers/ais-ingest/Dockerfile"}, "properties": {"repobilityId": "ad7cd1fa525f6cac", "scanner": "scanner-primary", "fingerprint": "b00d3414ca42be66", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c712468f74331236", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "5c74d0f4cddf5105", "scanner": "scanner-primary", "fingerprint": "c712468f74331236", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "workers/ais-ingest/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-534629d955b67b22", "level": "warning", "message": {"text": "Dockerfile runs as root: vessel-scraper/Dockerfile"}, "properties": {"repobilityId": "725b6af40e60d2f6", "scanner": "scanner-primary", "fingerprint": "534629d955b67b22", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c94eeec6f63ec66c", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "5720038369375af5", "scanner": "scanner-primary", "fingerprint": "c94eeec6f63ec66c", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vessel-scraper/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-119ad587100b2b66", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in vite.config.ts:202"}, "properties": {"repobilityId": "aa73adf493d38401", "scanner": "scanner-primary", "fingerprint": "119ad587100b2b66", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vite.config.ts"}, "region": {"startLine": 202}}}]}, {"ruleId": "scanner-e599fc6e5f06f904", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in scripts/mock-signalk-server.cjs:110"}, "properties": {"repobilityId": "e90940a9daba66f8", "scanner": "scanner-primary", "fingerprint": "e599fc6e5f06f904", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/mock-signalk-server.cjs"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-18d74941193fcd42", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in components/ChatPage.tsx:754"}, "properties": {"repobilityId": "cfc131ed30781fd6", "scanner": "scanner-primary", "fingerprint": "18d74941193fcd42", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ChatPage.tsx"}, "region": {"startLine": 754}}}]}, {"ruleId": "scanner-54f440577198ea5c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useCycloneLayer.ts:2003"}, "properties": {"repobilityId": "6903cdff9e371186", "scanner": "scanner-primary", "fingerprint": "54f440577198ea5c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/map/useCycloneLayer.ts"}, "region": {"startLine": 2003}}}]}, {"ruleId": "scanner-5ceb6086214e5b51", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useAisStreamLayer.ts:764"}, "properties": {"repobilityId": "8ad5c1b3f5e18b6f", "scanner": "scanner-primary", "fingerprint": "5ceb6086214e5b51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/map/useAisStreamLayer.ts"}, "region": {"startLine": 764}}}]}, {"ruleId": "scanner-52404638070fdbfd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useDestinationFlag.ts:87"}, "properties": {"repobilityId": "5d6cc03ed960ac58", "scanner": "scanner-primary", "fingerprint": "52404638070fdbfd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/map/useDestinationFlag.ts"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-ed58653fc5c1dbe9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/map/useVesselTracker.ts:74"}, "properties": {"repobilityId": "717adfe17fd7dbe3", "scanner": "scanner-primary", "fingerprint": "ed58653fc5c1dbe9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/map/useVesselTracker.ts"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-1e17667cef15096d", "level": "error", "message": {"text": "Possible secret in pi-cache/setup-opencpn.sh"}, "properties": {"repobilityId": "47c107e31b4156fc", "scanner": "scanner-primary", "fingerprint": "1e17667cef15096d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-cache/setup-opencpn.sh"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-1befa76380c13923", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in pi-cache/src/server.ts:48"}, "properties": {"repobilityId": "92ac9f75f2548ec1", "scanner": "scanner-primary", "fingerprint": "1befa76380c13923", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-cache/src/server.ts"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-fac10ed565bd7823", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in pi-cache/src/encWatcher.ts:38"}, "properties": {"repobilityId": "0cd8c82d4bd7ab68", "scanner": "scanner-primary", "fingerprint": "fac10ed565bd7823", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-cache/src/encWatcher.ts"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-e1fcf6542270a3bb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in pi-cache/src/routes/enc.ts:51"}, "properties": {"repobilityId": "d88c82b62d17c791", "scanner": "scanner-primary", "fingerprint": "e1fcf6542270a3bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-cache/src/routes/enc.ts"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-a946ef83c38b6abf", "level": "error", "message": {"text": "Possible secret in bosun-pi/bosun_network_apply.py"}, "properties": {"repobilityId": "cebf305576bad74a", "scanner": "scanner-primary", "fingerprint": "a946ef83c38b6abf", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bosun-pi/bosun_network_apply.py"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-4358d338be90818f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/elevenlabs-tts/index.ts:34"}, "properties": {"repobilityId": "1cf1905bac6aa8df", "scanner": "scanner-primary", "fingerprint": "4358d338be90818f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/elevenlabs-tts/index.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-4f5d529eb0529656", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/scrape-vessel-metadata/index.ts:32"}, "properties": {"repobilityId": "f64e65755dd6b98c", "scanner": "scanner-primary", "fingerprint": "4f5d529eb0529656", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/scrape-vessel-metadata/index.ts"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-c2a55452eeb5532f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-himawari-ir/index.ts:22"}, "properties": {"repobilityId": "a9d951acdb4c5770", "scanner": "scanner-primary", "fingerprint": "c2a55452eeb5532f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-himawari-ir/index.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-b9e98a2ffe73ff9e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-marketplace-payment/index.ts:20"}, "properties": {"repobilityId": "36ce10752bdf2a0c", "scanner": "scanner-primary", "fingerprint": "b9e98a2ffe73ff9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/create-marketplace-payment/index.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-b41b7ac7e28e9f38", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-ukho-msi/index.ts:27"}, "properties": {"repobilityId": "58b59b1ef949cb9a", "scanner": "scanner-primary", "fingerprint": "b41b7ac7e28e9f38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-ukho-msi/index.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-9bcbb97c39e31b5f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-stale-vessels/index.ts:10"}, "properties": {"repobilityId": "dbb1661d96605132", "scanner": "scanner-primary", "fingerprint": "9bcbb97c39e31b5f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/sweep-stale-vessels/index.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-7bbed9baaff86da0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-user/index.ts:19"}, "properties": {"repobilityId": "7dafd07ffd6e0793", "scanner": "scanner-primary", "fingerprint": "7bbed9baaff86da0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/lookup-user/index.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-1dfeb068b06afa62", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-precip-grid/index.ts:24"}, "properties": {"repobilityId": "a8296c1a5c1a1754", "scanner": "scanner-primary", "fingerprint": "1dfeb068b06afa62", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-precip-grid/index.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-1b25b8b3ddb2ef2b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-openmeteo/index.ts:22"}, "properties": {"repobilityId": "468ac864c734d9c2", "scanner": "scanner-primary", "fingerprint": "1b25b8b3ddb2ef2b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-openmeteo/index.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-033f36fad659d2b7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/anthropic-proxy/index.ts:30"}, "properties": {"repobilityId": "1ce5faae2806222d", "scanner": "scanner-primary", "fingerprint": "033f36fad659d2b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/anthropic-proxy/index.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-a55c4d915fa8a066", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/deepgram-token/index.ts:41"}, "properties": {"repobilityId": "577f10fc7af5e378", "scanner": "scanner-primary", "fingerprint": "a55c4d915fa8a066", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/deepgram-token/index.ts"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-3d076ec2e8531b13", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/vessels-nearby/index.ts:18"}, "properties": {"repobilityId": "b0390f372afab5a6", "scanner": "scanner-primary", "fingerprint": "3d076ec2e8531b13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/vessels-nearby/index.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-84b17c3b3214923d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-gemini/index.ts:29"}, "properties": {"repobilityId": "4670945f64b28c04", "scanner": "scanner-primary", "fingerprint": "84b17c3b3214923d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-gemini/index.ts"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-50376a31a4a0efab", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/musickit-token/index.ts:42"}, "properties": {"repobilityId": "f3b005f2c90b6dd9", "scanner": "scanner-primary", "fingerprint": "50376a31a4a0efab", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/musickit-token/index.ts"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-3437d54b76c3dbb7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-gfs-tracker/index.ts:19"}, "properties": {"repobilityId": "813e3fe502e2fc38", "scanner": "scanner-primary", "fingerprint": "3437d54b76c3dbb7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-gfs-tracker/index.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-61c3ffb830a6d96f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-velocity/index.ts:24"}, "properties": {"repobilityId": "23f8d6c8cf4a5ead", "scanner": "scanner-primary", "fingerprint": "61c3ffb830a6d96f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-wind-velocity/index.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-74a63d4014945a0e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-amsa-msi/index.ts:38"}, "properties": {"repobilityId": "91c76cbd3ddc69b7", "scanner": "scanner-primary", "fingerprint": "74a63d4014945a0e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-amsa-msi/index.ts"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-bb8d23fb8112163a", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-anchor-alarm/index.ts:30"}, "properties": {"repobilityId": "7f431b6b8de0274a", "scanner": "scanner-primary", "fingerprint": "bb8d23fb8112163a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-anchor-alarm/index.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-007b6bc872ac240e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gemini-diary/index.ts:25"}, "properties": {"repobilityId": "343de9c85e01a10a", "scanner": "scanner-primary", "fingerprint": "007b6bc872ac240e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/gemini-diary/index.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-2c02af9290506cfa", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-tides/index.ts:25"}, "properties": {"repobilityId": "6f02ef528227d776", "scanner": "scanner-primary", "fingerprint": "2c02af9290506cfa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-tides/index.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-a313670ac187319a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/voyage-log/index.ts:40"}, "properties": {"repobilityId": "f64aea757e041d21", "scanner": "scanner-primary", "fingerprint": "a313670ac187319a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/voyage-log/index.ts"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-babbe3f5f4314d3c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-linz-msi/index.ts:37"}, "properties": {"repobilityId": "e30d446758f21aca", "scanner": "scanner-primary", "fingerprint": "babbe3f5f4314d3c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-linz-msi/index.ts"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-46d3951ce40b1b5a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-bosun-fallback/index.ts:30"}, "properties": {"repobilityId": "3d5e1bb2ca2cc37c", "scanner": "scanner-primary", "fingerprint": "46d3951ce40b1b5a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-bosun-fallback/index.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-64baa58d2176a059", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/fetch-weatherkit/index.ts:56"}, "properties": {"repobilityId": "d061bccefd601239", "scanner": "scanner-primary", "fingerprint": "64baa58d2176a059", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-weatherkit/index.ts"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-02983a7c0b70fd78", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-weatherkit/index.ts:30"}, "properties": {"repobilityId": "f67e367e2c76e72b", "scanner": "scanner-primary", "fingerprint": "02983a7c0b70fd78", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-weatherkit/index.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-e0d228f5e5ff2e9f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-wind-grid/index.ts:26"}, "properties": {"repobilityId": "397cfe1d4651f563", "scanner": "scanner-primary", "fingerprint": "e0d228f5e5ff2e9f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-wind-grid/index.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-076a69b8de365759", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sweep-expired-escrows/index.ts:15"}, "properties": {"repobilityId": "4f36204febeedb43", "scanner": "scanner-primary", "fingerprint": "076a69b8de365759", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/sweep-expired-escrows/index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-23a0d0e8cbc5ffc5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/route-weather/index.ts:32"}, "properties": {"repobilityId": "9f3c427e88cb4bcc", "scanner": "scanner-primary", "fingerprint": "23a0d0e8cbc5ffc5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/route-weather/index.ts"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-38fc13730770c540", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/capture-escrow-payment/index.ts:16"}, "properties": {"repobilityId": "fa7e2d7c43941f54", "scanner": "scanner-primary", "fingerprint": "38fc13730770c540", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/capture-escrow-payment/index.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-b32d4c9f784e93d1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-rainbow/index.ts:26"}, "properties": {"repobilityId": "af45664581be246d", "scanner": "scanner-primary", "fingerprint": "b32d4c9f784e93d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-rainbow/index.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-d12d727c59f6899b", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/send-push/index.ts:64"}, "properties": {"repobilityId": "e4bc588f3073535c", "scanner": "scanner-primary", "fingerprint": "d12d727c59f6899b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-push/index.ts"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-ee62dd013eb6c7a5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/maritime-intel/index.ts:11"}, "properties": {"repobilityId": "5f06db508fe8d2ad", "scanner": "scanner-primary", "fingerprint": "ee62dd013eb6c7a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/maritime-intel/index.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-6d620fdbfad6392e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gebco-depth/index.ts:23"}, "properties": {"repobilityId": "10165d7c1dad3739", "scanner": "scanner-primary", "fingerprint": "6d620fdbfad6392e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/gebco-depth/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-c0aa8e60440ae090", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-stormglass/index.ts:23"}, "properties": {"repobilityId": "03b7af5f31d218e8", "scanner": "scanner-primary", "fingerprint": "c0aa8e60440ae090", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-stormglass/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-5433c366ab023d76", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in supabase/functions/get-weather/index.ts:158"}, "properties": {"repobilityId": "c141ab9087c2d2e7", "scanner": "scanner-primary", "fingerprint": "5433c366ab023d76", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/get-weather/index.ts"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-e9bdb643eedb4aca", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/get-weather/index.ts:34"}, "properties": {"repobilityId": "8535e8571b4e6613", "scanner": "scanner-primary", "fingerprint": "e9bdb643eedb4aca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/get-weather/index.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-ecee668483ffced3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fetch-pressure-grid/index.ts:16"}, "properties": {"repobilityId": "82e3dd24ca65c5ee", "scanner": "scanner-primary", "fingerprint": "ecee668483ffced3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fetch-pressure-grid/index.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-8d38fb8e07ec9028", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/satellite-tile/index.ts:26"}, "properties": {"repobilityId": "b836f41a4300a550", "scanner": "scanner-primary", "fingerprint": "8d38fb8e07ec9028", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/satellite-tile/index.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-16abcdf914d8bad5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/route-bathymetric/index.ts:25"}, "properties": {"repobilityId": "397d239010a2b20c", "scanner": "scanner-primary", "fingerprint": "16abcdf914d8bad5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/route-bathymetric/index.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-8965fb06d29f83ab", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/lookup-vessel/index.ts:22"}, "properties": {"repobilityId": "2922c4626a4a20c4", "scanner": "scanner-primary", "fingerprint": "8965fb06d29f83ab", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/lookup-vessel/index.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-fe55830697aebd27", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/proxy-overpass/index.ts:23"}, "properties": {"repobilityId": "7ff4a5c6e252fc9c", "scanner": "scanner-primary", "fingerprint": "fe55830697aebd27", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/proxy-overpass/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-2aa324654fff0d14", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in services/AvNavDiscoveryService.ts:110"}, "properties": {"repobilityId": "6854fa0ec27d167f", "scanner": "scanner-primary", "fingerprint": "2aa324654fff0d14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/AvNavDiscoveryService.ts"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-2e0eef07735fc33c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in tools/senc-extractor/src/oexserverd.ts:1"}, "properties": {"repobilityId": "a001e216cf7253a0", "scanner": "scanner-primary", "fingerprint": "2e0eef07735fc33c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/senc-extractor/src/oexserverd.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bac54824175ba1e8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in public/voyage-log-api.html:167"}, "properties": {"repobilityId": "7712562ee3901b14", "scanner": "scanner-primary", "fingerprint": "bac54824175ba1e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/voyage-log-api.html"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-e2df6200eed8f8dd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ee5ae7a205e4d14a", "scanner": "scanner-primary", "fingerprint": "e2df6200eed8f8dd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-currents-pipeline.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-e2df6200eed8f8dd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c2bb69849b8055dc", "scanner": "scanner-primary", "fingerprint": "e2df6200eed8f8dd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-currents-pipeline.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-e2df6200eed8f8dd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c7ad33a0eb7c62b5", "scanner": "scanner-primary", "fingerprint": "e2df6200eed8f8dd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-currents-pipeline.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-deddfe459837e93a", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "d309fb4800431d5c", "scanner": "scanner-primary", "fingerprint": "deddfe459837e93a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-currents-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8860eac61a1ebe26", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "549a2de1ac0c3fa9", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a4f0ab9334543546", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a5721e15e3a54aa2", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-a118ec7c6c1fc31c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "73df8c54e219a112", "scanner": "scanner-primary", "fingerprint": "a118ec7c6c1fc31c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/linz-msi-scrape.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-a118ec7c6c1fc31c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b30023e73ed005a2", "scanner": "scanner-primary", "fingerprint": "a118ec7c6c1fc31c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/linz-msi-scrape.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-a118ec7c6c1fc31c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ca5cf1d0a16e5dbc", "scanner": "scanner-primary", "fingerprint": "a118ec7c6c1fc31c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/linz-msi-scrape.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-d3853a15a967f2c4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ed48383fe2086dc0", "scanner": "scanner-primary", "fingerprint": "d3853a15a967f2c4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-mld-pipeline.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-d3853a15a967f2c4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc09a7a48f418b9c", "scanner": "scanner-primary", "fingerprint": "d3853a15a967f2c4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-mld-pipeline.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-d3853a15a967f2c4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "35245e8be360db4f", "scanner": "scanner-primary", "fingerprint": "d3853a15a967f2c4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-mld-pipeline.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-84576ea3587b14a5", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "fdaa1f600e8b6516", "scanner": "scanner-primary", "fingerprint": "84576ea3587b14a5", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-mld-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5d28275bab3168ad", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8c9fd29ec8fd50a9", "scanner": "scanner-primary", "fingerprint": "5d28275bab3168ad", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-seaice-pipeline.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-5d28275bab3168ad", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "36d1f4c0c4717877", "scanner": "scanner-primary", "fingerprint": "5d28275bab3168ad", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-seaice-pipeline.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-5d28275bab3168ad", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "499a989049b1bf91", "scanner": "scanner-primary", "fingerprint": "5d28275bab3168ad", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-seaice-pipeline.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-f27ccc10db930424", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "7efdbc4471a227d1", "scanner": "scanner-primary", "fingerprint": "f27ccc10db930424", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-seaice-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70cec907b7e0ca4d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "916d61f871be38f2", "scanner": "scanner-primary", "fingerprint": "70cec907b7e0ca4d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview-smoke.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-70cec907b7e0ca4d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ac894270d5c09d25", "scanner": "scanner-primary", "fingerprint": "70cec907b7e0ca4d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/preview-smoke.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 25}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "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": 78}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "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": 88}}}]}, {"ruleId": "scanner-1dd0ab95eeed0274", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3ec3fe042d61ecdc", "scanner": "scanner-primary", "fingerprint": "1dd0ab95eeed0274", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-1dd0ab95eeed0274", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e5d073a7d394379", "scanner": "scanner-primary", "fingerprint": "1dd0ab95eeed0274", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-1dd0ab95eeed0274", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8ddeb486e6c863a8", "scanner": "scanner-primary", "fingerprint": "1dd0ab95eeed0274", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-d2075c37f720bb5b", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "96a9beb1036efbc2", "scanner": "scanner-primary", "fingerprint": "d2075c37f720bb5b", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-sst-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c0840d07864313e3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "40147a52cdfcf13f", "scanner": "scanner-primary", "fingerprint": "c0840d07864313e3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/lighthouse.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-c0840d07864313e3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "173c45528b0077b5", "scanner": "scanner-primary", "fingerprint": "c0840d07864313e3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/lighthouse.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-c0840d07864313e3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "70ebbd96cb94cd0f", "scanner": "scanner-primary", "fingerprint": "c0840d07864313e3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/lighthouse.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-ebe12be0a8dd6120", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "72ff7801f7403ca7", "scanner": "scanner-primary", "fingerprint": "ebe12be0a8dd6120", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-waves-pipeline.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-ebe12be0a8dd6120", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e5289e39bdde8a4d", "scanner": "scanner-primary", "fingerprint": "ebe12be0a8dd6120", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-waves-pipeline.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-ebe12be0a8dd6120", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b958391e97a75565", "scanner": "scanner-primary", "fingerprint": "ebe12be0a8dd6120", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-waves-pipeline.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-ce970c4d354ec48f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "eebaf0e83996a458", "scanner": "scanner-primary", "fingerprint": "ce970c4d354ec48f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-waves-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f029227ace523bc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4af541c768463168", "scanner": "scanner-primary", "fingerprint": "6f029227ace523bc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mpa-pipeline.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6f029227ace523bc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4bce05c6c63a2504", "scanner": "scanner-primary", "fingerprint": "6f029227ace523bc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mpa-pipeline.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-6f029227ace523bc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c17af26ddb167be", "scanner": "scanner-primary", "fingerprint": "6f029227ace523bc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mpa-pipeline.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-2bd5769827885cf6", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "545d2279db236173", "scanner": "scanner-primary", "fingerprint": "2bd5769827885cf6", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mpa-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed1c2f218170bd91", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e55599bccb02cb56", "scanner": "scanner-primary", "fingerprint": "ed1c2f218170bd91", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-chl-pipeline.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-ed1c2f218170bd91", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d4e3e381b8633efd", "scanner": "scanner-primary", "fingerprint": "ed1c2f218170bd91", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-chl-pipeline.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-ed1c2f218170bd91", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0f5b419d718c894b", "scanner": "scanner-primary", "fingerprint": "ed1c2f218170bd91", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-chl-pipeline.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-1c172ef918b5b7eb", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "178047fdc05c4b1b", "scanner": "scanner-primary", "fingerprint": "1c172ef918b5b7eb", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cmems-chl-pipeline.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-49582109aa92d933", "level": "note", "message": {"text": "Very large file: App.tsx (1126 lines)"}, "properties": {"repobilityId": "a4e8f86e5d6e531f", "scanner": "scanner-primary", "fingerprint": "49582109aa92d933", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4f1b26467333adf5", "level": "note", "message": {"text": "Very large file: scripts/build_nav_graph.py (1383 lines)"}, "properties": {"repobilityId": "20bec5d861daf8ae", "scanner": "scanner-primary", "fingerprint": "4f1b26467333adf5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-14c48be18b399728", "level": "note", "message": {"text": "Very large file: utils/logExportPdf.ts (1403 lines)"}, "properties": {"repobilityId": "c61116950217328f", "scanner": "scanner-primary", "fingerprint": "14c48be18b399728", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f76de1e5a13594e1", "level": "note", "message": {"text": "Very large file: components/VesselHub.tsx (2127 lines)"}, "properties": {"repobilityId": "489c12c9a468b108", "scanner": "scanner-primary", "fingerprint": "f76de1e5a13594e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c25dbd23f8f20e16", "level": "note", "message": {"text": "Very large file: components/CrewManagement.tsx (1402 lines)"}, "properties": {"repobilityId": "6721e190d18bc481", "scanner": "scanner-primary", "fingerprint": "c25dbd23f8f20e16", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e1b87fc9596b08c3", "level": "note", "message": {"text": "Very large file: components/SettingsModal.tsx (1025 lines)"}, "properties": {"repobilityId": "acb36c863488ed3f", "scanner": "scanner-primary", "fingerprint": "e1b87fc9596b08c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-997bf3ce7cb83fce", "level": "note", "message": {"text": "Very large file: components/Dashboard.tsx (1057 lines)"}, "properties": {"repobilityId": "20cf55b51ba0f3d9", "scanner": "scanner-primary", "fingerprint": "997bf3ce7cb83fce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-07c1011c90d348cf", "level": "note", "message": {"text": "Very large file: components/TrackMapViewer.tsx (1037 lines)"}, "properties": {"repobilityId": "40c7fc04f1a54dff", "scanner": "scanner-primary", "fingerprint": "07c1011c90d348cf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7ce1b432569bffb0", "level": "note", "message": {"text": "Very large file: components/AnchorWatchPage.tsx (1302 lines)"}, "properties": {"repobilityId": "42f20f4f53cd2aef", "scanner": "scanner-primary", "fingerprint": "7ce1b432569bffb0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a7c7ebc37e99f807", "level": "note", "message": {"text": "Very large file: components/dashboard/HeroSlide.tsx (1310 lines)"}, "properties": {"repobilityId": "e949f26fb1b10a2f", "scanner": "scanner-primary", "fingerprint": "a7c7ebc37e99f807", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5ac8808ea4d5bfe9", "level": "note", "message": {"text": "Very large file: components/chat/CaptainsTable.tsx (1107 lines)"}, "properties": {"repobilityId": "69375f3a656e41f1", "scanner": "scanner-primary", "fingerprint": "5ac8808ea4d5bfe9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-04c0f7c6c84cb6f8", "level": "note", "message": {"text": "Very large file: components/chat/MealCalendar.tsx (1045 lines)"}, "properties": {"repobilityId": "b33430917243a63c", "scanner": "scanner-primary", "fingerprint": "04c0f7c6c84cb6f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1db11c8538e2c583", "level": "note", "message": {"text": "Very large file: components/voice/BosunConsole.tsx (1784 lines)"}, "properties": {"repobilityId": "2666cc9a1c1e32bf", "scanner": "scanner-primary", "fingerprint": "1db11c8538e2c583", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ee4caf30db551430", "level": "note", "message": {"text": "Very large file: components/vessel/AvNavPage.tsx (1422 lines)"}, "properties": {"repobilityId": "b5950920d5eab606", "scanner": "scanner-primary", "fingerprint": "ee4caf30db551430", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0a34a2aa775241c4", "level": "note", "message": {"text": "Very large file: components/map/useCycloneLayer.ts (2181 lines)"}, "properties": {"repobilityId": "6f8a92a0e54e4c43", "scanner": "scanner-primary", "fingerprint": "0a34a2aa775241c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-faa3c3dc738ce5be", "level": "note", "message": {"text": "Very large file: components/map/usePassagePlanner.ts (2161 lines)"}, "properties": {"repobilityId": "5a1bd3bd5eaa46a0", "scanner": "scanner-primary", "fingerprint": "faa3c3dc738ce5be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ae019acf17f18cd6", "level": "note", "message": {"text": "Very large file: components/map/CurrentParticleLayer.ts (1119 lines)"}, "properties": {"repobilityId": "83c169ad83720852", "scanner": "scanner-primary", "fingerprint": "ae019acf17f18cd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-afaf491b0c78cee4", "level": "note", "message": {"text": "Very large file: components/map/useWeatherLayers.ts (1939 lines)"}, "properties": {"repobilityId": "8491cdaf001502a1", "scanner": "scanner-primary", "fingerprint": "afaf491b0c78cee4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e820b7f063bb5e57", "level": "note", "message": {"text": "Very large file: components/map/MapHubOverlays.tsx (1657 lines)"}, "properties": {"repobilityId": "61bee194c1545744", "scanner": "scanner-primary", "fingerprint": "e820b7f063bb5e57", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-87ee6f34d50ba249", "level": "note", "message": {"text": "Very large file: components/map/RadialHelmMenu.tsx (1257 lines)"}, "properties": {"repobilityId": "fc3e9d664d455088", "scanner": "scanner-primary", "fingerprint": "87ee6f34d50ba249", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2081009873b36c68", "level": "note", "message": {"text": "Very large file: components/map/WaveParticleLayer.ts (1111 lines)"}, "properties": {"repobilityId": "5c91975f65b89dc5", "scanner": "scanner-primary", "fingerprint": "2081009873b36c68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ad3edbaf77b06bf", "level": "note", "message": {"text": "Very large file: components/map/EncVectorLayer.ts (1352 lines)"}, "properties": {"repobilityId": "b1edaf11180701db", "scanner": "scanner-primary", "fingerprint": "4ad3edbaf77b06bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-17af8782595868f5", "level": "note", "message": {"text": "Very large file: components/map/WindParticleLayer.ts (1368 lines)"}, "properties": {"repobilityId": "c351d69e7f4cce0a", "scanner": "scanner-primary", "fingerprint": "17af8782595868f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c299f63930ddc8f6", "level": "note", "message": {"text": "Very large file: components/map/MapHub.tsx (2839 lines)"}, "properties": {"repobilityId": "6a70adc4fd138e99", "scanner": "scanner-primary", "fingerprint": "c299f63930ddc8f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-95099ddb943b14cb", "level": "note", "message": {"text": "Very large file: components/map/useMapInit.ts (1205 lines)"}, "properties": {"repobilityId": "eb7af17cf05a5eca", "scanner": "scanner-primary", "fingerprint": "95099ddb943b14cb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-362ea2729233f867", "level": "note", "message": {"text": "Very large file: components/music/MusicPage.tsx (1889 lines)"}, "properties": {"repobilityId": "fbf92b55096109e9", "scanner": "scanner-primary", "fingerprint": "362ea2729233f867", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9e7d9f9be1168b1d", "level": "note", "message": {"text": "Very large file: pi-cache/src/routes/enc.ts (1508 lines)"}, "properties": {"repobilityId": "789e6c5c498460de", "scanner": "scanner-primary", "fingerprint": "9e7d9f9be1168b1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f435d2648b484315", "level": "note", "message": {"text": "Very large file: pi-cache/src/services/inshoreRouter.ts (2566 lines)"}, "properties": {"repobilityId": "f66d30b062a71cff", "scanner": "scanner-primary", "fingerprint": "f435d2648b484315", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fd02b1e98089a82c", "level": "note", "message": {"text": "Very large file: pages/LogPage.tsx (1319 lines)"}, "properties": {"repobilityId": "209d0246b361eb10", "scanner": "scanner-primary", "fingerprint": "fd02b1e98089a82c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7f31c7713131a442", "level": "note", "message": {"text": "Very large file: hooks/useLogPageState.ts (1311 lines)"}, "properties": {"repobilityId": "b2dcd14eb3a66a96", "scanner": "scanner-primary", "fingerprint": "7f31c7713131a442", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cb92e754d9718e61", "level": "note", "message": {"text": "Very large file: hooks/useVoyageForm.ts (1204 lines)"}, "properties": {"repobilityId": "f04758ddaa3b32df", "scanner": "scanner-primary", "fingerprint": "cb92e754d9718e61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d629d31408375886", "level": "note", "message": {"text": "Very large file: supabase/functions/route-weather/index.ts (2477 lines)"}, "properties": {"repobilityId": "060255d318489f79", "scanner": "scanner-primary", "fingerprint": "d629d31408375886", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b3ecb6216215ca5b", "level": "note", "message": {"text": "Very large file: services/ChartLockerService.ts (2054 lines)"}, "properties": {"repobilityId": "7dff0bd11b532fea", "scanner": "scanner-primary", "fingerprint": "b3ecb6216215ca5b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-613f811d7a8064a7", "level": "note", "message": {"text": "Very large file: services/GalleyRecipeService.ts (2085 lines)"}, "properties": {"repobilityId": "4ed62d53ad764329", "scanner": "scanner-primary", "fingerprint": "613f811d7a8064a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-24b104a651a791be", "level": "note", "message": {"text": "Very large file: services/DiaryService.ts (1159 lines)"}, "properties": {"repobilityId": "99426f44e30e5b71", "scanner": "scanner-primary", "fingerprint": "24b104a651a791be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f9d300e7dc3ea9ee", "level": "note", "message": {"text": "Very large file: services/ChatService.ts (1413 lines)"}, "properties": {"repobilityId": "5105365fc3bb1822", "scanner": "scanner-primary", "fingerprint": "f9d300e7dc3ea9ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b70fe7636f8e4465", "level": "note", "message": {"text": "Very large file: services/AvNavService.ts (1716 lines)"}, "properties": {"repobilityId": "31872c30a3f30f2b", "scanner": "scanner-primary", "fingerprint": "b70fe7636f8e4465", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2870b5f6c382f9c1", "level": "note", "message": {"text": "Very large file: services/InshoreRouter.ts (2615 lines)"}, "properties": {"repobilityId": "ce7bac5b1b48fa25", "scanner": "scanner-primary", "fingerprint": "2870b5f6c382f9c1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d23be17f270b91f", "level": "note", "message": {"text": "Very large file: services/inshoreRouterEngine.ts (3798 lines)"}, "properties": {"repobilityId": "713994f673ac4b62", "scanner": "scanner-primary", "fingerprint": "5d23be17f270b91f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc8c8948168efe4c", "level": "note", "message": {"text": "Very large file: services/voice/deepgramRecognizer.ts (1538 lines)"}, "properties": {"repobilityId": "c39b7ac0585627a8", "scanner": "scanner-primary", "fingerprint": "fc8c8948168efe4c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-537c7248d07c5223", "level": "note", "message": {"text": "Very large file: services/voice/orchestrator.ts (1373 lines)"}, "properties": {"repobilityId": "89afcd1cb2683255", "scanner": "scanner-primary", "fingerprint": "537c7248d07c5223", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c7b7c3751afcb72f", "level": "note", "message": {"text": "Very large file: pack-generator/spikes/brisbane-bathymetry.sh (1420 lines)"}, "properties": {"repobilityId": "214a5beb5df40cce", "scanner": "scanner-primary", "fingerprint": "c7b7c3751afcb72f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "173718cfd5ed7cb8", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1e12423b06908cee", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: scripts/linz-msi-scrape/package.json"}, "properties": {"repobilityId": "3a6e20c1ff466aaf", "scanner": "scanner-primary", "fingerprint": "1e12423b06908cee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/linz-msi-scrape/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f46282dc749434af", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: vessel-scraper/package.json"}, "properties": {"repobilityId": "f52dd1f163813076", "scanner": "scanner-primary", "fingerprint": "f46282dc749434af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vessel-scraper/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc704165b0fa2448", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: tools/senc-extractor/package.json"}, "properties": {"repobilityId": "b2c14f56bf5781ed", "scanner": "scanner-primary", "fingerprint": "bc704165b0fa2448", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/senc-extractor/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "b5748388a63a121a", "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": "e32b86d04ec2be99", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "5c906992848b0673", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "528a7cf10682b70e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "7939ec8f5c11df63", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "929ed40bb9bd57fc", "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": "74775899600f9736", "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": "658055a32217c65a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1b39b2e35fcd0733", "level": "none", "message": {"text": "Commented-code block (7 lines) in vite.config.ts:51"}, "properties": {"repobilityId": "6a3b049ccd02b9ed", "scanner": "scanner-primary", "fingerprint": "1b39b2e35fcd0733", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0970bd53ea591afc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:103"}, "properties": {"repobilityId": "86552fd7e8ee7303", "scanner": "scanner-primary", "fingerprint": "0970bd53ea591afc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-40ee464ad581393c", "level": "none", "message": {"text": "Commented-code block (10 lines) in capacitor.config.ts:10"}, "properties": {"repobilityId": "30dcaed066630f85", "scanner": "scanner-primary", "fingerprint": "40ee464ad581393c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49d431820448f0d3", "level": "none", "message": {"text": "Commented-code block (7 lines) in index.tsx:4"}, "properties": {"repobilityId": "e7cf2e32341fef98", "scanner": "scanner-primary", "fingerprint": "49d431820448f0d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7d9340759703bec", "level": "none", "message": {"text": "Commented-code block (5 lines) in middleware.ts:21"}, "properties": {"repobilityId": "e011b4b0d932d43d", "scanner": "scanner-primary", "fingerprint": "e7d9340759703bec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f55ba8564cc9ad11", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 middleware.ts:47"}, "properties": {"repobilityId": "25c4ec268fd99220", "scanner": "scanner-primary", "fingerprint": "f55ba8564cc9ad11", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b29bea55e27227e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in eslint.config.js:19"}, "properties": {"repobilityId": "e9bbf9cdab4e4769", "scanner": "scanner-primary", "fingerprint": "b29bea55e27227e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3c74a160a506f78", "level": "none", "message": {"text": "Commented-code block (6 lines) in viewRegistry.tsx:211"}, "properties": {"repobilityId": "d089e1cab4c01eff", "scanner": "scanner-primary", "fingerprint": "d3c74a160a506f78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68a6f8b0a7bf8dde", "level": "none", "message": {"text": "Commented-code block (7 lines) in App.tsx:90"}, "properties": {"repobilityId": "0545863898651a68", "scanner": "scanner-primary", "fingerprint": "68a6f8b0a7bf8dde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-945e57c8c6eb9922", "level": "none", "message": {"text": "Commented-code block (7 lines) in stores/settingsStore.ts:252"}, "properties": {"repobilityId": "564495d4650562a9", "scanner": "scanner-primary", "fingerprint": "945e57c8c6eb9922", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af50304987e6fe09", "level": "none", "message": {"text": "Commented-code block (7 lines) in stores/uiStore.ts:69"}, "properties": {"repobilityId": "465a03235c0663ef", "scanner": "scanner-primary", "fingerprint": "af50304987e6fe09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af75657d4819efe4", "level": "none", "message": {"text": "Commented-code block (8 lines) in stores/authStore.ts:49"}, "properties": {"repobilityId": "4d54d31154f8d400", "scanner": "scanner-primary", "fingerprint": "af75657d4819efe4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b38fdae072cd009d", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/inshoreRouter.uncharted.test.ts:230"}, "properties": {"repobilityId": "92ceb65edcf68d6d", "scanner": "scanner-primary", "fingerprint": "b38fdae072cd009d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4811f32529c9182", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_chat_channels_v1` in tests/ChatService.test.ts:294"}, "properties": {"repobilityId": "52d76aa1ea60564f", "scanner": "scanner-primary", "fingerprint": "c4811f32529c9182", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b6ead292625bfce", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/anchorWatch.test.ts:10"}, "properties": {"repobilityId": "492bcc3c23acb576", "scanner": "scanner-primary", "fingerprint": "4b6ead292625bfce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a15e14b41e74587f", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/inshoreRouter.seamanship.test.ts:125"}, "properties": {"repobilityId": "804f6d231b880b00", "scanner": "scanner-primary", "fingerprint": "a15e14b41e74587f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-332d0530e823639f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/seawayConnector.test.ts:94"}, "properties": {"repobilityId": "20d510f36a1285cb", "scanner": "scanner-primary", "fingerprint": "332d0530e823639f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f89fa89d6944a3c3", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/locationType.test.ts:33"}, "properties": {"repobilityId": "54eebe68e1f0d2fe", "scanner": "scanner-primary", "fingerprint": "f89fa89d6944a3c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d91d2ae13f65b913", "level": "note", "message": {"text": "Legacy-named symbol `cloud_old` in tests/voyageData.test.ts:329"}, "properties": {"repobilityId": "02ed937f4ac69c8f", "scanner": "scanner-primary", "fingerprint": "d91d2ae13f65b913", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5ba85bef1a1ce66c", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.regression.test.ts:123"}, "properties": {"repobilityId": "d3deb5b6dab78dd2", "scanner": "scanner-primary", "fingerprint": "5ba85bef1a1ce66c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-351c72fe64c8e615", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/inshoreRouter.pairing.test.ts:60"}, "properties": {"repobilityId": "0e5aec06fc0123a5", "scanner": "scanner-primary", "fingerprint": "351c72fe64c8e615", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a892f2927d2afeee", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/aisDecoder.test.ts:163"}, "properties": {"repobilityId": "a1b7dfabb46dc50d", "scanner": "scanner-primary", "fingerprint": "a892f2927d2afeee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04f7f0b058472d9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/shiplog-CourseChangeDetector.test.ts:109"}, "properties": {"repobilityId": "1d2ea3aa2e154ea9", "scanner": "scanner-primary", "fingerprint": "04f7f0b058472d9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbae8c395d81d24d", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/mergeByUpdatedAt.test.ts:74"}, "properties": {"repobilityId": "7578efaea1a37ccf", "scanner": "scanner-primary", "fingerprint": "dbae8c395d81d24d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4c4289860e24f82", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/vesselUnits.test.ts:56"}, "properties": {"repobilityId": "226d61570ff5c9f4", "scanner": "scanner-primary", "fingerprint": "c4c4289860e24f82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c30260fd1ed29651", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.marina.test.ts:76"}, "properties": {"repobilityId": "ddb8d08c74f76f96", "scanner": "scanner-primary", "fingerprint": "c30260fd1ed29651", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03b7eb998603d996", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/fairlead.test.ts:114"}, "properties": {"repobilityId": "56b16f3382096a51", "scanner": "scanner-primary", "fingerprint": "03b7eb998603d996", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72139123a91acb02", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.golden.test.ts:72"}, "properties": {"repobilityId": "ece4ae702dc0c62b", "scanner": "scanner-primary", "fingerprint": "72139123a91acb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c61eef1c6ac4481", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/seawayShadow.test.ts:257"}, "properties": {"repobilityId": "7d4fb5df14dc0160", "scanner": "scanner-primary", "fingerprint": "3c61eef1c6ac4481", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ea63b80a5a5cd40", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/LogPage.test.tsx:174"}, "properties": {"repobilityId": "fb5e43e8fc162d17", "scanner": "scanner-primary", "fingerprint": "6ea63b80a5a5cd40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25619972795cb42c", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/seawayArbitration.corpus.test.ts:89"}, "properties": {"repobilityId": "2c89afafa57016f4", "scanner": "scanner-primary", "fingerprint": "25619972795cb42c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc811f6970bf2a93", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/inshoreRouter.approachDivert.test.ts:98"}, "properties": {"repobilityId": "38677d78da2d40a8", "scanner": "scanner-primary", "fingerprint": "fc811f6970bf2a93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7140743392d9735", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/seawayCrossLine.test.ts:142"}, "properties": {"repobilityId": "72c321e1757d966b", "scanner": "scanner-primary", "fingerprint": "f7140743392d9735", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a58bb999dc419b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/sst/[file].ts:28"}, "properties": {"repobilityId": "78b26f42ecf142df", "scanner": "scanner-primary", "fingerprint": "2a58bb999dc419b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5e9d67c6b4985f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/chl/[file].ts:25"}, "properties": {"repobilityId": "6f124308d0b90bbd", "scanner": "scanner-primary", "fingerprint": "f5e9d67c6b4985f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d01d787270aea322", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/mld/[file].ts:25"}, "properties": {"repobilityId": "ee1df324eb069fea", "scanner": "scanner-primary", "fingerprint": "d01d787270aea322", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18e8f79d42509734", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/waves/[file].ts:38"}, "properties": {"repobilityId": "479deeb7e9c28565", "scanner": "scanner-primary", "fingerprint": "18e8f79d42509734", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea4ebdb4d6a23d41", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/currents/[file].ts:39"}, "properties": {"repobilityId": "4907c8d6a5d39969", "scanner": "scanner-primary", "fingerprint": "ea4ebdb4d6a23d41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-318b3cdcae299f3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/seaice/[file].ts:25"}, "properties": {"repobilityId": "6e80b4667999fadd", "scanner": "scanner-primary", "fingerprint": "318b3cdcae299f3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3625b7e9208a7a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/mpa/[file].ts:30"}, "properties": {"repobilityId": "78604699ea388598", "scanner": "scanner-primary", "fingerprint": "c3625b7e9208a7a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6321f0bfde4fa871", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/audit-reef-edge-markers.mjs:110"}, "properties": {"repobilityId": "4d8a6ba2ef8d841a", "scanner": "scanner-primary", "fingerprint": "6321f0bfde4fa871", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba67b9943f20c63f", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/audit-orphan-routes.mjs:62"}, "properties": {"repobilityId": "3a94ac6d473ff931", "scanner": "scanner-primary", "fingerprint": "ba67b9943f20c63f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0853f22679896b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/cmems-sst-pipeline/pipeline.py:158"}, "properties": {"repobilityId": "e556189fa88ed84a", "scanner": "scanner-primary", "fingerprint": "e0853f22679896b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b197df9dda6f7e6", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-sst-pipeline/pipeline.py:208"}, "properties": {"repobilityId": "1efe0e5be97b7dcb", "scanner": "scanner-primary", "fingerprint": "7b197df9dda6f7e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68a6304a181c8298", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-chl-pipeline/pipeline.py:219"}, "properties": {"repobilityId": "73b49a0bb2f70fa0", "scanner": "scanner-primary", "fingerprint": "68a6304a181c8298", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4512001051b58684", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/mpa-pipeline/pipeline.py:46"}, "properties": {"repobilityId": "cf0900d28dbb58c4", "scanner": "scanner-primary", "fingerprint": "4512001051b58684", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29dc8744726de33b", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/mpa-pipeline/pipeline.py:256"}, "properties": {"repobilityId": "13c8d3fc134e27ea", "scanner": "scanner-primary", "fingerprint": "29dc8744726de33b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-048762b261ed8110", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/linz-msi-scrape/scrape.mjs:45"}, "properties": {"repobilityId": "14d2c8117474ca66", "scanner": "scanner-primary", "fingerprint": "048762b261ed8110", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2640871475a5d443", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/cmems-seaice-pipeline/pipeline.py:43"}, "properties": {"repobilityId": "426dbf81fb584836", "scanner": "scanner-primary", "fingerprint": "2640871475a5d443", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02dccd1a038fbc15", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-seaice-pipeline/pipeline.py:219"}, "properties": {"repobilityId": "bd93e1495c155e5f", "scanner": "scanner-primary", "fingerprint": "02dccd1a038fbc15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce8c5a80394b9d67", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/cmems-currents-pipeline/pipeline.py:51"}, "properties": {"repobilityId": "70aa4259e44f3cd0", "scanner": "scanner-primary", "fingerprint": "ce8c5a80394b9d67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0430c9600fdf990f", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-currents-pipeline/pipeline.py:209"}, "properties": {"repobilityId": "c87c217696a84ed5", "scanner": "scanner-primary", "fingerprint": "0430c9600fdf990f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-562db47aaa4e117a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/cmems-mld-pipeline/pipeline.py:60"}, "properties": {"repobilityId": "e4a3d7ccdc23a53c", "scanner": "scanner-primary", "fingerprint": "562db47aaa4e117a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f7645dc5ef45a2f", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-mld-pipeline/pipeline.py:223"}, "properties": {"repobilityId": "c7104fed21497c02", "scanner": "scanner-primary", "fingerprint": "6f7645dc5ef45a2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd07e52b51b344b4", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/cmems-waves-pipeline/pipeline.py:187"}, "properties": {"repobilityId": "7ffa91ba2c13eeb7", "scanner": "scanner-primary", "fingerprint": "cd07e52b51b344b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81a656fce674a2fe", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/cmems-waves-pipeline/pipeline.py:235"}, "properties": {"repobilityId": "f608e3fed9d4a4f6", "scanner": "scanner-primary", "fingerprint": "81a656fce674a2fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-592444e8697abe8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/gpsFollow.ts:47"}, "properties": {"repobilityId": "2cff7be28d967150", "scanner": "scanner-primary", "fingerprint": "592444e8697abe8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-548685541aa2b11b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/pdfExport.ts:419"}, "properties": {"repobilityId": "6aa5deaac4b4e277", "scanner": "scanner-primary", "fingerprint": "548685541aa2b11b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69df3ce86b8d113c", "level": "none", "message": {"text": "Commented-code block (5 lines) in utils/defaultVessel.ts:13"}, "properties": {"repobilityId": "62ab65f686987e8b", "scanner": "scanner-primary", "fingerprint": "69df3ce86b8d113c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-073f9953ddc17def", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/logExportHelpers.ts:75"}, "properties": {"repobilityId": "ce85f4a9d0c05bda", "scanner": "scanner-primary", "fingerprint": "073f9953ddc17def", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9978e3721ee6ee7e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 utils/rateLimiter.ts:13"}, "properties": {"repobilityId": "fec564c8c39fa077", "scanner": "scanner-primary", "fingerprint": "9978e3721ee6ee7e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2dce4cf29bef819a", "level": "none", "message": {"text": "Commented-code block (7 lines) in cloudflare-worker/src/index.ts:153"}, "properties": {"repobilityId": "959483986d55ada5", "scanner": "scanner-primary", "fingerprint": "2dce4cf29bef819a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7adb5609ce947710", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/src/index.ts:22"}, "properties": {"repobilityId": "8e01072ac9a0c3a3", "scanner": "scanner-primary", "fingerprint": "7adb5609ce947710", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc6416ae19e84082", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/UpgradeModal.tsx:49"}, "properties": {"repobilityId": "eb8c79b802de4488", "scanner": "scanner-primary", "fingerprint": "dc6416ae19e84082", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b23dc8275fe3ee1a", "level": "none", "message": {"text": "Commented-code block (15 lines) in components/NavButton.tsx:52"}, "properties": {"repobilityId": "c123226ca3bd64ea", "scanner": "scanner-primary", "fingerprint": "b23dc8275fe3ee1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ed23fb02fb09c7a", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/WarningDetails.tsx:81"}, "properties": {"repobilityId": "9398d9c9120c3091", "scanner": "scanner-primary", "fingerprint": "3ed23fb02fb09c7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9947f0fc487e3c16", "level": "none", "message": {"text": "Commented-code block (22 lines) in components/VesselHub.tsx:77"}, "properties": {"repobilityId": "c75a15c6d8e9bc74", "scanner": "scanner-primary", "fingerprint": "9947f0fc487e3c16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32ddf50bf0c68321", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/CrewManagement.tsx:77"}, "properties": {"repobilityId": "b3ce24e8c0337b93", "scanner": "scanner-primary", "fingerprint": "32ddf50bf0c68321", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49a795cbc9d4dcaf", "level": "none", "message": {"text": "Commented-code block (10 lines) in components/SettingsModal.tsx:30"}, "properties": {"repobilityId": "76d8dd5b4e11c5d9", "scanner": "scanner-primary", "fingerprint": "49a795cbc9d4dcaf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71c0a9bd255391e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ChatPage.tsx:255"}, "properties": {"repobilityId": "bcc44f077bd70c0c", "scanner": "scanner-primary", "fingerprint": "71c0a9bd255391e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a16635b9896da82", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/Dashboard.tsx:176"}, "properties": {"repobilityId": "9aefa5559d30faf2", "scanner": "scanner-primary", "fingerprint": "3a16635b9896da82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f2f2d5fadac2efa", "level": "none", "message": {"text": "Commented-code block (12 lines) in components/OnboardingWizard.tsx:69"}, "properties": {"repobilityId": "cb3070b35b6731e1", "scanner": "scanner-primary", "fingerprint": "4f2f2d5fadac2efa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd7bec3eb63142ce", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/RoutePlanner.tsx:98"}, "properties": {"repobilityId": "89894cb4de59f870", "scanner": "scanner-primary", "fingerprint": "cd7bec3eb63142ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d2a14c50c8e8c56", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/TrackMapViewer.tsx:238"}, "properties": {"repobilityId": "623416723753fde7", "scanner": "scanner-primary", "fingerprint": "1d2a14c50c8e8c56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98a1534120d881d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/LiveMiniMap.tsx:66"}, "properties": {"repobilityId": "6d0a88677e19a1a5", "scanner": "scanner-primary", "fingerprint": "98a1534120d881d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14f171ce72756212", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/DiaryPage.tsx:530"}, "properties": {"repobilityId": "89866f2ce5c6f00c", "scanner": "scanner-primary", "fingerprint": "14f171ce72756212", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d77b78dbc75ab5e6", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/PushToast.tsx:115"}, "properties": {"repobilityId": "a6649c1f0ceee375", "scanner": "scanner-primary", "fingerprint": "d77b78dbc75ab5e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d048e27ac84c5889", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/AnchorWatchPage.tsx:379"}, "properties": {"repobilityId": "caac5b66aa5f348e", "scanner": "scanner-primary", "fingerprint": "d048e27ac84c5889", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd601af07b1a39a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/SystemStatusButton.tsx:596"}, "properties": {"repobilityId": "2109da6858db8cc2", "scanner": "scanner-primary", "fingerprint": "fd601af07b1a39a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b39e8d33ba50c919", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/SignInScreen.tsx:38"}, "properties": {"repobilityId": "5e1883baaf626218", "scanner": "scanner-primary", "fingerprint": "b39e8d33ba50c919", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bafc19ce1bb52e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/settings/CalypsoIntegrationsTab.tsx:195"}, "properties": {"repobilityId": "8ec2e55f1fd07890", "scanner": "scanner-primary", "fingerprint": "3bafc19ce1bb52e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-523152aa202d1d2c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/settings/VoyageLogTab.tsx:121"}, "properties": {"repobilityId": "452940051cc0cf3a", "scanner": "scanner-primary", "fingerprint": "523152aa202d1d2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96a315eaa514998f", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/settings/VesselTab.tsx:59"}, "properties": {"repobilityId": "c518c0516a0b509e", "scanner": "scanner-primary", "fingerprint": "96a315eaa514998f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1da9258d4649825b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/marketplace/CreateListingModal.tsx:146"}, "properties": {"repobilityId": "48a8b790ce6e5d86", "scanner": "scanner-primary", "fingerprint": "1da9258d4649825b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-461504fa803be1ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/nmea/TheGlassPage.tsx:530"}, "properties": {"repobilityId": "d74eadf87550f449", "scanner": "scanner-primary", "fingerprint": "461504fa803be1ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02490671d1fe83bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ui/ConnectivityBanner.tsx:75"}, "properties": {"repobilityId": "3eb44b68921a0fca", "scanner": "scanner-primary", "fingerprint": "02490671d1fe83bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4318cf3f03481092", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ui/PageHeader.tsx:81"}, "properties": {"repobilityId": "b0fbdccff71e9636", "scanner": "scanner-primary", "fingerprint": "4318cf3f03481092", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c80ea742e1d0867", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/ui/OnboardingOverlay.tsx:82"}, "properties": {"repobilityId": "a547b0333b9a134c", "scanner": "scanner-primary", "fingerprint": "1c80ea742e1d0867", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-622592dcaab2ef04", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ui/SlideToAction.tsx:102"}, "properties": {"repobilityId": "d82cbbdc4aa03bbc", "scanner": "scanner-primary", "fingerprint": "622592dcaab2ef04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91e08db4ea716403", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/ui/CoachMark.tsx:15"}, "properties": {"repobilityId": "b4c20022d9f0a245", "scanner": "scanner-primary", "fingerprint": "91e08db4ea716403", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62db6ab453a2bc28", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_tooltip_tour_v2` in components/ui/OnboardingTooltips.tsx:16"}, "properties": {"repobilityId": "257db4eb094fbca4", "scanner": "scanner-primary", "fingerprint": "62db6ab453a2bc28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7247cb1611df1c62", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_hero_pin_coach_v1` in components/dashboard/HeroHeader.tsx:252"}, "properties": {"repobilityId": "d4a3d53aa7b5c20d", "scanner": "scanner-primary", "fingerprint": "7247cb1611df1c62", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d14bcd6f611e0f58", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/HeroHeader.tsx:101"}, "properties": {"repobilityId": "93d5466dfafa56bb", "scanner": "scanner-primary", "fingerprint": "d14bcd6f611e0f58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d598ccb5695469ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/HeroSlide.test.tsx:47"}, "properties": {"repobilityId": "15955b1aeb9544ee", "scanner": "scanner-primary", "fingerprint": "d598ccb5695469ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cf5774cb7f2f2ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/StatusBadges.tsx:66"}, "properties": {"repobilityId": "f8bafcc5c5f25dd0", "scanner": "scanner-primary", "fingerprint": "2cf5774cb7f2f2ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de84e61635e45601", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/HeroWidgets.tsx:535"}, "properties": {"repobilityId": "73a34e12fa3f2e64", "scanner": "scanner-primary", "fingerprint": "de84e61635e45601", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-374bbba44588dc3d", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/MetricPinSheet.tsx:19"}, "properties": {"repobilityId": "c6af4e48dee29c8d", "scanner": "scanner-primary", "fingerprint": "374bbba44588dc3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9909ee3186456f8", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/dashboard/RainForecastCard.tsx:70"}, "properties": {"repobilityId": "c98d4b14995ca87f", "scanner": "scanner-primary", "fingerprint": "f9909ee3186456f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46d92a17468087d7", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_swipe_hint_seen_v1` in components/dashboard/HeroSlide.tsx:268"}, "properties": {"repobilityId": "6924b8b5b1aee33d", "scanner": "scanner-primary", "fingerprint": "46d92a17468087d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8b76c8811e7141ca", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/dashboard/HeroSlide.tsx:229"}, "properties": {"repobilityId": "90751de7c8c0b52c", "scanner": "scanner-primary", "fingerprint": "8b76c8811e7141ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1881f7a2779d8a06", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/dashboard/StalenessBanner.tsx:152"}, "properties": {"repobilityId": "decf3d6145b68bae", "scanner": "scanner-primary", "fingerprint": "1881f7a2779d8a06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ca271eb759bb780", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/dashboard/Hero.tsx:131"}, "properties": {"repobilityId": "9224708cf28f3f44", "scanner": "scanner-primary", "fingerprint": "9ca271eb759bb780", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8758dd6c7fa2c19c", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_anchor_view_coach_v1` in components/dashboard/hero/EssentialAnchorView.tsx:354"}, "properties": {"repobilityId": "b2f894dff7e53c5a", "scanner": "scanner-primary", "fingerprint": "8758dd6c7fa2c19c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-40522bd675a3522a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/hero/EssentialAnchorView.tsx:94"}, "properties": {"repobilityId": "75ac23c280ec72a9", "scanner": "scanner-primary", "fingerprint": "40522bd675a3522a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c1641200d520181", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/chat/PinMapViewer.tsx:176"}, "properties": {"repobilityId": "366e835cfc26b82d", "scanner": "scanner-primary", "fingerprint": "7c1641200d520181", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c2e8bde6e7aae80", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/chat/GalleyCard.tsx:100"}, "properties": {"repobilityId": "cd5a5f3840c0a822", "scanner": "scanner-primary", "fingerprint": "1c2e8bde6e7aae80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff04db600d40a4ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/chat/CaptainsTable.tsx:248"}, "properties": {"repobilityId": "c1b54260c5f55459", "scanner": "scanner-primary", "fingerprint": "ff04db600d40a4ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef3797ae1d517e78", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/chat/ChannelList.tsx:115"}, "properties": {"repobilityId": "4ebd09b86b2805c0", "scanner": "scanner-primary", "fingerprint": "ef3797ae1d517e78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd942a8204a762b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/chat/MealCalendar.tsx:136"}, "properties": {"repobilityId": "74f044148f98bb25", "scanner": "scanner-primary", "fingerprint": "dd942a8204a762b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94c2a7df11916288", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/chat/CustomRecipeForm.tsx:540"}, "properties": {"repobilityId": "420d23b8aa3d0336", "scanner": "scanner-primary", "fingerprint": "94c2a7df11916288", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3fcd58889bc5b67", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/voice/BosunConsole.tsx:138"}, "properties": {"repobilityId": "bdb8082ea02c3b09", "scanner": "scanner-primary", "fingerprint": "a3fcd58889bc5b67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0bfec5fd3320624", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/diary/SwipeableDiaryCard.tsx:81"}, "properties": {"repobilityId": "e5c338359c23abe4", "scanner": "scanner-primary", "fingerprint": "f0bfec5fd3320624", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-53faebcd03aab856", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/crew/ReadinessCardStack.tsx:26"}, "properties": {"repobilityId": "b8ea3f069c5a1ab5", "scanner": "scanner-primary", "fingerprint": "53faebcd03aab856", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90afd83cb7c323c7", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/onboarding/VesselDetailsStep.tsx:188"}, "properties": {"repobilityId": "068cc45edbc25332", "scanner": "scanner-primary", "fingerprint": "90afd83cb7c323c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82e26a2e5a3f585d", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/passage/LegPickerDropdown.tsx:519"}, "properties": {"repobilityId": "c3df496ca3b5f461", "scanner": "scanner-primary", "fingerprint": "82e26a2e5a3f585d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc9fbf5497b2b259", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/passage/TripOverviewSheet.tsx:89"}, "properties": {"repobilityId": "3d57c84c138630fd", "scanner": "scanner-primary", "fingerprint": "bc9fbf5497b2b259", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4502d901324a7282", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/passage/PassageCanvas.tsx:395"}, "properties": {"repobilityId": "06c3e0857dd4823e", "scanner": "scanner-primary", "fingerprint": "4502d901324a7282", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-560a7403b882249b", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/passage/CustomsClearanceCard.tsx:86"}, "properties": {"repobilityId": "e34646acbe1ccc99", "scanner": "scanner-primary", "fingerprint": "560a7403b882249b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-994b130dc1b70546", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/passage/PassageRouteMap.tsx:47"}, "properties": {"repobilityId": "555b9719ec441b38", "scanner": "scanner-primary", "fingerprint": "994b130dc1b70546", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87eca84834d5e7de", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/passage/AccordionSection.tsx:129"}, "properties": {"repobilityId": "5dc1b340f15cf4b6", "scanner": "scanner-primary", "fingerprint": "87eca84834d5e7de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-592ad2139d3d9a38", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/passage/RouteEnhancementChip.tsx:59"}, "properties": {"repobilityId": "be20170c3cecf56e", "scanner": "scanner-primary", "fingerprint": "592ad2139d3d9a38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50446812766005f7", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/passage/VesselProfileSummary.tsx:80"}, "properties": {"repobilityId": "d8435d116130b77b", "scanner": "scanner-primary", "fingerprint": "50446812766005f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77f8ae80f4b3f156", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/passage/PassageSummaryCard.tsx:111"}, "properties": {"repobilityId": "658551dc123e0dcd", "scanner": "scanner-primary", "fingerprint": "77f8ae80f4b3f156", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdafdc5a7d693017", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/passage/WatchScheduleCard.tsx:173"}, "properties": {"repobilityId": "5eb91b7f7f45ae51", "scanner": "scanner-primary", "fingerprint": "fdafdc5a7d693017", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4016b612f13e48d0", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/passage/OceanCurrentsCard.tsx:40"}, "properties": {"repobilityId": "3b1d2d40e7041529", "scanner": "scanner-primary", "fingerprint": "4016b612f13e48d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2dbedc79a34ff8fc", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/passage/WeatherWindowCard.tsx:70"}, "properties": {"repobilityId": "71a59d1337ef3516", "scanner": "scanner-primary", "fingerprint": "2dbedc79a34ff8fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74998ab1ab9b6b33", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/vessel/DocumentsHub.tsx:73"}, "properties": {"repobilityId": "9124892932da39af", "scanner": "scanner-primary", "fingerprint": "74998ab1ab9b6b33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84e3c37fb3abde44", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/vessel/CastOffPanel.tsx:136"}, "properties": {"repobilityId": "7e1f45d6f5439593", "scanner": "scanner-primary", "fingerprint": "84e3c37fb3abde44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2587c121768b2f7", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/vessel/MobPage.tsx:193"}, "properties": {"repobilityId": "c0f0c2dbafb083c0", "scanner": "scanner-primary", "fingerprint": "b2587c121768b2f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0a8ada8ff959f50", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/vessel/RadioConsolePage.tsx:334"}, "properties": {"repobilityId": "06e3f507ba25d90a", "scanner": "scanner-primary", "fingerprint": "d0a8ada8ff959f50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f74f111895ddf69c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/vessel/NoticesPage.tsx:83"}, "properties": {"repobilityId": "18455abf474cf576", "scanner": "scanner-primary", "fingerprint": "f74f111895ddf69c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-505301edefd2c7f9", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/vessel/AvNavPage.tsx:240"}, "properties": {"repobilityId": "d781bb55f22699e4", "scanner": "scanner-primary", "fingerprint": "505301edefd2c7f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4bda2d02ad6bd193", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in components/vessel/EncCellManager.tsx:77"}, "properties": {"repobilityId": "9c7a1317287d3e97", "scanner": "scanner-primary", "fingerprint": "4bda2d02ad6bd193", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-438f725b22edc51c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/vessel/EncCellManager.tsx:401"}, "properties": {"repobilityId": "0ce88ff819032d34", "scanner": "scanner-primary", "fingerprint": "438f725b22edc51c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1468364bab16d68", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/map/useEncVectorLayer.ts:67"}, "properties": {"repobilityId": "d27c4c5cdc95fdce", "scanner": "scanner-primary", "fingerprint": "e1468364bab16d68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3bacc1cc9e469ba", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/useCycloneLayer.ts:65"}, "properties": {"repobilityId": "24ff1d78eea01d3e", "scanner": "scanner-primary", "fingerprint": "c3bacc1cc9e469ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2f017674b5ec5de", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/useOceanWaveParticleLayer.ts:230"}, "properties": {"repobilityId": "1b50a28029c137b1", "scanner": "scanner-primary", "fingerprint": "d2f017674b5ec5de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d90831f3e65ec34", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/map/PassageBanner.tsx:226"}, "properties": {"repobilityId": "9975e1cd04d3a5b9", "scanner": "scanner-primary", "fingerprint": "7d90831f3e65ec34", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71680c828c480d75", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/map/usePassagePlanner.ts:312"}, "properties": {"repobilityId": "3d4f265ed3e3fa82", "scanner": "scanner-primary", "fingerprint": "71680c828c480d75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a67317e30113cbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/usePassagePlanner.ts:1358"}, "properties": {"repobilityId": "46473f08bb90d1f8", "scanner": "scanner-primary", "fingerprint": "8a67317e30113cbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e9c9df21d7bea28", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/ThreatBanner.tsx:264"}, "properties": {"repobilityId": "535a047da33d0938", "scanner": "scanner-primary", "fingerprint": "6e9c9df21d7bea28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58f83a4c90b68e64", "level": "none", "message": {"text": "Commented-code block (11 lines) in components/map/CurrentParticleLayer.ts:94"}, "properties": {"repobilityId": "1f3eb6bd544f339c", "scanner": "scanner-primary", "fingerprint": "58f83a4c90b68e64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77c8049deeda4535", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/useWeatherLayers.ts:240"}, "properties": {"repobilityId": "6ca12aaae89495be", "scanner": "scanner-primary", "fingerprint": "77c8049deeda4535", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9205fc69d224a12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useWeatherLayers.ts:1444"}, "properties": {"repobilityId": "29b9330fb75c5150", "scanner": "scanner-primary", "fingerprint": "f9205fc69d224a12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ff9bc505e7a9ad5", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/MapHubOverlays.tsx:467"}, "properties": {"repobilityId": "b39cf28cd730b6df", "scanner": "scanner-primary", "fingerprint": "2ff9bc505e7a9ad5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac289a62512448e6", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/useLightningLayer.ts:33"}, "properties": {"repobilityId": "44506c93ae333d57", "scanner": "scanner-primary", "fingerprint": "ac289a62512448e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90de48bc74f6838a", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/map/ChartModes.tsx:257"}, "properties": {"repobilityId": "ea1754d7cb0c0fba", "scanner": "scanner-primary", "fingerprint": "90de48bc74f6838a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-431daa8964d5246a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/useAvNavCharts.ts:86"}, "properties": {"repobilityId": "f0e0520016dc4c33", "scanner": "scanner-primary", "fingerprint": "431daa8964d5246a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d4cd95ca4ebfe42", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/map/mapConstants.ts:65"}, "properties": {"repobilityId": "03c0504c895c1138", "scanner": "scanner-primary", "fingerprint": "5d4cd95ca4ebfe42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d4222589bd0c247", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/useRouteTrackLayer.ts:32"}, "properties": {"repobilityId": "f58082f62b7eeaff", "scanner": "scanner-primary", "fingerprint": "6d4222589bd0c247", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ef152b7b51024c3", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/RadialHelmMenu.tsx:166"}, "properties": {"repobilityId": "8480dc5b1d8a7a04", "scanner": "scanner-primary", "fingerprint": "4ef152b7b51024c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12aa9861a47bd6d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/SstRasterLayer.ts:28"}, "properties": {"repobilityId": "a2b4ded71eab8d06", "scanner": "scanner-primary", "fingerprint": "12aa9861a47bd6d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b77e65e2d918f58f", "level": "none", "message": {"text": "Commented-code block (11 lines) in components/map/WaveParticleLayer.ts:86"}, "properties": {"repobilityId": "35af31d72a80f7c4", "scanner": "scanner-primary", "fingerprint": "b77e65e2d918f58f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38fd9f14b43fc450", "level": "none", "message": {"text": "Commented-code block (10 lines) in components/map/MldRasterLayer.ts:90"}, "properties": {"repobilityId": "4fa666cdb42b8439", "scanner": "scanner-primary", "fingerprint": "38fd9f14b43fc450", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b896b96065b058a", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/map/useVesselTracker.ts:270"}, "properties": {"repobilityId": "4aea166053d6f3b3", "scanner": "scanner-primary", "fingerprint": "8b896b96065b058a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a23851176275587f", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/PerfDowntierToast.tsx:34"}, "properties": {"repobilityId": "92e37ea7db62dcaa", "scanner": "scanner-primary", "fingerprint": "a23851176275587f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d902a654546a54d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/EncVectorLayer.ts:61"}, "properties": {"repobilityId": "f3806c27a2db69f8", "scanner": "scanner-primary", "fingerprint": "d902a654546a54d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-003f2e2498e9592b", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/WindParticleLayer.ts:1093"}, "properties": {"repobilityId": "ffd1759fe931ac0e", "scanner": "scanner-primary", "fingerprint": "003f2e2498e9592b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b4fc97d76a7d765", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_map_enc_chart_detail_v2` in components/map/MapHub.tsx:401"}, "properties": {"repobilityId": "84cb9ade9397d2e3", "scanner": "scanner-primary", "fingerprint": "0b4fc97d76a7d765", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2214a58f7ace0da8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/MapHub.tsx:114"}, "properties": {"repobilityId": "c3ead4e4841b1c28", "scanner": "scanner-primary", "fingerprint": "2214a58f7ace0da8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8628ed67585b57d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/WindGLEngine.ts:21"}, "properties": {"repobilityId": "0444d36634414423", "scanner": "scanner-primary", "fingerprint": "8628ed67585b57d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-036988d4853d68c3", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/map/useMapInit.ts:232"}, "properties": {"repobilityId": "7422883bc971cbf4", "scanner": "scanner-primary", "fingerprint": "036988d4853d68c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9344f353a69d3645", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/useMapInit.ts:759"}, "properties": {"repobilityId": "0232a0e05448a97e", "scanner": "scanner-primary", "fingerprint": "9344f353a69d3645", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d4757c734662383e", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/OfflineTileControl.tsx:38"}, "properties": {"repobilityId": "d40a7994454f7c68", "scanner": "scanner-primary", "fingerprint": "d4757c734662383e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b2d86f3cb46a8c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/useMpaLayer.ts:194"}, "properties": {"repobilityId": "c57bcfdf66aaf3bf", "scanner": "scanner-primary", "fingerprint": "9b2d86f3cb46a8c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88fc46cad7f799d7", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/map/SeaIceRasterLayer.ts:93"}, "properties": {"repobilityId": "c3ebc99cb6c07176", "scanner": "scanner-primary", "fingerprint": "88fc46cad7f799d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47900f4c635bae11", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/map/ChlRasterLayer.ts:87"}, "properties": {"repobilityId": "5dccff9379c93119", "scanner": "scanner-primary", "fingerprint": "47900f4c635bae11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e9bc4816fc606bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/map/MapboxVelocityOverlay.tsx:599"}, "properties": {"repobilityId": "cb09ce7facec525d", "scanner": "scanner-primary", "fingerprint": "5e9bc4816fc606bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52e471dcc6668615", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/map/MapboxVelocityOverlay.tsx:430"}, "properties": {"repobilityId": "cb5334b1008f6b3d", "scanner": "scanner-primary", "fingerprint": "52e471dcc6668615", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b2c6993fbf73976", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/useOceanCurrentParticleLayer.ts:230"}, "properties": {"repobilityId": "95299d2002479b5d", "scanner": "scanner-primary", "fingerprint": "5b2c6993fbf73976", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5b6728ba815b6c4", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/map/ConnectivityChip.tsx:83"}, "properties": {"repobilityId": "27fa53be39eb57cf", "scanner": "scanner-primary", "fingerprint": "f5b6728ba815b6c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-935f172c673127fb", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/music/GlobalNowPlayingBar.tsx:59"}, "properties": {"repobilityId": "190e29887cb8f800", "scanner": "scanner-primary", "fingerprint": "935f172c673127fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf1b99882c0121cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/music/MusicPage.tsx:208"}, "properties": {"repobilityId": "66b9a552d3f768f0", "scanner": "scanner-primary", "fingerprint": "bf1b99882c0121cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e01d4231189242f", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-cache/src/server.ts:49"}, "properties": {"repobilityId": "2f95834daba9889e", "scanner": "scanner-primary", "fingerprint": "9e01d4231189242f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-357a2967be3249c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/server.ts:13"}, "properties": {"repobilityId": "113ad51cd0c020ee", "scanner": "scanner-primary", "fingerprint": "357a2967be3249c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d714f37979d63ef", "level": "none", "message": {"text": "Commented-code block (7 lines) in pi-cache/src/routes/charts.ts:276"}, "properties": {"repobilityId": "5117d3894d0bcc92", "scanner": "scanner-primary", "fingerprint": "4d714f37979d63ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b43fe48006b594d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/routes/charts.ts:231"}, "properties": {"repobilityId": "c88869b0d79cd59d", "scanner": "scanner-primary", "fingerprint": "6b43fe48006b594d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d9b07e4714cebd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in pi-cache/src/routes/weather.ts:169"}, "properties": {"repobilityId": "6fe763397a12854a", "scanner": "scanner-primary", "fingerprint": "6d9b07e4714cebd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f34cdd3baa97c1e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-cache/src/routes/enc.ts:154"}, "properties": {"repobilityId": "651d1d4286156a30", "scanner": "scanner-primary", "fingerprint": "f34cdd3baa97c1e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-583119d8e42ca7fe", "level": "none", "message": {"text": "Commented-code block (6 lines) in pi-cache/src/services/inshoreRouter.ts:59"}, "properties": {"repobilityId": "fdc637be2507f784", "scanner": "scanner-primary", "fingerprint": "583119d8e42ca7fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-614679ebe386c1ed", "level": "none", "message": {"text": "Commented-code block (9 lines) in pi-cache/src/services/osm.ts:28"}, "properties": {"repobilityId": "beb6b7ade62d8349", "scanner": "scanner-primary", "fingerprint": "614679ebe386c1ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a21a1f6dd922352", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-cache/src/services/osm.ts:192"}, "properties": {"repobilityId": "13066392c1e31bf3", "scanner": "scanner-primary", "fingerprint": "7a21a1f6dd922352", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03544293e0bf73c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in pages/LogPage.tsx:60"}, "properties": {"repobilityId": "8ff9e02a27c37ab8", "scanner": "scanner-primary", "fingerprint": "03544293e0bf73c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e544972066db3751", "level": "none", "message": {"text": "Commented-code block (5 lines) in pages/log/StatsSheet.tsx:29"}, "properties": {"repobilityId": "6f6c89165611adde", "scanner": "scanner-primary", "fingerprint": "e544972066db3751", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c37e0a1d4db04e08", "level": "none", "message": {"text": "Commented-code block (5 lines) in bosun-pi/bosun_n2k_api.py:41"}, "properties": {"repobilityId": "49b566fe3e98df59", "scanner": "scanner-primary", "fingerprint": "c37e0a1d4db04e08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0e362cfaeff3e12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/EquasisScraper.ts:105"}, "properties": {"repobilityId": "c60b36c3dff9f47f", "scanner": "scanner-primary", "fingerprint": "d0e362cfaeff3e12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01617124252bbca6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vessel-scraper/src/scrapers/AmsaScraper.ts:50"}, "properties": {"repobilityId": "99d244b1bbe4d6e5", "scanner": "scanner-primary", "fingerprint": "01617124252bbca6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ce85d4d58233061", "level": "none", "message": {"text": "Commented-code block (10 lines) in hooks/useLogPageState.ts:288"}, "properties": {"repobilityId": "126fb96c2f8ec138", "scanner": "scanner-primary", "fingerprint": "1ce85d4d58233061", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4300bb50778cc9f", "level": "none", "message": {"text": "Commented-code block (7 lines) in hooks/useAppController.ts:17"}, "properties": {"repobilityId": "176a315bdc5cfec7", "scanner": "scanner-primary", "fingerprint": "b4300bb50778cc9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be97dca93a8502c6", "level": "none", "message": {"text": "Commented-code block (7 lines) in hooks/useLiveLocationName.ts:33"}, "properties": {"repobilityId": "3b186bfa3d7d26bf", "scanner": "scanner-primary", "fingerprint": "be97dca93a8502c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d9e9ec3dab37ccf", "level": "none", "message": {"text": "Commented-code block (6 lines) in hooks/useVoyageForm.ts:37"}, "properties": {"repobilityId": "5ef850b96f699b11", "scanner": "scanner-primary", "fingerprint": "2d9e9ec3dab37ccf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4861a61160506bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/useVoyageForm.ts:873"}, "properties": {"repobilityId": "7ff7211be43ba914", "scanner": "scanner-primary", "fingerprint": "e4861a61160506bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a0bcb6cb7f8f49f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/chat/useChatProposals.ts:74"}, "properties": {"repobilityId": "619c4add13703260", "scanner": "scanner-primary", "fingerprint": "6a0bcb6cb7f8f49f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5674ba04293c188b", "level": "none", "message": {"text": "Commented-code block (7 lines) in hooks/chat/useChatMessages.ts:103"}, "properties": {"repobilityId": "61817528c67eabec", "scanner": "scanner-primary", "fingerprint": "5674ba04293c188b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cec4f6c9e88d4c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/elevenlabs-tts/index.ts:239"}, "properties": {"repobilityId": "f0e6eee74a2ec5c0", "scanner": "scanner-primary", "fingerprint": "2cec4f6c9e88d4c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97857faa249862c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/EquasisScraper.ts:89"}, "properties": {"repobilityId": "1a5cbc3876cc38a9", "scanner": "scanner-primary", "fingerprint": "97857faa249862c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-387d0472b1e0f2f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/scrape-vessel-metadata/_shared/scrapers/AmsaScraper.ts:40"}, "properties": {"repobilityId": "a45084cace19c817", "scanner": "scanner-primary", "fingerprint": "387d0472b1e0f2f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51c0bf1e478f0a0f", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/create-marketplace-payment/index.ts:4"}, "properties": {"repobilityId": "f264c8df3dcc0d19", "scanner": "scanner-primary", "fingerprint": "51c0bf1e478f0a0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38ef753c565496a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-ukho-msi/index.ts:104"}, "properties": {"repobilityId": "7ec7736704dd5d29", "scanner": "scanner-primary", "fingerprint": "38ef753c565496a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce385464cd9b2006", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/fetch-precip-grid/index.ts:172"}, "properties": {"repobilityId": "4fd46c6a8059e393", "scanner": "scanner-primary", "fingerprint": "ce385464cd9b2006", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b12daf406d7b9b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-openmeteo/index.ts:68"}, "properties": {"repobilityId": "286bc534333434e1", "scanner": "scanner-primary", "fingerprint": "9b12daf406d7b9b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7c1fee3a72b9a5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/anthropic-proxy/index.ts:57"}, "properties": {"repobilityId": "2f6d555d4ac7dac0", "scanner": "scanner-primary", "fingerprint": "f7c1fee3a72b9a5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2a1e505cae0a3f8", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/deepgram-token/index.ts:114"}, "properties": {"repobilityId": "06701dd851cce3d9", "scanner": "scanner-primary", "fingerprint": "f2a1e505cae0a3f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2cd025f71dff7b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/deepgram-ws-proxy/index.ts:97"}, "properties": {"repobilityId": "f8eeb35a951dfa6d", "scanner": "scanner-primary", "fingerprint": "c2cd025f71dff7b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72961da13e68e8ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-gemini/index.ts:85"}, "properties": {"repobilityId": "d77fded3461e18b0", "scanner": "scanner-primary", "fingerprint": "72961da13e68e8ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8329c87f86ed78ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/fetch-wind-velocity/index.ts:92"}, "properties": {"repobilityId": "7a8d33337dc92c73", "scanner": "scanner-primary", "fingerprint": "8329c87f86ed78ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74cf027c73a6e655", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fetch-wind-velocity/index.ts:416"}, "properties": {"repobilityId": "a8dc0577c310650a", "scanner": "scanner-primary", "fingerprint": "74cf027c73a6e655", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-983dbfb29b148ef0", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/proxy-amsa-msi/index.ts:8"}, "properties": {"repobilityId": "31d13c19425806fe", "scanner": "scanner-primary", "fingerprint": "983dbfb29b148ef0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c78e923f0fcfad5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-amsa-msi/index.ts:155"}, "properties": {"repobilityId": "ab725aa84db7739e", "scanner": "scanner-primary", "fingerprint": "3c78e923f0fcfad5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b747caceb0774bc1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-tides/index.ts:88"}, "properties": {"repobilityId": "067ac52f01f82b96", "scanner": "scanner-primary", "fingerprint": "b747caceb0774bc1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67f8f9f243b7a3f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/voyage-log/index.ts:46"}, "properties": {"repobilityId": "525b2a10704b25a5", "scanner": "scanner-primary", "fingerprint": "67f8f9f243b7a3f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c114915befbc2fcb", "level": "none", "message": {"text": "Commented-code block (8 lines) in supabase/functions/proxy-linz-msi/index.ts:7"}, "properties": {"repobilityId": "0e2e8073035b1bde", "scanner": "scanner-primary", "fingerprint": "c114915befbc2fcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fa55cff5290968f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-linz-msi/index.ts:11"}, "properties": {"repobilityId": "34b034537479c302", "scanner": "scanner-primary", "fingerprint": "1fa55cff5290968f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8f9c29f8e2a0225", "level": "note", "message": {"text": "Legacy-named symbol `scribe_v1` in supabase/functions/proxy-bosun-fallback/index.ts:550"}, "properties": {"repobilityId": "156035b49e63620e", "scanner": "scanner-primary", "fingerprint": "a8f9c29f8e2a0225", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9337e0d9ec9d2bfc", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/proxy-bosun-fallback/index.ts:174"}, "properties": {"repobilityId": "ebe231fd7b58be33", "scanner": "scanner-primary", "fingerprint": "9337e0d9ec9d2bfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a21a246de09bef2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-bosun-fallback/index.ts:194"}, "properties": {"repobilityId": "c279f35a5e74ecdc", "scanner": "scanner-primary", "fingerprint": "1a21a246de09bef2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3f44e3772e539fd", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/route-weather/index.ts:2043"}, "properties": {"repobilityId": "ca09bdcd4953c3bb", "scanner": "scanner-primary", "fingerprint": "d3f44e3772e539fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a733c39cb2e52a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-weather/index.ts:1303"}, "properties": {"repobilityId": "ba52fdd07abaeb43", "scanner": "scanner-primary", "fingerprint": "7a733c39cb2e52a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a511c60ef0fae5c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/proxy-rainbow/index.ts:220"}, "properties": {"repobilityId": "63f50f8aa0fab505", "scanner": "scanner-primary", "fingerprint": "a511c60ef0fae5c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95ea7fc8e74579a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-rainbow/index.ts:84"}, "properties": {"repobilityId": "e586101c1e9c8811", "scanner": "scanner-primary", "fingerprint": "95ea7fc8e74579a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-438ba3d2055a1a36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-push/index.ts:202"}, "properties": {"repobilityId": "21abf89cc01e7354", "scanner": "scanner-primary", "fingerprint": "438ba3d2055a1a36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02f194eaf6f34633", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-stormglass/index.ts:76"}, "properties": {"repobilityId": "97cbb8a77b1f2d36", "scanner": "scanner-primary", "fingerprint": "02f194eaf6f34633", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88d7e9bb35ab9007", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-weather-alerts/index.ts:149"}, "properties": {"repobilityId": "87bd75f7bbe48e88", "scanner": "scanner-primary", "fingerprint": "88d7e9bb35ab9007", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49e0857cad52c93d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/get-weather/index.ts:247"}, "properties": {"repobilityId": "ba546060b2790b88", "scanner": "scanner-primary", "fingerprint": "49e0857cad52c93d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1525ddc3847c0bac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/satellite-tile/index.ts:88"}, "properties": {"repobilityId": "930d759a99002da8", "scanner": "scanner-primary", "fingerprint": "1525ddc3847c0bac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b7deb75eb015897", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/route-bathymetric/index.ts:89"}, "properties": {"repobilityId": "d279e1ea70350107", "scanner": "scanner-primary", "fingerprint": "9b7deb75eb015897", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ec9316c1f511af6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/route-bathymetric/index.ts:210"}, "properties": {"repobilityId": "97031c2b4406047d", "scanner": "scanner-primary", "fingerprint": "9ec9316c1f511af6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc2c6ed2aa1a5b3f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/proxy-overpass/index.ts:133"}, "properties": {"repobilityId": "204af98178bb217b", "scanner": "scanner-primary", "fingerprint": "dc2c6ed2aa1a5b3f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18c2d537171d56a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ChartLockerService.ts:1149"}, "properties": {"repobilityId": "55be6f5a3bbec143", "scanner": "scanner-primary", "fingerprint": "18c2d537171d56a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f34977d83c24921", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_ntm_cache_v1` in services/NoticeToMarinersService.ts:279"}, "properties": {"repobilityId": "1be1c6c1069b8c2a", "scanner": "scanner-primary", "fingerprint": "9f34977d83c24921", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a32b579fb5b33d07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/NoticeToMarinersService.ts:318"}, "properties": {"repobilityId": "ce309d670adf8493", "scanner": "scanner-primary", "fingerprint": "a32b579fb5b33d07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f47a6b7575b4289", "level": "none", "message": {"text": "Commented-code block (9 lines) in services/WeatherOrchestrator.ts:42"}, "properties": {"repobilityId": "73054ce1210db88d", "scanner": "scanner-primary", "fingerprint": "0f47a6b7575b4289", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f47a95b5cb8efd86", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/GalleyRecipeService.ts:2072"}, "properties": {"repobilityId": "baea9d9606837606", "scanner": "scanner-primary", "fingerprint": "f47a95b5cb8efd86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60429d513bff2a90", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/GalleyRecipeService.ts:487"}, "properties": {"repobilityId": "e3d7863118347ed0", "scanner": "scanner-primary", "fingerprint": "60429d513bff2a90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49e044d2c2950c10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/SatLinkClient.ts:157"}, "properties": {"repobilityId": "75de750a2a61132e", "scanner": "scanner-primary", "fingerprint": "49e044d2c2950c10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff5b2cbbc03532e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/marinaCenterline.ts:424"}, "properties": {"repobilityId": "ce0006b3a3364d62", "scanner": "scanner-primary", "fingerprint": "ff5b2cbbc03532e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdbdbf17815b6c3e", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/n2kStatus.ts:29"}, "properties": {"repobilityId": "36ff711bdf8600d8", "scanner": "scanner-primary", "fingerprint": "fdbdbf17815b6c3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d918fc50f374964f", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/TripPdfService.ts:565"}, "properties": {"repobilityId": "1ca6a666af9a5365", "scanner": "scanner-primary", "fingerprint": "d918fc50f374964f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98b483d31f0e79e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/NmeaListenerService.ts:350"}, "properties": {"repobilityId": "e44b7b660ff3d324", "scanner": "scanner-primary", "fingerprint": "98b483d31f0e79e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c3e4a47b72e5ad4", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/ShipLogService.ts:83"}, "properties": {"repobilityId": "2f4bc3ac85a4b700", "scanner": "scanner-primary", "fingerprint": "3c3e4a47b72e5ad4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f91abaeb5363ea2e", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/AustralianPortsService.ts:77"}, "properties": {"repobilityId": "1128c874307eeabf", "scanner": "scanner-primary", "fingerprint": "f91abaeb5363ea2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4b2ad1f9992c1ab", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_diary_entries_v2` in services/DiaryService.ts:76"}, "properties": {"repobilityId": "ecf2b65b0f17dafd", "scanner": "scanner-primary", "fingerprint": "b4b2ad1f9992c1ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0070140546c86ae5", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/DiaryService.ts:210"}, "properties": {"repobilityId": "e1f419bd8dd25ff8", "scanner": "scanner-primary", "fingerprint": "0070140546c86ae5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ffe5f946bb982df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/DiaryService.ts:1025"}, "properties": {"repobilityId": "29e35e4cacb415ba", "scanner": "scanner-primary", "fingerprint": "4ffe5f946bb982df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ad9629b3c093b49", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/PiCacheService.ts:114"}, "properties": {"repobilityId": "8eebce9a9f3aa0e9", "scanner": "scanner-primary", "fingerprint": "6ad9629b3c093b49", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-966b7300065cee74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/PiCacheService.ts:906"}, "properties": {"repobilityId": "e715e5dc0ffdd6a2", "scanner": "scanner-primary", "fingerprint": "966b7300065cee74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81c9efa0c3351bbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConsensusMatrixEngine.ts:115"}, "properties": {"repobilityId": "a42e6a1c589100ad", "scanner": "scanner-primary", "fingerprint": "81c9efa0c3351bbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8bee9fdee5e6d03f", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/leadingLine.ts:238"}, "properties": {"repobilityId": "904cf4c377d53cdf", "scanner": "scanner-primary", "fingerprint": "8bee9fdee5e6d03f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da0fca35de6683b0", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/BoatNetworkService.ts:69"}, "properties": {"repobilityId": "706a678fd791b8e1", "scanner": "scanner-primary", "fingerprint": "da0fca35de6683b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe6054295a7a7aa5", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_smart_polars_v1` in services/SmartPolarStore.ts:9"}, "properties": {"repobilityId": "9503c066e0bee6aa", "scanner": "scanner-primary", "fingerprint": "fe6054295a7a7aa5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b3a43825ab04b16e", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/SubscriptionService.ts:123"}, "properties": {"repobilityId": "5ba9c70343a8a274", "scanner": "scanner-primary", "fingerprint": "b3a43825ab04b16e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb722506d6fcabd9", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/TripOverviewService.ts:426"}, "properties": {"repobilityId": "7325b070bd796e87", "scanner": "scanner-primary", "fingerprint": "bb722506d6fcabd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-134e4df80a7436b5", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/GpsService.ts:131"}, "properties": {"repobilityId": "2abf21d850b1fe78", "scanner": "scanner-primary", "fingerprint": "134e4df80a7436b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc7229d0938b3095", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/isochroneEnhancer.ts:152"}, "properties": {"repobilityId": "c8fff3d84a3ce283", "scanner": "scanner-primary", "fingerprint": "dc7229d0938b3095", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76d30624aff525b4", "level": "note", "message": {"text": "Legacy-named symbol `seamark_cache_v2` in services/SeamarkService.ts:57"}, "properties": {"repobilityId": "292e23808c0f0035", "scanner": "scanner-primary", "fingerprint": "76d30624aff525b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ddf574f79a1f033e", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_mob_active_v1` in services/MobService.ts:19"}, "properties": {"repobilityId": "296520b62e412717", "scanner": "scanner-primary", "fingerprint": "ddf574f79a1f033e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3e552e354ccabf51", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/AlertNotifier.ts:112"}, "properties": {"repobilityId": "91ea1f9d4b102894", "scanner": "scanner-primary", "fingerprint": "3e552e354ccabf51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4421bc36a8788456", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/AnchorWatchSyncService.ts:117"}, "properties": {"repobilityId": "65b0fc544a5b6e86", "scanner": "scanner-primary", "fingerprint": "4421bc36a8788456", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d21822e723fd379", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/supabase.ts:166"}, "properties": {"repobilityId": "d062670b6c64f0af", "scanner": "scanner-primary", "fingerprint": "0d21822e723fd379", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d2b56eacaef27c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ConnectionPriorityService.ts:141"}, "properties": {"repobilityId": "dad15a22220d5fc7", "scanner": "scanner-primary", "fingerprint": "2d2b56eacaef27c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a22de3ab1e52b99", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/AnchorWatchService.ts:33"}, "properties": {"repobilityId": "e251eadc9d4cde76", "scanner": "scanner-primary", "fingerprint": "2a22de3ab1e52b99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b594930d65d563a", "level": "none", "message": {"text": "Commented-code block (12 lines) in services/IsochroneRouter.ts:285"}, "properties": {"repobilityId": "c91cc7d8378d038b", "scanner": "scanner-primary", "fingerprint": "2b594930d65d563a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92c745f38a066924", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/ReadinessCheckService.ts:283"}, "properties": {"repobilityId": "3bb5ec83e4937ac1", "scanner": "scanner-primary", "fingerprint": "92c745f38a066924", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39a854fac09ec52f", "level": "none", "message": {"text": "Commented-code block (10 lines) in services/BgGeoManager.ts:281"}, "properties": {"repobilityId": "21734f283f152abe", "scanner": "scanner-primary", "fingerprint": "39a854fac09ec52f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5f49f694f21a3e7", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_voyage_cache_v2` in services/nativeStorage.ts:8"}, "properties": {"repobilityId": "abe20f471f8e9d9c", "scanner": "scanner-primary", "fingerprint": "d5f49f694f21a3e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6dbc7db61bb4a9c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/nativeStorage.ts:54"}, "properties": {"repobilityId": "b2b2fc58aa943506", "scanner": "scanner-primary", "fingerprint": "6dbc7db61bb4a9c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80a07d8e4956f918", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/TideHeightService.ts:219"}, "properties": {"repobilityId": "cfb4d23ac7b2d081", "scanner": "scanner-primary", "fingerprint": "80a07d8e4956f918", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0df5ccc2b3fec5dc", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/OceanCurrentService.ts:105"}, "properties": {"repobilityId": "eaf870c77241217d", "scanner": "scanner-primary", "fingerprint": "0df5ccc2b3fec5dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed84c4cd3be2b4cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/EncImportService.ts:238"}, "properties": {"repobilityId": "1adfd2ade2c0074d", "scanner": "scanner-primary", "fingerprint": "ed84c4cd3be2b4cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f2fee618f1ab2a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/MBTilesService.ts:103"}, "properties": {"repobilityId": "8fe51f80da4050f5", "scanner": "scanner-primary", "fingerprint": "4f2fee618f1ab2a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2ba5951a4d861ef", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/AvNavService.ts:71"}, "properties": {"repobilityId": "ea75a884cbc71b88", "scanner": "scanner-primary", "fingerprint": "f2ba5951a4d861ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d0740a83b3b9529", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/AvNavService.ts:1378"}, "properties": {"repobilityId": "ba10dda014acc7ca", "scanner": "scanner-primary", "fingerprint": "8d0740a83b3b9529", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-40a2ce69c0fd3de5", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/MapboxDirectionsService.ts:113"}, "properties": {"repobilityId": "ce09e658dc0013cc", "scanner": "scanner-primary", "fingerprint": "40a2ce69c0fd3de5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a5f0241e9ebeaec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/MapboxDirectionsService.ts:92"}, "properties": {"repobilityId": "9533fe1fde5a5b93", "scanner": "scanner-primary", "fingerprint": "3a5f0241e9ebeaec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f07fbe17a53cbed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/AisStreamService.ts:76"}, "properties": {"repobilityId": "772ce65eb6353d48", "scanner": "scanner-primary", "fingerprint": "6f07fbe17a53cbed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71f8da7260a27c40", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/OsmRouteOverlayService.ts:120"}, "properties": {"repobilityId": "79de098f8b04c20f", "scanner": "scanner-primary", "fingerprint": "71f8da7260a27c40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecad538108e05d7d", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/InshoreRouter.ts:83"}, "properties": {"repobilityId": "27ef99bca1db8384", "scanner": "scanner-primary", "fingerprint": "ecad538108e05d7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-230503824c858eda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/InshoreRouter.ts:1970"}, "properties": {"repobilityId": "e0f714d217f87143", "scanner": "scanner-primary", "fingerprint": "230503824c858eda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97c8903427808433", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/WeatherWindowService.ts:105"}, "properties": {"repobilityId": "f8a07914ab3282a3", "scanner": "scanner-primary", "fingerprint": "97c8903427808433", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4146f8c3785e0267", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/WeatherWindowService.ts:250"}, "properties": {"repobilityId": "6588fa1714c2afc4", "scanner": "scanner-primary", "fingerprint": "4146f8c3785e0267", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6db5d0b3bf26c5aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/geminiService.ts:57"}, "properties": {"repobilityId": "9a49a7fc35b2dfce", "scanner": "scanner-primary", "fingerprint": "6db5d0b3bf26c5aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d1ffdbd23d1b35e", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/inshoreRouterEngine.ts:74"}, "properties": {"repobilityId": "9c538fe3b93f0f60", "scanner": "scanner-primary", "fingerprint": "8d1ffdbd23d1b35e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-252cb9d853d04fb9", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/fairlead.ts:182"}, "properties": {"repobilityId": "1c6bc2bec9f997a6", "scanner": "scanner-primary", "fingerprint": "252cb9d853d04fb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d836168a2c557e75", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/AlertMonitorService.ts:289"}, "properties": {"repobilityId": "2359e39d91ceb285", "scanner": "scanner-primary", "fingerprint": "d836168a2c557e75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26fd7a94e856602e", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/voyageCompute.ts:92"}, "properties": {"repobilityId": "9ee2b1b2c7332aae", "scanner": "scanner-primary", "fingerprint": "26fd7a94e856602e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b0e7f06df9eb1d2", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/VoyageService.ts:169"}, "properties": {"repobilityId": "814a71718e28dcdb", "scanner": "scanner-primary", "fingerprint": "1b0e7f06df9eb1d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c558b2d981a5784d", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/weatherRouter.ts:201"}, "properties": {"repobilityId": "9f41e0ff506b86cc", "scanner": "scanner-primary", "fingerprint": "c558b2d981a5784d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc7d05f1ec57c624", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/ww3CacheClient.ts:136"}, "properties": {"repobilityId": "ce7cf42f8ff040ab", "scanner": "scanner-primary", "fingerprint": "fc7d05f1ec57c624", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-984e7255666eb6af", "level": "none", "message": {"text": "Commented-code block (9 lines) in services/enc/EncHazardService.ts:557"}, "properties": {"repobilityId": "d65fa093752c875d", "scanner": "scanner-primary", "fingerprint": "984e7255666eb6af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5dea488166579cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/nmea2000/pgnDecoder.ts:118"}, "properties": {"repobilityId": "629c642a4b984e81", "scanner": "scanner-primary", "fingerprint": "a5dea488166579cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8484b281783ccf72", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/nmea2000/types.ts:34"}, "properties": {"repobilityId": "13513c9383f38353", "scanner": "scanner-primary", "fingerprint": "8484b281783ccf72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fa240bc90a50c66", "level": "none", "message": {"text": "Commented-code block (20 lines) in services/seaway/connector.ts:563"}, "properties": {"repobilityId": "7dd118c47b775943", "scanner": "scanner-primary", "fingerprint": "0fa240bc90a50c66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63f04d69be28403c", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/seaway/seawayRouter.ts:292"}, "properties": {"repobilityId": "baec607fd912d41c", "scanner": "scanner-primary", "fingerprint": "63f04d69be28403c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d6146ce43726099", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/locationType.ts:35"}, "properties": {"repobilityId": "434d6f40f8f0c5dd", "scanner": "scanner-primary", "fingerprint": "9d6146ce43726099", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f91612f4ad6d34d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/windField.ts:270"}, "properties": {"repobilityId": "55a67f9896ffff2e", "scanner": "scanner-primary", "fingerprint": "5f91612f4ad6d34d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-170adbf3860d6287", "level": "note", "message": {"text": "Legacy-named symbol `Active_Hurricanes_v1` in services/weather/CycloneTrackingService.ts:54"}, "properties": {"repobilityId": "3f83e78b6b63847c", "scanner": "scanner-primary", "fingerprint": "170adbf3860d6287", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2f22770545a16981", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/CycloneTrackingService.ts:374"}, "properties": {"repobilityId": "795072a3953ddd16", "scanner": "scanner-primary", "fingerprint": "2f22770545a16981", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e08a3e7d6ee997a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/CycloneTrackingService.ts:175"}, "properties": {"repobilityId": "8280cfaa35efa90e", "scanner": "scanner-primary", "fingerprint": "4e08a3e7d6ee997a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9c6207f2de559f71", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/pointWeather.ts:94"}, "properties": {"repobilityId": "7bf7733ebce01492", "scanner": "scanner-primary", "fingerprint": "9c6207f2de559f71", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93f0f6d593e20ac9", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/weather/WindDataController.ts:26"}, "properties": {"repobilityId": "e1fba99dee184c29", "scanner": "scanner-primary", "fingerprint": "93f0f6d593e20ac9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b04c42831a58f667", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/index.ts:35"}, "properties": {"repobilityId": "5e2d9bdf4b4d2532", "scanner": "scanner-primary", "fingerprint": "b04c42831a58f667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd98a32a25e962bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/ResumableGribFetcher.ts:50"}, "properties": {"repobilityId": "74c0405b92863aa2", "scanner": "scanner-primary", "fingerprint": "dd98a32a25e962bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8429512934bebbba", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/isobars.ts:884"}, "properties": {"repobilityId": "fb89ee5cfefec1db", "scanner": "scanner-primary", "fingerprint": "8429512934bebbba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef75ad9c6852974b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/isobars.ts:269"}, "properties": {"repobilityId": "00e2ad6b12654ece", "scanner": "scanner-primary", "fingerprint": "ef75ad9c6852974b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e160437141a223cd", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/weather/marineProximity.ts:51"}, "properties": {"repobilityId": "2c61384f1ef65092", "scanner": "scanner-primary", "fingerprint": "e160437141a223cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0460cb96250fcd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/useGribDownload.ts:4"}, "properties": {"repobilityId": "5bfd629e7b803be5", "scanner": "scanner-primary", "fingerprint": "e0460cb96250fcd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-929e89833c0e3fa0", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/weather/decodeGrib2Wind.ts:204"}, "properties": {"repobilityId": "cf14b88bfbb098cb", "scanner": "scanner-primary", "fingerprint": "929e89833c0e3fa0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfac96f99901ff02", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/weather/transformers.ts:105"}, "properties": {"repobilityId": "f6ad9829eb940826", "scanner": "scanner-primary", "fingerprint": "cfac96f99901ff02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de918049ab5254c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/api/unified.ts:139"}, "properties": {"repobilityId": "569fb3078b4cb5e0", "scanner": "scanner-primary", "fingerprint": "de918049ab5254c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54b4e1a92465a205", "level": "none", "message": {"text": "Commented-code block (10 lines) in services/weather/api/blitzortungLightning.ts:64"}, "properties": {"repobilityId": "aae2c37a96f6155e", "scanner": "scanner-primary", "fingerprint": "54b4e1a92465a205", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-950e38811af2d07b", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/stormglass.ts:17"}, "properties": {"repobilityId": "d4a0600c63cf5bf4", "scanner": "scanner-primary", "fingerprint": "950e38811af2d07b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-baf6b56b0c68c462", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/stormglass.ts:149"}, "properties": {"repobilityId": "ea3ad3fbaec3f917", "scanner": "scanner-primary", "fingerprint": "baf6b56b0c68c462", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e703692941da7f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/globalWind.ts:106"}, "properties": {"repobilityId": "6e491065e229ff90", "scanner": "scanner-primary", "fingerprint": "1e703692941da7f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f702b4e0064afd7", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/currentsGrid.ts:112"}, "properties": {"repobilityId": "56f2586a0d27520e", "scanner": "scanner-primary", "fingerprint": "3f702b4e0064afd7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c954f9930b477a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/currentsGrid.ts:59"}, "properties": {"repobilityId": "03f63678709f5adf", "scanner": "scanner-primary", "fingerprint": "5c954f9930b477a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ccdc2109c4f506d", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/wavesGrid.ts:112"}, "properties": {"repobilityId": "adfff69428be7425", "scanner": "scanner-primary", "fingerprint": "7ccdc2109c4f506d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e242fea5e97e5ed4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/wavesGrid.ts:59"}, "properties": {"repobilityId": "4330f5776b721ea6", "scanner": "scanner-primary", "fingerprint": "e242fea5e97e5ed4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0d11752ac6e0e5a", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/weather/api/geocoding.ts:28"}, "properties": {"repobilityId": "1fdc17c353d9c2ee", "scanner": "scanner-primary", "fingerprint": "e0d11752ac6e0e5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8797be8ee001d32a", "level": "none", "message": {"text": "Commented-code block (11 lines) in services/weather/api/openmeteo.ts:144"}, "properties": {"repobilityId": "0510971cc86f6011", "scanner": "scanner-primary", "fingerprint": "8797be8ee001d32a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2891b1e3e7885dd", "level": "none", "message": {"text": "Commented-code block (9 lines) in services/weather/api/base.ts:34"}, "properties": {"repobilityId": "6d170f2891948041", "scanner": "scanner-primary", "fingerprint": "a2891b1e3e7885dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c364efff2cfbef1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/weather/api/rainviewerIndex.ts:63"}, "properties": {"repobilityId": "2d264f912a60f61d", "scanner": "scanner-primary", "fingerprint": "c364efff2cfbef1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e01e5ca5c0c51f59", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainviewerIndex.ts:18"}, "properties": {"repobilityId": "29bb0b275cc7fcdc", "scanner": "scanner-primary", "fingerprint": "e01e5ca5c0c51f59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ed5cb961445e5ba0", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/sstGrid.ts:112"}, "properties": {"repobilityId": "02849f9371b8c89c", "scanner": "scanner-primary", "fingerprint": "ed5cb961445e5ba0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e624a0fbc6e237b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/sstGrid.ts:59"}, "properties": {"repobilityId": "5bb9f5de088adf69", "scanner": "scanner-primary", "fingerprint": "4e624a0fbc6e237b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e9475f56763d4db", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/rainbowPrecip.ts:148"}, "properties": {"repobilityId": "cfed03b8cbf0cd6b", "scanner": "scanner-primary", "fingerprint": "9e9475f56763d4db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44270166554505cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/rainbowPrecip.ts:148"}, "properties": {"repobilityId": "19885d3714e75ad5", "scanner": "scanner-primary", "fingerprint": "44270166554505cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef12beab94981008", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/weather/api/chlGrid.ts:112"}, "properties": {"repobilityId": "deeb361863b2eefd", "scanner": "scanner-primary", "fingerprint": "ef12beab94981008", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-413c4606047e827c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/chlGrid.ts:59"}, "properties": {"repobilityId": "78bf6b892ee58cf5", "scanner": "scanner-primary", "fingerprint": "413c4606047e827c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b1045dab53636b2", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/weather/api/weatherkit.ts:342"}, "properties": {"repobilityId": "e458d04ce604e96a", "scanner": "scanner-primary", "fingerprint": "6b1045dab53636b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b66713943c6d5c22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/seaiceGrid.ts:38"}, "properties": {"repobilityId": "0ceabb92b9e69f83", "scanner": "scanner-primary", "fingerprint": "b66713943c6d5c22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c6ea37a24b924a3", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_wt_rate_v1` in services/weather/api/worldtides.ts:24"}, "properties": {"repobilityId": "e08069c7818bccc5", "scanner": "scanner-primary", "fingerprint": "6c6ea37a24b924a3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a5305c7f80fcf39a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/worldtides.ts:13"}, "properties": {"repobilityId": "8230a5e89dc62c4c", "scanner": "scanner-primary", "fingerprint": "a5305c7f80fcf39a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e88b721bddc1255", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/weather/api/mldGrid.ts:34"}, "properties": {"repobilityId": "6776ecbe81a95642", "scanner": "scanner-primary", "fingerprint": "1e88b721bddc1255", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c29317789b5b8a2", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_chat_channels_v1` in services/chat/constants.ts:16"}, "properties": {"repobilityId": "60d285676e11cee7", "scanner": "scanner-primary", "fingerprint": "3c29317789b5b8a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-267af45e5ea3b45d", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/voice/safetyTts.ts:199"}, "properties": {"repobilityId": "a14badd433470e72", "scanner": "scanner-primary", "fingerprint": "267af45e5ea3b45d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d206f55355d020a8", "level": "none", "message": {"text": "Commented-code block (9 lines) in services/voice/speechRecognizer.ts:24"}, "properties": {"repobilityId": "086cfa5e7f3f1b4d", "scanner": "scanner-primary", "fingerprint": "d206f55355d020a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ad9bc05c4b18472", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/voice/deepgramRecognizer.ts:326"}, "properties": {"repobilityId": "f2a8932e6a908ac8", "scanner": "scanner-primary", "fingerprint": "5ad9bc05c4b18472", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa5c90f9efc51936", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudTools.ts:53"}, "properties": {"repobilityId": "409feb17c7e2165c", "scanner": "scanner-primary", "fingerprint": "fa5c90f9efc51936", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1095cc204266575d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/bosunVoice.ts:14"}, "properties": {"repobilityId": "297ad221c16f1d33", "scanner": "scanner-primary", "fingerprint": "1095cc204266575d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e2736940e19ac82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/cloudFallback.ts:15"}, "properties": {"repobilityId": "2eb8e90449212b8d", "scanner": "scanner-primary", "fingerprint": "2e2736940e19ac82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fdb6f66f0afb4e27", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/voice/orchestrator.ts:1047"}, "properties": {"repobilityId": "73c0502b6555780e", "scanner": "scanner-primary", "fingerprint": "fdb6f66f0afb4e27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-461975c0e434dd14", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/voice/piTools.ts:174"}, "properties": {"repobilityId": "bad6ad4f338dc328", "scanner": "scanner-primary", "fingerprint": "461975c0e434dd14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce3e741534e94eb0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/voice/integrations/gmail.ts:324"}, "properties": {"repobilityId": "d62a6ea11d291b3e", "scanner": "scanner-primary", "fingerprint": "ce3e741534e94eb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5843ce3625b9e09", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/voice/integrations/spokenAudio.ts:46"}, "properties": {"repobilityId": "c7812f5d3ccf932f", "scanner": "scanner-primary", "fingerprint": "f5843ce3625b9e09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d02a5da76f563d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/voice/integrations/appleMusic.ts:173"}, "properties": {"repobilityId": "dac1bd2b91d10fa7", "scanner": "scanner-primary", "fingerprint": "2d02a5da76f563d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-314bc3db77b24358", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/isochrone/output.ts:45"}, "properties": {"repobilityId": "8a42638f69618028", "scanner": "scanner-primary", "fingerprint": "314bc3db77b24358", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ffabc6c1e4558aa", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/isochrone/landAvoidance.ts:731"}, "properties": {"repobilityId": "8d3a3a09f9e5b693", "scanner": "scanner-primary", "fingerprint": "9ffabc6c1e4558aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c03018e5581a9454", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/shiplog/EntrySave.ts:46"}, "properties": {"repobilityId": "675d98f447965288", "scanner": "scanner-primary", "fingerprint": "c03018e5581a9454", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8411f1c41899c4eb", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/shiplog/PassagePlanSave.ts:55"}, "properties": {"repobilityId": "b7bf390205cd124e", "scanner": "scanner-primary", "fingerprint": "8411f1c41899c4eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-840539ef477dc576", "level": "note", "message": {"text": "Legacy-named symbol `thalassa_voyage_track_cache_v1` in services/shiplog/VoyageTrackCache.ts:28"}, "properties": {"repobilityId": "26f202e3e840cb47", "scanner": "scanner-primary", "fingerprint": "840539ef477dc576", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dfb80e0d22da9fd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/shiplog/RoutesAndTracks.ts:191"}, "properties": {"repobilityId": "7b4007da99effab2", "scanner": "scanner-primary", "fingerprint": "dfb80e0d22da9fd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a57ac430b1909163", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/shiplog/GpsSubscriptionManager.ts:43"}, "properties": {"repobilityId": "8ef3c25a6a5466f1", "scanner": "scanner-primary", "fingerprint": "a57ac430b1909163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4370e02d4b32f96f", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/shiplog/CourseChangeDetector.ts:231"}, "properties": {"repobilityId": "f7a73e76c198181b", "scanner": "scanner-primary", "fingerprint": "4370e02d4b32f96f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80ef269a636fde4c", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/shiplog/EntryCrud.ts:314"}, "properties": {"repobilityId": "15ac355b2289ed8c", "scanner": "scanner-primary", "fingerprint": "80ef269a636fde4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-448a4e88a9fe4b0b", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/shiplog/CapturePipeline.ts:66"}, "properties": {"repobilityId": "f8c2f5ac43527d3c", "scanner": "scanner-primary", "fingerprint": "448a4e88a9fe4b0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cb043912d877e22", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/shiplog/OfflineQueue.ts:21"}, "properties": {"repobilityId": "bb5324cfa3e07012", "scanner": "scanner-primary", "fingerprint": "2cb043912d877e22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2075490db3234d41", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 services/native/weatherKit.ts:29"}, "properties": {"repobilityId": "758c49215e5acc5a", "scanner": "scanner-primary", "fingerprint": "2075490db3234d41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-993d3d42be7098b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/senc-extractor/src/featureParser.ts:140"}, "properties": {"repobilityId": "b9189f1a0ed66d06", "scanner": "scanner-primary", "fingerprint": "993d3d42be7098b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16218c45ef242621", "level": "none", "message": {"text": "Commented-code block (8 lines) in tools/senc-extractor/src/s57Classes.ts:102"}, "properties": {"repobilityId": "120729d920f16627", "scanner": "scanner-primary", "fingerprint": "16218c45ef242621", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-959affe95a27be86", "level": "none", "message": {"text": "Commented-code block (5 lines) in context/WeatherContext.tsx:67"}, "properties": {"repobilityId": "26ff887d8364b0db", "scanner": "scanner-primary", "fingerprint": "959affe95a27be86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-486bab95dbbd175b", "level": "none", "message": {"text": "Commented-code block (12 lines) in public/sw.js:1"}, "properties": {"repobilityId": "0808ed4a92b15e31", "scanner": "scanner-primary", "fingerprint": "486bab95dbbd175b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c692dbf3270b360", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:115"}, "properties": {"repobilityId": "161f3d87d663ec0b", "scanner": "scanner-primary", "fingerprint": "3c692dbf3270b360", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c25049b194b3823e", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/generate_global_cog.py:191"}, "properties": {"repobilityId": "6fbdc07bfef2fc9d", "scanner": "scanner-primary", "fingerprint": "c25049b194b3823e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac6ce0e6d1dca97a", "level": "note", "message": {"text": "61 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d9bf04d375a56cee", "scanner": "scanner-primary", "fingerprint": "ac6ce0e6d1dca97a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "4697e356c7a70ae0", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2d4a4afb93267fc8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "6424b20a2a4524ac", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "4b22b3341f1c7403", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a91d6c3e95db4a04", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-68c565cc85ef85aa", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stormglass.io/... (utils/rateLimiter.ts:13)"}, "properties": {"repobilityId": "2c5a2c30b4d181dc", "scanner": "scanner-primary", "fingerprint": "68c565cc85ef85aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c35a56fe718b4b5", "level": "error", "message": {"text": "Dangling fetch: GET /wind_test.json (components/map/MapboxVelocityOverlay.tsx:430)"}, "properties": {"repobilityId": "a3b86e886e6d34b7", "scanner": "scanner-primary", "fingerprint": "1c35a56fe718b4b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ff39d57143c688e", "level": "error", "message": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${loc.lat}&lon=${loc.lon}&format=json&zoom=10&addressdetails=1 (hooks/useCrewFinderActions.ts:276)"}, "properties": {"repobilityId": "cb685b108baaf8b8", "scanner": "scanner-primary", "fingerprint": "1ff39d57143c688e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ee073e440f4c7797", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/elevenlabs-tts/index.ts:239)"}, "properties": {"repobilityId": "85f71df3864defc5", "scanner": "scanner-primary", "fingerprint": "ee073e440f4c7797", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ef1aad41e3237bd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (supabase/functions/proxy-bosun-fallback/index.ts:194)"}, "properties": {"repobilityId": "e974264c4f4529bc", "scanner": "scanner-primary", "fingerprint": "9ef1aad41e3237bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3fb4c7b94f1ce945", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (supabase/functions/proxy-bosun-fallback/index.ts:494)"}, "properties": {"repobilityId": "59748a9db79331d6", "scanner": "scanner-primary", "fingerprint": "3fb4c7b94f1ce945", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-536a9d35e376a5e1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/speech-to-text (supabase/functions/proxy-bosun-fallback/index.ts:562)"}, "properties": {"repobilityId": "ee0c2928d9a950af", "scanner": "scanner-primary", "fingerprint": "536a9d35e376a5e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-79672e1a31a101d9", "level": "error", "message": {"text": "Dangling fetch: POST https://overpass-api.de/api/interpreter (supabase/functions/route-weather/index.ts:222)"}, "properties": {"repobilityId": "72b18a11ef0fe406", "scanner": "scanner-primary", "fingerprint": "79672e1a31a101d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0dff60f546ac21c0", "level": "error", "message": {"text": "Dangling fetch: POST https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lon}&format=json&zoom=14&addressdetails=1 (services/DiaryService.ts:982)"}, "properties": {"repobilityId": "421ffb0c31b48b7a", "scanner": "scanner-primary", "fingerprint": "0dff60f546ac21c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e20917a89fad9ea", "level": "error", "message": {"text": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/forecast?${params} (services/weather/pointWeather.ts:94)"}, "properties": {"repobilityId": "bdb30a380efded3a", "scanner": "scanner-primary", "fingerprint": "6e20917a89fad9ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a7d134c8bc09aaf5", "level": "error", "message": {"text": "Dangling fetch: GET https://customer-api.open-meteo.com/v1/marine?${params} (services/weather/pointWeather.ts:131)"}, "properties": {"repobilityId": "9e1a5fc01fbd4e84", "scanner": "scanner-primary", "fingerprint": "a7d134c8bc09aaf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-535bec6eabffe8df", "level": "error", "message": {"text": "Dangling fetch: GET /pcm-worklet.js (services/voice/deepgramRecognizer.ts:543)"}, "properties": {"repobilityId": "2c80e3e6723b3c35", "scanner": "scanner-primary", "fingerprint": "535bec6eabffe8df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99b1c39ba76dd804", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:165)"}, "properties": {"repobilityId": "2601614f8af39b03", "scanner": "scanner-primary", "fingerprint": "99b1c39ba76dd804", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-44bc4fa42f250a99", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (services/voice/integrations/gmail.ts:296)"}, "properties": {"repobilityId": "e22e67fd0283115b", "scanner": "scanner-primary", "fingerprint": "44bc4fa42f250a99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df58271d6841c045", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (services/voice/integrations/gmail.ts:324)"}, "properties": {"repobilityId": "36928f4d11ca7820", "scanner": "scanner-primary", "fingerprint": "df58271d6841c045", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10bb185c90b821a1", "level": "error", "message": {"text": "Dangling fetch: GET https://gmail.googleapis.com/gmail/v1${path} (services/voice/integrations/gmail.ts:413)"}, "properties": {"repobilityId": "be29e5f43089d0bc", "scanner": "scanner-primary", "fingerprint": "10bb185c90b821a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3103c47763e94c88", "level": "note", "message": {"text": "Unused endpoint: ANY /scan"}, "properties": {"repobilityId": "9cf0ab6b42eefaa4", "scanner": "scanner-primary", "fingerprint": "3103c47763e94c88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93e0499a4cccdb84", "level": "note", "message": {"text": "Unused endpoint: ANY /configure"}, "properties": {"repobilityId": "3c11de9d4b532e07", "scanner": "scanner-primary", "fingerprint": "93e0499a4cccdb84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f2b812a7d0822f4", "level": "note", "message": {"text": "Unused endpoint: USE /__chart-proxy"}, "properties": {"repobilityId": "809cf9e5f20ad7a0", "scanner": "scanner-primary", "fingerprint": "6f2b812a7d0822f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf57b523f8e38c84", "level": "note", "message": {"text": "Unused endpoint: POST /api/configure"}, "properties": {"repobilityId": "414f8bc8ca4e536e", "scanner": "scanner-primary", "fingerprint": "bf57b523f8e38c84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2693d6713b74063d", "level": "note", "message": {"text": "Unused endpoint: POST /cache/purge"}, "properties": {"repobilityId": "fd984de3bcb0ac82", "scanner": "scanner-primary", "fingerprint": "2693d6713b74063d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eae4f6f211cad08b", "level": "note", "message": {"text": "Unused endpoint: GET /api/passthrough"}, "properties": {"repobilityId": "d83a2042abaede1b", "scanner": "scanner-primary", "fingerprint": "eae4f6f211cad08b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e348df69b8d24c1b", "level": "note", "message": {"text": "Unused endpoint: GET /api/passthrough-tile"}, "properties": {"repobilityId": "c56791ebf6f15c9a", "scanner": "scanner-primary", "fingerprint": "e348df69b8d24c1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83e27b789830003c", "level": "note", "message": {"text": "Unused endpoint: USE /api/weather"}, "properties": {"repobilityId": "ec58498f1ccf26bf", "scanner": "scanner-primary", "fingerprint": "83e27b789830003c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e74f241469bb428", "level": "note", "message": {"text": "Unused endpoint: USE /api/tiles"}, "properties": {"repobilityId": "7622848978a66e96", "scanner": "scanner-primary", "fingerprint": "5e74f241469bb428", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-197725f7373dd55e", "level": "note", "message": {"text": "Unused endpoint: USE /api/grib"}, "properties": {"repobilityId": "da6daf3d545a2bea", "scanner": "scanner-primary", "fingerprint": "197725f7373dd55e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae03a0feb97f40ed", "level": "note", "message": {"text": "Unused endpoint: USE /api/tides"}, "properties": {"repobilityId": "b2af6e687a91756b", "scanner": "scanner-primary", "fingerprint": "ae03a0feb97f40ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c05932b2e4ecf935", "level": "note", "message": {"text": "Unused endpoint: USE /api/misc"}, "properties": {"repobilityId": "8f909879f4c7203a", "scanner": "scanner-primary", "fingerprint": "c05932b2e4ecf935", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36deb4d183565705", "level": "note", "message": {"text": "Unused endpoint: USE /api/charts"}, "properties": {"repobilityId": "141116979ab22db7", "scanner": "scanner-primary", "fingerprint": "36deb4d183565705", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b869c94ab9c2f15", "level": "note", "message": {"text": "Unused endpoint: USE /api/enc"}, "properties": {"repobilityId": "29439425e6439c12", "scanner": "scanner-primary", "fingerprint": "5b869c94ab9c2f15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db374bee080704ff", "level": "note", "message": {"text": "Unused endpoint: USE /api/osm"}, "properties": {"repobilityId": "621c6de234bd7828", "scanner": "scanner-primary", "fingerprint": "db374bee080704ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5654b898499633a4", "level": "note", "message": {"text": "Unused endpoint: POST /download"}, "properties": {"repobilityId": "d9049b6369e519a4", "scanner": "scanner-primary", "fingerprint": "5654b898499633a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-09ee72aea5a0a2b7", "level": "note", "message": {"text": "Unused endpoint: GET /jobs/:id"}, "properties": {"repobilityId": "c0f1a7ea7a7d145c", "scanner": "scanner-primary", "fingerprint": "09ee72aea5a0a2b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1008c575819b3d37", "level": "note", "message": {"text": "Unused endpoint: GET /jobs"}, "properties": {"repobilityId": "91e12d60db2e712e", "scanner": "scanner-primary", "fingerprint": "1008c575819b3d37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab4c2b12dfecc620", "level": "note", "message": {"text": "Unused endpoint: GET /local"}, "properties": {"repobilityId": "d0ca5ea7b5f7d7ed", "scanner": "scanner-primary", "fingerprint": "ab4c2b12dfecc620", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-25b23a43c01624e1", "level": "note", "message": {"text": "Unused endpoint: DELETE /local/:name"}, "properties": {"repobilityId": "86ef0e2952d4056c", "scanner": "scanner-primary", "fingerprint": "25b23a43c01624e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-959e83c0a87139d8", "level": "note", "message": {"text": "Unused endpoint: GET /current"}, "properties": {"repobilityId": "f30e8e51bfd734bb", "scanner": "scanner-primary", "fingerprint": "959e83c0a87139d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-441c9cf1a68ef8e7", "level": "note", "message": {"text": "Unused endpoint: GET /forecast"}, "properties": {"repobilityId": "8df86ae6e94a9773", "scanner": "scanner-primary", "fingerprint": "441c9cf1a68ef8e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e425a5b4242593d", "level": "note", "message": {"text": "Unused endpoint: GET /marine"}, "properties": {"repobilityId": "234a4bbd01823b5f", "scanner": "scanner-primary", "fingerprint": "3e425a5b4242593d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40f67c739707368b", "level": "note", "message": {"text": "Unused endpoint: GET /combined"}, "properties": {"repobilityId": "e60cc405f18c370f", "scanner": "scanner-primary", "fingerprint": "40f67c739707368b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6d536ad0938cb18", "level": "note", "message": {"text": "Unused endpoint: GET /unified"}, "properties": {"repobilityId": "5f068752bb98b329", "scanner": "scanner-primary", "fingerprint": "e6d536ad0938cb18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2eee892bc5d610ce", "level": "note", "message": {"text": "Unused endpoint: GET /stormglass"}, "properties": {"repobilityId": "5ec616f2514fb93f", "scanner": "scanner-primary", "fingerprint": "2eee892bc5d610ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-285702a1808bf98b", "level": "note", "message": {"text": "Unused endpoint: GET /gibs/:layer/:z/:x/:y"}, "properties": {"repobilityId": "ed868a5db0a2eef1", "scanner": "scanner-primary", "fingerprint": "285702a1808bf98b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a20fe3ef12a61333", "level": "note", "message": {"text": "Unused endpoint: GET /realearth/:product/:z/:x/:y"}, "properties": {"repobilityId": "1ff9fac9e00278f9", "scanner": "scanner-primary", "fingerprint": "a20fe3ef12a61333", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e48d7c02bde16b0", "level": "note", "message": {"text": "Unused endpoint: GET /nowcoast/:layer/:z/:x/:y"}, "properties": {"repobilityId": "bf8a9c7e96463357", "scanner": "scanner-primary", "fingerprint": "7e48d7c02bde16b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3d6f2b95539b695", "level": "note", "message": {"text": "Unused endpoint: GET /openseamap/:z/:x/:y"}, "properties": {"repobilityId": "1f9c606e29693484", "scanner": "scanner-primary", "fingerprint": "c3d6f2b95539b695", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ce2c16ba2fee3cd", "level": "note", "message": {"text": "Unused endpoint: GET /gebco/:z/:x/:y"}, "properties": {"repobilityId": "d6c16669bd1270ac", "scanner": "scanner-primary", "fingerprint": "2ce2c16ba2fee3cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3ab1b3ccec519bd", "level": "note", "message": {"text": "Unused endpoint: GET /rainviewer/:z/:x/:y"}, "properties": {"repobilityId": "32395aba38333936", "scanner": "scanner-primary", "fingerprint": "e3ab1b3ccec519bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a41ee867a3007a5", "level": "note", "message": {"text": "Unused endpoint: GET /cyclones"}, "properties": {"repobilityId": "d4919bf96751f047", "scanner": "scanner-primary", "fingerprint": "7a41ee867a3007a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d802da5f02a8abc", "level": "note", "message": {"text": "Unused endpoint: GET /cyclones/:id"}, "properties": {"repobilityId": "e021e4ffd80ecd23", "scanner": "scanner-primary", "fingerprint": "1d802da5f02a8abc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf0e253f0242c164", "level": "note", "message": {"text": "Unused endpoint: GET /buoys"}, "properties": {"repobilityId": "18f690b1b60ac9a1", "scanner": "scanner-primary", "fingerprint": "bf0e253f0242c164", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8a3f62be3874314", "level": "note", "message": {"text": "Unused endpoint: GET /buoys/:stationId"}, "properties": {"repobilityId": "7c9d83276f3f886e", "scanner": "scanner-primary", "fingerprint": "e8a3f62be3874314", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a1d171910619e87", "level": "note", "message": {"text": "Unused endpoint: GET /seamarks"}, "properties": {"repobilityId": "8ced5376674242d4", "scanner": "scanner-primary", "fingerprint": "3a1d171910619e87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ac1eab3f2a34b2e", "level": "note", "message": {"text": "Unused endpoint: GET /geocode"}, "properties": {"repobilityId": "af3025ac2fd16ed6", "scanner": "scanner-primary", "fingerprint": "0ac1eab3f2a34b2e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e2307836cad63ff", "level": "note", "message": {"text": "Unused endpoint: GET /precipitation"}, "properties": {"repobilityId": "a968ae6d653e2f1e", "scanner": "scanner-primary", "fingerprint": "8e2307836cad63ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60dac49b47f3c8b6", "level": "note", "message": {"text": "Unused endpoint: GET /proxy/:functionName"}, "properties": {"repobilityId": "a6d7511adf0421e6", "scanner": "scanner-primary", "fingerprint": "60dac49b47f3c8b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d79f11aaf559c991", "level": "note", "message": {"text": "Unused endpoint: GET /wind"}, "properties": {"repobilityId": "d1a0246f426032a8", "scanner": "scanner-primary", "fingerprint": "d79f11aaf559c991", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ef627628a12e4eb", "level": "note", "message": {"text": "Unused endpoint: GET /pressure"}, "properties": {"repobilityId": "5502c2973e3adeeb", "scanner": "scanner-primary", "fingerprint": "7ef627628a12e4eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a601ea39c1bc804", "level": "note", "message": {"text": "Unused endpoint: GET /waves"}, "properties": {"repobilityId": "f398c8475fc54be6", "scanner": "scanner-primary", "fingerprint": "9a601ea39c1bc804", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26ea4fbba1638b54", "level": "note", "message": {"text": "Unused endpoint: GET /precip"}, "properties": {"repobilityId": "42bb85e4c393b856", "scanner": "scanner-primary", "fingerprint": "26ea4fbba1638b54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5209a627265c212f", "level": "note", "message": {"text": "Unused endpoint: GET /composite"}, "properties": {"repobilityId": "5e30c9bf950986cb", "scanner": "scanner-primary", "fingerprint": "5209a627265c212f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-413c1dd2f1e61c75", "level": "note", "message": {"text": "Unused endpoint: POST /wind-grid"}, "properties": {"repobilityId": "4c583fe3d941f82b", "scanner": "scanner-primary", "fingerprint": "413c1dd2f1e61c75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4c173947c138f9f", "level": "note", "message": {"text": "Unused endpoint: GET /noaa"}, "properties": {"repobilityId": "6f80eaeb2d81c377", "scanner": "scanner-primary", "fingerprint": "d4c173947c138f9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a30972c54bee6925", "level": "note", "message": {"text": "Unused endpoint: GET /overlay"}, "properties": {"repobilityId": "8a0b914139ed0cd5", "scanner": "scanner-primary", "fingerprint": "a30972c54bee6925", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37583ca7e4c862e2", "level": "note", "message": {"text": "Unused endpoint: POST /convert"}, "properties": {"repobilityId": "ae35c9ba830a0860", "scanner": "scanner-primary", "fingerprint": "37583ca7e4c862e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b25200cad51d564", "level": "note", "message": {"text": "Unused endpoint: GET /result/:id"}, "properties": {"repobilityId": "461e48e3cfb8d386", "scanner": "scanner-primary", "fingerprint": "2b25200cad51d564", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}