{"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: vladenisov/tripl", "shortDescription": {"text": "Foundry mined unresolved feedback: vladenisov/tripl"}, "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: vladenisov/tripl\nThread: vladenisov/tripl#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: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, 'iss"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: vladenisov/tripl", "shortDescription": {"text": "Foundry mined blueprint gap alignment: vladenisov/tripl"}, "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: vladenisov/tripl\nThread: vladenisov/tripl#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: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, "}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: vladenisov/tripl", "shortDescription": {"text": "Foundry mined assumption checks: vladenisov/tripl"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#2\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_high_confidence\nChain evidence:\nIssue/PR evidence chain: vladenisov/tripl#2\nRepo: vladenisov/tripl\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 13\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'api_or_backend': 9, 'test_or_ci': 2, 'ui_or_frontend': 2}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-d5139ae3b1be2b3b\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_schema_ui_api_gap", "name": "Foundry mined schema ui api mismatch: vladenisov/tripl", "shortDescription": {"text": "Foundry mined schema ui api mismatch: vladenisov/tripl"}, "fullDescription": {"text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: supported_by_verification_signal\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'b"}, "properties": {"scanner": "foundry_dataset", "category": "quality", "severity": "high", "confidence": 0.76, "cwe": "", "owasp": ""}}, {"id": "scanner-b4017a873124d7ce", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "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-c6309d482c8092a6", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-16c3a66b711f3fdb", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-8c22776356d9d8ea", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-e4f7899e1bcac1f3", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-7c760e43e5d06e69", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-4c5a694899c86c08", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-6f9bd82af5f1c2e5", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-7f9f0aa71f62e202", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-cdb990a017d894db", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-eed9ae46691eef91", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-ab25cf897289419c", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-5a8ca732fa5bf3cc", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-114bf61533c4a313", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-d3ab9394dc9160cf", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-6d836b64f677ca2a", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-415712ecedb14ac8", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-0600754caf6af226", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-6ce77a06359c099b", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-9cf485d8a6f096ac", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-1389e8793f7e6a18", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-773d54b715ac31fa", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-6551661611417497", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-efff45bec33e738d", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-68e98083c82b6df2", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-6839b7b37322fe3b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-88818e8fe2b3978b", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-dfe7c2aa85773b1c", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-83f87f98af2ca787", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-0b20aae855a363d1", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-20cffe7c41ed923b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/branch-switcher.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/branch-switcher.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1c922b4b86c30dd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/command-palette.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/command-palette.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e31e15428a2da81", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/app-sidebar.tsx:219", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/app-sidebar.tsx:219"}, "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-bee40859e505a469", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/top-bar.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/top-bar.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-531ce2e218e46ff2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/event-photos-section.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/event-photos-section.tsx:326"}, "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-86a68cabedaf7294", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/variable-value-contexts.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/variable-value-contexts.tsx:29"}, "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-ede4041cd59926bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/release-regression-panel.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/release-regression-panel.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-3c9db271edb137f9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/top-movers-panel.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/top-movers-panel.tsx:137"}, "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-9ed585003500c840", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/chart.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/chart.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98f3d2c521e8de21", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitoringDetailPage.tsx:577", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitoringDetailPage.tsx:577"}, "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-d89b08dccafc2ec8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/OverviewPage.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/OverviewPage.tsx:295"}, "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-e31fb11d0147da2f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitorsPage.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitorsPage.tsx:160"}, "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-b9f02de203436d84", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ReconciliationPage.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ReconciliationPage.tsx:170"}, "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-c7c86d862249fdcf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DataSourcesPage.tsx:507", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DataSourcesPage.tsx:507"}, "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-477655228e1c7493", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectsPage.tsx:583", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectsPage.tsx:583"}, "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-febba691099c7fc6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectAlertingTab.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectAlertingTab.tsx:344"}, "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-0763b7bc5fa3ba40", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/AuditTab.tsx:267", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/AuditTab.tsx:267"}, "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-32451953279feeb2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/HistoryTab.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/HistoryTab.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-b1892274979b178d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/MetricBreakdownPicker.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/MetricBreakdownPicker.tsx:71"}, "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-d16e72c6a622783f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/ScanPreviewPanel.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/ScanPreviewPanel.tsx:51"}, "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-169870dce8e3748b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/DistributionDriftPicker.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/DistributionDriftPicker.tsx:48"}, "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-1543f1443bbd814a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventForm.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventForm.tsx:298"}, "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-8d5bbf801882a21f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/SavedViewsMenu.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/SavedViewsMenu.tsx:31"}, "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-cec1dd9b6eb0761a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnFilter.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnFilter.tsx:158"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-184399fffc38a9ab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnsMenu.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnsMenu.tsx:143"}, "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-eb0b69df944b52a7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventRow.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventRow.tsx:131"}, "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-bf960e27e5c941f2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventWindowMetricsCell.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventWindowMetricsCell.tsx:60"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56d151164695afdf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/RuleReplayDialog.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/RuleReplayDialog.tsx:250"}, "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-c0de2ee1fe9d6f00", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/FilterEditor.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/FilterEditor.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-60427b03771411b6", "name": "Dockerfile runs as root: frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/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-922357bc2fb07f39", "name": "Docker base image is tag-pinned but not digest-pinned: node:26-trixie-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:26-trixie-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-b61acc5cc789bc21", "name": "Docker base image is tag-pinned but not digest-pinned: alpine:3.24", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: alpine:3.24"}, "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-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/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-d90cecb342a72873", "name": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:python3.14-trixie-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:python3.14-trixie-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-96a03d8598608729", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim-trixie", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim-trixie"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-467fa106cd1c1c9e", "name": "Very large file: frontend/src/pages/ProjectSettingsPage.test.tsx (1576 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/ProjectSettingsPage.test.tsx (1576 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-2a8ed3b3cbd34813", "name": "Very large file: backend/src/tripl/tests/test_metrics_tasks.py (3597 lines)", "shortDescription": {"text": "Very large file: backend/src/tripl/tests/test_metrics_tasks.py (3597 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-38b8c4ae1f02b37b", "name": "Very large file: backend/src/tripl/tests/test_metrics_api.py (1545 lines)", "shortDescription": {"text": "Very large file: backend/src/tripl/tests/test_metrics_api.py (1545 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-1ebf6fe2fb669178", "name": "Very large file: backend/src/tripl/tests/test_alerting.py (3175 lines)", "shortDescription": {"text": "Very large file: backend/src/tripl/tests/test_alerting.py (3175 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": "72 tests / 462 src (ratio 0.16)."}, "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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 106 placeholder/mock markers across 38 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. 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, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97831b64a8f5a8e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/eventPhotos.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/eventPhotos.ts:17"}, "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-3bca9ed6a603f9a4", "name": "Commented-code block (7 lines) in frontend/src/pages/events/useEventRowMetrics.ts:13", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/pages/events/useEventRowMetrics.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-135b4a39892a9838", "name": "Commented-code block (7 lines) in backend/alembic/versions/e0f1a2b3c4d5_add_event_status_and_event_changes.py:26", "shortDescription": {"text": "Commented-code block (7 lines) in backend/alembic/versions/e0f1a2b3c4d5_add_event_status_and_event_changes.py: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-54582cd920c34e0c", "name": "Commented-code block (5 lines) in backend/src/tripl/config.py:83", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/tripl/config.py: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-d7894420838916f4", "name": "Commented-code block (7 lines) in backend/src/tripl/main.py:54", "shortDescription": {"text": "Commented-code block (7 lines) in backend/src/tripl/main.py: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-9d29cbe4656be929", "name": "Legacy-named symbol `never_seen_old` in backend/src/tripl/tests/test_reconciliation.py:262", "shortDescription": {"text": "Legacy-named symbol `never_seen_old` in backend/src/tripl/tests/test_reconciliation.py:262"}, "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-21234d69d2f4a5d1", "name": "Commented-code block (6 lines) in backend/src/tripl/api/v1/users.py:47", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/tripl/api/v1/users.py: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-05de82702c308acd", "name": "Commented-code block (5 lines) in backend/src/tripl/worker/analyzers/anomaly_detector.py:27", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/analyzers/anomaly_detector.py:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be734103b886099a", "name": "Commented-code block (9 lines) in backend/src/tripl/worker/tasks/metrics/schedule.py:34", "shortDescription": {"text": "Commented-code block (9 lines) in backend/src/tripl/worker/tasks/metrics/schedule.py: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-f5beadbcd66df111", "name": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/tasks.py:416", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/tasks.py:416"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf3dfeb8475e072f", "name": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/schema_drift.py:21", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/schema_drift.py: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-11b836edcff5915d", "name": "Commented-code block (6 lines) in backend/src/tripl/worker/tasks/metrics/_helpers.py:45", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/tripl/worker/tasks/metrics/_helpers.py: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-1adba60eaa912841", "name": "Legacy-named symbol `model_copy` in backend/src/tripl/services/project_service.py:384", "shortDescription": {"text": "Legacy-named symbol `model_copy` in backend/src/tripl/services/project_service.py:384"}, "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-9f464e92b9477616", "name": "Commented-code block (5 lines) in backend/src/tripl/services/event_service.py:110", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/tripl/services/event_service.py:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3b6beed3ce69f88", "name": "Commented-code block (7 lines) in backend/src/tripl/services/demo_service.py:301", "shortDescription": {"text": "Commented-code block (7 lines) in backend/src/tripl/services/demo_service.py:301"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-29d908a99f4551bd", "name": "Legacy-named symbol `_event_copy` in backend/src/tripl/services/activity_service.py:242", "shortDescription": {"text": "Legacy-named symbol `_event_copy` in backend/src/tripl/services/activity_service.py:242"}, "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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `VITE_PROXY_TARGET`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "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:\nbackend/alembic/versions/e4f5a6b7c8d9_convert_string_columns_to_enums.py:downgrade, backend/alembic/versions/f5a6b7c8d9e0_convert_remaining_string_columns_to_enums.py:downgrade\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-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:\nbackend/src/tripl/anomaly_context.py:load_top_movers, backend/src/tripl/anomaly_context.py:load_recent_metric_points, backend/src/tripl/anomaly_context.py:build_alert_item_context\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-9d046ecb3dfe678d", "name": "Frontend route `/settings/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/pages/DataSourcesPage.test.tsx", "shortDescription": {"text": "Frontend route `/settings/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/pages/DataSourcesPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b577acaa64d5fa05", "name": "Frontend route `/settings/:tab` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/settings/:tab` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e18285690d66ccdf", "name": "Frontend route `/data-sources` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/data-sources` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9fd55005c088c86", "name": "Frontend route `/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-baf95c39c979811d", "name": "Frontend route `/users` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/users` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-deec1d9cf1f3a53c", "name": "Frontend route `/account` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/account` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9834291f65a09981", "name": "Frontend route `/p/:slug/monitoring` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/monitoring` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c19aeafa019325e", "name": "Frontend route `/p/:slug/alerting` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/alerting` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c959b717856468f5", "name": "Frontend route `/p/:slug/events/detail/:eventId` has no Link/navigate to it \u2014 frontend/src/components/command-palette.te", "shortDescription": {"text": "Frontend route `/p/:slug/events/detail/:eventId` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-416baef9d5c4a852", "name": "Frontend route `/p/:slug/monitoring/:scope/:id` has no Link/navigate to it \u2014 frontend/src/pages/MonitoringDetailPage.tes", "shortDescription": {"text": "Frontend route `/p/:slug/monitoring/:scope/:id` has no Link/navigate to it \u2014 frontend/src/pages/MonitoringDetailPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20cb4912bf2a8ede", "name": "Frontend route `/p/:slug/events/:tab/:eventId` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/events/:tab/:eventId` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6f52f27b602e3c4", "name": "Frontend route `/p/:slug/events/:tab` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/events/:tab` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85885157a22811b2", "name": "Frontend route `/p/:slug/events` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/events` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04c86cfdbcb86192", "name": "Frontend route `/p/:slug/overview` has no Link/navigate to it \u2014 frontend/src/pages/OverviewPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/overview` has no Link/navigate to it \u2014 frontend/src/pages/OverviewPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-563b553064754cc2", "name": "Frontend route `/p/:slug/monitors` has no Link/navigate to it \u2014 frontend/src/pages/MonitorsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/monitors` has no Link/navigate to it \u2014 frontend/src/pages/MonitorsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dea9d9d715a293a9", "name": "Frontend route `/p/:slug/reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2b5c14737aead53", "name": "Frontend route `/p/:slug/settings/:tab/:itemId` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test", "shortDescription": {"text": "Frontend route `/p/:slug/settings/:tab/:itemId` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0cffa63b15f510cc", "name": "Frontend route `/p/:slug/settings/:tab` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/settings/:tab` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4947ae5a193c114", "name": "Frontend route `/p/:slug/settings` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx", "shortDescription": {"text": "Frontend route `/p/:slug/settings` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c1c82a6c9a9f829", "name": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc040d7a24de92cf", "name": "FastAPI POST `create_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:18", "shortDescription": {"text": "FastAPI POST `create_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:18"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31787c47d8eebe04", "name": "FastAPI POST `create_demo_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:28", "shortDescription": {"text": "FastAPI POST `create_demo_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:28"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59b458e5988187a7", "name": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:43", "shortDescription": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:43"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-741f7a08ed1954f4", "name": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:52", "shortDescription": {"text": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:52"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26a23850a45e7476", "name": "FastAPI POST `get_events_window_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:58", "shortDescription": {"text": "FastAPI POST `get_events_window_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:58"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e63516b63378c59", "name": "FastAPI POST `query_active_signals` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:163", "shortDescription": {"text": "FastAPI POST `query_active_signals` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:163"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e273bb3734eeb3dd", "name": "FastAPI POST `add_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:22", "shortDescription": {"text": "FastAPI POST `add_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:22"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-095a2099cbd19496", "name": "FastAPI DELETE `remove_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:46", "shortDescription": {"text": "FastAPI DELETE `remove_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:46"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-453f394aebdc39e4", "name": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:32", "shortDescription": {"text": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:32"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13f627bdd856fcbe", "name": "FastAPI DELETE `revoke_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:80", "shortDescription": {"text": "FastAPI DELETE `revoke_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:80"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e980c6bd85754df8", "name": "FastAPI POST `accept_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:38", "shortDescription": {"text": "FastAPI POST `accept_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:38"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4dea465d3577923b", "name": "FastAPI POST `dismiss_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:60", "shortDescription": {"text": "FastAPI POST `dismiss_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:60"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c257408e4e5f95d", "name": "FastAPI POST `create_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:24", "shortDescription": {"text": "FastAPI POST `create_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:24"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e5c60232e2c9d4ed", "name": "FastAPI PATCH `update_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:56", "shortDescription": {"text": "FastAPI PATCH `update_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:56"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5d0be6bfe303404", "name": "FastAPI DELETE `delete_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:79", "shortDescription": {"text": "FastAPI DELETE `delete_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:79"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae59aa2cf7e6ef02", "name": "FastAPI POST `create_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:28", "shortDescription": {"text": "FastAPI POST `create_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:28"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa42027f2349103a", "name": "FastAPI POST `preview_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:49", "shortDescription": {"text": "FastAPI POST `preview_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:49"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72f9d465854fd544", "name": "FastAPI PATCH `update_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:82", "shortDescription": {"text": "FastAPI PATCH `update_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:82"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9701b586e82ce59", "name": "FastAPI DELETE `delete_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:104", "shortDescription": {"text": "FastAPI DELETE `delete_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:104"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4e237d93119db4d", "name": "FastAPI POST `run_scan` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:125", "shortDescription": {"text": "FastAPI POST `run_scan` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:125"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c5003f990810cdae", "name": "FastAPI POST `apply_scan_event_groups` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:135", "shortDescription": {"text": "FastAPI POST `apply_scan_event_groups` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:135"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6065412629dcb18e", "name": "FastAPI POST `replay_scan_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:161", "shortDescription": {"text": "FastAPI POST `replay_scan_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:161"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f362e5a9e2c6811c", "name": "FastAPI POST `cancel_scan_job` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:191", "shortDescription": {"text": "FastAPI POST `cancel_scan_job` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:191"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7c8c49bb1aacbaa0", "name": "FastAPI POST `upload_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:55", "shortDescription": {"text": "FastAPI POST `upload_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:55"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7b9ec9a8a377197", "name": "FastAPI PATCH `reorder_event_photos` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:76", "shortDescription": {"text": "FastAPI PATCH `reorder_event_photos` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:76"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc0301f0c41d6876", "name": "FastAPI DELETE `delete_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:89", "shortDescription": {"text": "FastAPI DELETE `delete_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:89"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eebcb97c4c55500f", "name": "FastAPI POST `attach_figma_spec` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:128", "shortDescription": {"text": "FastAPI POST `attach_figma_spec` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:128"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c49faca05e80ec3", "name": "FastAPI POST `create_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:158", "shortDescription": {"text": "FastAPI POST `create_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:158"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1df59cf9a2e76f83", "name": "FastAPI DELETE `delete_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:179", "shortDescription": {"text": "FastAPI DELETE `delete_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:179"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-491ec58eaf16623b", "name": "FastAPI POST `create_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:62", "shortDescription": {"text": "FastAPI POST `create_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:62"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-75c08661e401322a", "name": "FastAPI POST `bulk_create_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:74", "shortDescription": {"text": "FastAPI POST `bulk_create_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:74"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a908ea1fe0e99e8", "name": "FastAPI POST `bulk_delete_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:86", "shortDescription": {"text": "FastAPI POST `bulk_delete_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:86"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae8d3815089dad5d", "name": "FastAPI POST `bulk_update_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:93", "shortDescription": {"text": "FastAPI POST `bulk_update_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:93"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-002eb9257f5f6024", "name": "FastAPI PATCH `reorder_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:104", "shortDescription": {"text": "FastAPI PATCH `reorder_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:104"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d56cbc805b37d362", "name": "FastAPI PATCH `update_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:129", "shortDescription": {"text": "FastAPI PATCH `update_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:129"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7374b064abf5284c", "name": "FastAPI PATCH `move_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:146", "shortDescription": {"text": "FastAPI PATCH `move_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:146"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e285bcee5143b37e", "name": "FastAPI DELETE `delete_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:161", "shortDescription": {"text": "FastAPI DELETE `delete_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:161"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b428f015d70ea28", "name": "FastAPI PATCH `update_user_role` without auth dependency \u2014 backend/src/tripl/api/v1/users.py:24", "shortDescription": {"text": "FastAPI PATCH `update_user_role` without auth dependency \u2014 backend/src/tripl/api/v1/users.py:24"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84e4742ecde18b82", "name": "FastAPI POST `describe_event` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:38", "shortDescription": {"text": "FastAPI POST `describe_event` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:38"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29b4aa7315ed0250", "name": "FastAPI POST `describe_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:50", "shortDescription": {"text": "FastAPI POST `describe_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:50"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96ffa446223188e5", "name": "FastAPI POST `ask_plan` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:67", "shortDescription": {"text": "FastAPI POST `ask_plan` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:67"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-27f63309376b87c8", "name": "FastAPI POST `create_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:43", "shortDescription": {"text": "FastAPI POST `create_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:43"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20f416afd1e4f780", "name": "FastAPI DELETE `delete_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:64", "shortDescription": {"text": "FastAPI DELETE `delete_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:64"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2186c8c545e73510", "name": "FastAPI POST `create_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:30", "shortDescription": {"text": "FastAPI POST `create_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:30"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67de55260aefe79e", "name": "FastAPI POST `bulk_create_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:53", "shortDescription": {"text": "FastAPI POST `bulk_create_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:53"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a78f77d742e26706", "name": "FastAPI PATCH `reorder_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:79", "shortDescription": {"text": "FastAPI PATCH `reorder_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:79"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07dceb20be6d64d2", "name": "FastAPI PATCH `update_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:94", "shortDescription": {"text": "FastAPI PATCH `update_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:94"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9746f73b977dc103", "name": "FastAPI DELETE `delete_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:120", "shortDescription": {"text": "FastAPI DELETE `delete_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:120"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9d370aeca8081b5", "name": "FastAPI POST `reindex_project_search` without auth dependency \u2014 backend/src/tripl/api/v1/search.py:35", "shortDescription": {"text": "FastAPI POST `reindex_project_search` without auth dependency \u2014 backend/src/tripl/api/v1/search.py:35"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2cfc7be94a49f52", "name": "FastAPI POST `create_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:26", "shortDescription": {"text": "FastAPI POST `create_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:26"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43eb1f1118ac1d92", "name": "FastAPI PATCH `update_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:50", "shortDescription": {"text": "FastAPI PATCH `update_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:50"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc3acb87c12134f0", "name": "FastAPI DELETE `delete_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:70", "shortDescription": {"text": "FastAPI DELETE `delete_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:70"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0fbf54bc52ea3d4c", "name": "FastAPI POST `test_data_source_connection` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:89", "shortDescription": {"text": "FastAPI POST `test_data_source_connection` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:89"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b38cb70f878a5eb2", "name": "FastAPI POST `create_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:39", "shortDescription": {"text": "FastAPI POST `create_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:39"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c6d545b19e5c8234", "name": "FastAPI PATCH `update_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:67", "shortDescription": {"text": "FastAPI PATCH `update_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:67"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d0962b5faf31a88", "name": "FastAPI DELETE `delete_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:89", "shortDescription": {"text": "FastAPI DELETE `delete_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:89"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a359131850647a80", "name": "FastAPI POST `create_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:110", "shortDescription": {"text": "FastAPI POST `create_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:110"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7fa8e61ee8b553a2", "name": "FastAPI PATCH `update_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:136", "shortDescription": {"text": "FastAPI PATCH `update_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:136"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f36e66b1ae7011de", "name": "FastAPI DELETE `delete_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:162", "shortDescription": {"text": "FastAPI DELETE `delete_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:162"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23f11450d52deee7", "name": "FastAPI POST `simulate_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:188", "shortDescription": {"text": "FastAPI POST `simulate_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:188"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a11fa3898025536", "name": "FastAPI POST `apply_alert_inbox_action` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:263", "shortDescription": {"text": "FastAPI POST `apply_alert_inbox_action` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:263"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa1293b513f30402", "name": "FastAPI POST `create_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:25", "shortDescription": {"text": "FastAPI POST `create_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:25"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e95d276f8a5c7ea", "name": "FastAPI PATCH `update_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:57", "shortDescription": {"text": "FastAPI PATCH `update_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:57"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2d8436b7c9a32785", "name": "FastAPI DELETE `delete_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:80", "shortDescription": {"text": "FastAPI DELETE `delete_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:80"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-951f8a3dddd8a71c", "name": "FastAPI POST `apply_schema_drift_action` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:109", "shortDescription": {"text": "FastAPI POST `apply_schema_drift_action` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:109"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b3bfeccc64836a34", "name": "FastAPI POST `create_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:20", "shortDescription": {"text": "FastAPI POST `create_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:20"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a1ec2e92ef4c4a1", "name": "FastAPI PATCH `update_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:42", "shortDescription": {"text": "FastAPI PATCH `update_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:42"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c5710afa2f0bdf7e", "name": "FastAPI DELETE `delete_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:65", "shortDescription": {"text": "FastAPI DELETE `delete_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:65"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d5f0537d9bb36352", "name": "FastAPI POST `create_revision` without auth dependency \u2014 backend/src/tripl/api/v1/plan_revisions.py:18", "shortDescription": {"text": "FastAPI POST `create_revision` without auth dependency \u2014 backend/src/tripl/api/v1/plan_revisions.py:18"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-35b0eec2493f9454", "name": "FastAPI POST `create_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:36", "shortDescription": {"text": "FastAPI POST `create_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:36"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6049a30074356576", "name": "FastAPI DELETE `delete_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:64", "shortDescription": {"text": "FastAPI DELETE `delete_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:64"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcf72a54434dd560", "name": "FastAPI POST `transition_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:84", "shortDescription": {"text": "FastAPI POST `transition_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:84"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd2c517767ccce7c", "name": "FastAPI POST `add_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:108", "shortDescription": {"text": "FastAPI POST `add_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:108"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60894c62b687ce22", "name": "FastAPI DELETE `remove_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:130", "shortDescription": {"text": "FastAPI DELETE `remove_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:130"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5da449379897b7b9", "name": "FastAPI POST `create_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:158", "shortDescription": {"text": "FastAPI POST `create_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:158"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-096229393c4ba6fa", "name": "FastAPI DELETE `delete_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:171", "shortDescription": {"text": "FastAPI DELETE `delete_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:171"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bbeb61b048460137", "name": "FastAPI POST `save_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:194", "shortDescription": {"text": "FastAPI POST `save_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:194"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-70185f5c2add6bc5", "name": "FastAPI DELETE `delete_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:207", "shortDescription": {"text": "FastAPI DELETE `delete_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:207"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0960687533022ad6", "name": "FastAPI POST `merge_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:218", "shortDescription": {"text": "FastAPI POST `merge_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:218"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-596c9432d25cd239", "name": "FastAPI PATCH `update_project_anomaly_settings` without auth dependency \u2014 backend/src/tripl/api/v1/project_anomaly_setti", "shortDescription": {"text": "FastAPI PATCH `update_project_anomaly_settings` without auth dependency \u2014 backend/src/tripl/api/v1/project_anomaly_settings.py:23"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e0a8db74db8c652b", "name": "FastAPI PATCH `patch_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:53", "shortDescription": {"text": "FastAPI PATCH `patch_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:53"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-19ac152369e4e9bc", "name": "FastAPI PUT `put_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:65", "shortDescription": {"text": "FastAPI PUT `put_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:65"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc5c3126be7c7f13", "name": "FastAPI PUT `put_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:82", "shortDescription": {"text": "FastAPI PUT `put_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:82"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a101a23ceb9d819f", "name": "FastAPI POST `test_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:95", "shortDescription": {"text": "FastAPI POST `test_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:95"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-296f546ba4ed7676", "name": "FastAPI POST `create_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:20", "shortDescription": {"text": "FastAPI POST `create_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:20"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb6b28a3c8327e93", "name": "FastAPI DELETE `delete_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:42", "shortDescription": {"text": "FastAPI DELETE `delete_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:42"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `GET /` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `POST /` 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-019f89a12641e77e", "name": "Unused endpoint: POST /demo", "shortDescription": {"text": "Unused endpoint: POST /demo"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `POST /demo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56608a3bd032f5f4", "name": "Unused endpoint: GET /{slug}", "shortDescription": {"text": "Unused endpoint: GET /{slug}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `GET /{slug}` 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-dd783a507a0abc70", "name": "Unused endpoint: PATCH /{slug}", "shortDescription": {"text": "Unused endpoint: PATCH /{slug}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `PATCH /{slug}` 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-115736d40adf25ab", "name": "Unused endpoint: DELETE /{slug}", "shortDescription": {"text": "Unused endpoint: DELETE /{slug}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/projects.py` declares `DELETE /{slug}` 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-e547ce2dfbf6f101", "name": "Unused endpoint: GET /projects/{slug}/events-metrics", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/events-metrics"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/events-metrics` 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-c73d21666477f314", "name": "Unused endpoint: POST /projects/{slug}/events/window-metrics", "shortDescription": {"text": "Unused endpoint: POST /projects/{slug}/events/window-metrics"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `POST /projects/{slug}/events/window-metrics` 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-ad5bb369d6dcf93d", "name": "Unused endpoint: GET /projects/{slug}/metrics/total", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/metrics/total"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/metrics/total` 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-089874699816fb05", "name": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/events/{event_id}/metrics` 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-25f9c2b9434e6dda", "name": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics/breakdowns", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics/breakdowns"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/events/{event_id}/metrics/breakdowns` 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-a4396e607332fe4f", "name": "Unused endpoint: GET /projects/{slug}/event-types/{event_type_id}/metrics", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/event-types/{event_type_id}/metrics"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/event-types/{event_type_id}/metrics` 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-38f53c0a2edee9fb", "name": "Unused endpoint: GET /projects/{slug}/anomalies/signals", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/anomalies/signals"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/anomalies/signals` 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-08365760eecf44a3", "name": "Unused endpoint: POST /projects/{slug}/anomalies/signals/query", "shortDescription": {"text": "Unused endpoint: POST /projects/{slug}/anomalies/signals/query"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `POST /projects/{slug}/anomalies/signals/query` 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-bfd98187cb6678a3", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/top-movers", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/top-movers"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/top-movers` 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-dea17ff9d004dc06", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/seasonality", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/seasonality"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/seasonality` 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-1337319b98b430b5", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/breakdown-timeline", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/breakdown-timeline"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/breakdown-timeline` 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-a9850d4b62621a9f", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/app-versions", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/app-versions"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/app-versions` 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-dd9d17495be7c21e", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/version-adoption", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/version-adoption"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/version-adoption` 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-c632849eae3d9cb6", "name": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/release-regressions", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/release-regressions"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/scans/{scan_config_id}/release-regressions` 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-e43d655a5403575c", "name": "Unused endpoint: GET /projects/{slug}/distribution-drifts", "shortDescription": {"text": "Unused endpoint: GET /projects/{slug}/distribution-drifts"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/metrics.py` declares `GET /projects/{slug}/distribution-drifts` 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-2237995f6b8df190", "name": "Unused endpoint: DELETE /{owner_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{owner_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/event_type_owners.py` declares `DELETE /{owner_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-38f0a0bf734e5bcc", "name": "Unused endpoint: DELETE /{key_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{key_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/api_keys.py` declares `DELETE /{key_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-ff7208523efd8317", "name": "Unused endpoint: GET /shadow-events", "shortDescription": {"text": "Unused endpoint: GET /shadow-events"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/reconciliation.py` declares `GET /shadow-events` 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-6c345040b44afb42", "name": "Unused endpoint: POST /shadow-events/{candidate_id}/accept", "shortDescription": {"text": "Unused endpoint: POST /shadow-events/{candidate_id}/accept"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/reconciliation.py` declares `POST /shadow-events/{candidate_id}/accept` 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-56c0fc957e9b5db6", "name": "Unused endpoint: POST /shadow-events/{candidate_id}/dismiss", "shortDescription": {"text": "Unused endpoint: POST /shadow-events/{candidate_id}/dismiss"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/reconciliation.py` declares `POST /shadow-events/{candidate_id}/dismiss` 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-5b27dcb02af21dbd", "name": "Unused endpoint: GET /dead-events", "shortDescription": {"text": "Unused endpoint: GET /dead-events"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/reconciliation.py` declares `GET /dead-events` 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-6fc0caa269292c44", "name": "Unused endpoint: GET /coverage", "shortDescription": {"text": "Unused endpoint: GET /coverage"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/reconciliation.py` declares `GET /coverage` 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-08a9d596dcf8c446", "name": "Unused endpoint: GET /{variable_id}/values", "shortDescription": {"text": "Unused endpoint: GET /{variable_id}/values"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/variables.py` declares `GET /{variable_id}/values` 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-cc39515c8d5ea890", "name": "Unused endpoint: PATCH /{variable_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{variable_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/variables.py` declares `PATCH /{variable_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-f54dfba73ed1ec62", "name": "Unused endpoint: DELETE /{variable_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{variable_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/variables.py` declares `DELETE /{variable_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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/auth.py` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/auth.py` declares `POST /login` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/auth.py` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/auth.py` declares `GET /me` 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-cccfe89f81ab208f", "name": "Unused endpoint: POST /preview", "shortDescription": {"text": "Unused endpoint: POST /preview"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `POST /preview` 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-b9eb070f92accf95", "name": "Unused endpoint: GET /preview-jobs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /preview-jobs/{job_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `GET /preview-jobs/{job_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-acfc279b767e6f3c", "name": "Unused endpoint: GET /{scan_id}", "shortDescription": {"text": "Unused endpoint: GET /{scan_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `GET /{scan_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-00ac09b003d30935", "name": "Unused endpoint: PATCH /{scan_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{scan_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `PATCH /{scan_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-fac3eaa72b5e399c", "name": "Unused endpoint: DELETE /{scan_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{scan_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `DELETE /{scan_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-474aae6303a4f2c1", "name": "Unused endpoint: POST /{scan_id}/run", "shortDescription": {"text": "Unused endpoint: POST /{scan_id}/run"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `POST /{scan_id}/run` 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-bc6285c3bf858173", "name": "Unused endpoint: POST /{scan_id}/event-groups/apply", "shortDescription": {"text": "Unused endpoint: POST /{scan_id}/event-groups/apply"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `POST /{scan_id}/event-groups/apply` 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-10418adb19aec2ac", "name": "Unused endpoint: POST /{scan_id}/metrics/replay", "shortDescription": {"text": "Unused endpoint: POST /{scan_id}/metrics/replay"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `POST /{scan_id}/metrics/replay` 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-ea52759b05ac2b24", "name": "Unused endpoint: GET /{scan_id}/jobs", "shortDescription": {"text": "Unused endpoint: GET /{scan_id}/jobs"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `GET /{scan_id}/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-57dc950544f92168", "name": "Unused endpoint: GET /{scan_id}/jobs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /{scan_id}/jobs/{job_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `GET /{scan_id}/jobs/{job_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-7197b34256d56f74", "name": "Unused endpoint: POST /{scan_id}/jobs/{job_id}/cancel", "shortDescription": {"text": "Unused endpoint: POST /{scan_id}/jobs/{job_id}/cancel"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/scans.py` declares `POST /{scan_id}/jobs/{job_id}/cancel` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7aea7456f76f9b8e", "name": "Unused endpoint: PATCH /reorder", "shortDescription": {"text": "Unused endpoint: PATCH /reorder"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/event_photos.py` declares `PATCH /reorder` 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-24d86d57684f08eb", "name": "Unused endpoint: DELETE /{photo_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{photo_id}"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/event_photos.py` declares `DELETE /{photo_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-3e0123ce9372ecc5", "name": "Unused endpoint: GET /{photo_id}/file", "shortDescription": {"text": "Unused endpoint: GET /{photo_id}/file"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/event_photos.py` declares `GET /{photo_id}/file` 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-7b3d0dd53b75e494", "name": "Unused endpoint: POST /figma", "shortDescription": {"text": "Unused endpoint: POST /figma"}, "fullDescription": {"text": "`backend/src/tripl/api/v1/event_photos.py` declares `POST /figma` 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/22374"}, "properties": {"repository": "vladenisov/tripl", "repoUrl": "https://github.com/vladenisov/tripl", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: vladenisov/tripl"}, "properties": {"repobilityId": 371322, "scanner": "foundry_dataset", "fingerprint": "1c9b38364872ae868abc90bd4bb4d108c164db0a7412859082621268b5b22cc8", "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": 1, "test_or_ci": 3, "api_or_backend": 5, "schema_or_data": 1, "ui_or_frontend": 2, "source_or_other": 2, "verification_or_tests": 4, "human_feedback_general": 1, "data_schema_persistence": 1, "unlinked_human_feedback": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "ambiguous_needs_more_evidence": 3, "blueprint_human_gap_disagreement": 1, "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": {"ambiguous_needs_more_evidence": 6, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 74, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 1, "thread_touches_file": 13, "thread_has_pr_review": 1, "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": 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": 33, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 13, "alignment": 1, "pr_review": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "vladenisov/tripl#1", "issue_number": "1", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "vladenisov/tripl", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-8cee1c2da1116388", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 15, "api_or_backend": 25, "schema_or_data": 5, "ui_or_frontend": 10, "source_or_other": 10}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: supported_by_verification_signal\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#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: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 13, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 5, 'comment_chain_links_commit': 5, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_pr_review': 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}\nLabels: {'api_or_backend': 5, 'verification_or_tests': 4, 'test_or_ci': 3, 'ambiguous_needs_more_evidence': 3, 'source_or_other': 2, 'ui_or_frontend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'human_feedback_general': 1, 'data_schema_persistence': 1, 'schema_or_data': 1, 'unlinked_human_feedback': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'bug_fix': 1, 'claimed_resolved_with_verification_signal': 1, 'blueprint_human_gap_disagreement': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6, 'claimed_resolved_with_verification_signal': 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/vladenisov/tripl", "source_id": "graph-query-motif_query-099545e7da9548f3", "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": "vladenisov/tripl", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: vladenisov/tripl"}, "properties": {"repobilityId": 357267, "scanner": "foundry_dataset", "fingerprint": "f237513ae5823bbb2e735e7350cc75c21c0f12b2bc1336387502099fd45d1793", "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": 1, "test_or_ci": 3, "api_or_backend": 5, "schema_or_data": 1, "ui_or_frontend": 2, "source_or_other": 2, "verification_or_tests": 4, "human_feedback_general": 1, "data_schema_persistence": 1, "unlinked_human_feedback": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "ambiguous_needs_more_evidence": 3, "blueprint_human_gap_disagreement": 1, "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": {"ambiguous_needs_more_evidence": 6, "claimed_resolved_with_verification_signal": 2}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 74, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 1, "thread_touches_file": 13, "thread_has_pr_review": 1, "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": 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": 33, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 13, "alignment": 1, "pr_review": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "vladenisov/tripl#1", "issue_number": "1", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "vladenisov/tripl", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-a086d2a1c9f22942", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 15, "api_or_backend": 25, "schema_or_data": 5, "ui_or_frontend": 10, "source_or_other": 10}}, "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: vladenisov/tripl\nThread: vladenisov/tripl#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: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 13, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 5, 'comment_chain_links_commit': 5, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_pr_review': 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}\nLabels: {'api_or_backend': 5, 'verification_or_tests': 4, 'test_or_ci': 3, 'ambiguous_needs_more_evidence': 3, 'source_or_other': 2, 'ui_or_frontend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'human_feedback_general': 1, 'data_schema_persistence': 1, 'schema_or_data': 1, 'unlinked_human_feedback': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'bug_fix': 1, 'claimed_resolved_with_verification_signal': 1, 'blueprint_human_gap_disagreement': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6, 'claimed_resolved_with_verification_signal': 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/vladenisov/tripl", "source_id": "graph-query-motif_query-c29dfccd1a451031", "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": "vladenisov/tripl", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: vladenisov/tripl"}, "properties": {"repobilityId": 313641, "scanner": "foundry_dataset", "fingerprint": "0bcbca54d501c7e136ef504454e66d0b780b98e6309fb1841ba0404de3526952", "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": "vladenisov/tripl#2", "human_labels": ["api_or_backend", "human_feedback_general", "test_or_ci", "ui_or_frontend"], "issue_number": "2", "thread_label": "thread_needs_classification", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.879, "repo_full_name": "vladenisov/tripl", "training_usage": "gold_candidate", "confidence_tier": "high_confidence", "source_chain_id": "evidence-chain-issue_chain-eabbd51ead2d35ab", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 4, "schemas": 2, "generated_claims": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 13, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 2, "api_or_backend": 9, "ui_or_frontend": 2}, "linked_commit_count": 1, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_high_confidence"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: assumption_checks\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#2\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_high_confidence\nChain evidence:\nIssue/PR evidence chain: vladenisov/tripl#2\nRepo: vladenisov/tripl\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 13\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'api_or_backend': 9, 'test_or_ci': 2, 'ui_or_frontend': 2}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-d5139ae3b1be2b3b\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/vladenisov/tripl/pull/2\",\n    \"text\": \"GitHub feedback: human_feedback_general\\nPolarity: neutral\\nKind: pull_request_body\\nRepo: vladenisov/tripl\\nAuthor: vladenisov (User)\\nURL: https://github.com/vladenisov/tripl/pull/2\\nTitle: Fix/scan job dispatch race\\nBody:\\n\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-1cc48705d364f20b\",\n    \"filename\": \"backend/alembic/versions/c3d4e5f6a7b8_add_scan_job_cancelled_and_task_id.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"added\",\n    \"additions\": 36,\n    \"deletions\": 0,\n    \"changes\": 36,\n    \"blob_url\": \"https://github.com/vladenisov/tripl/blob/83dc59032351b9215a7dc06700fc31805878e6bc/backend%2Falembic%2Fversions%2Fc3d4e5f6a7b8_add_scan_job_cancelled_and_task_id.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-9aa35fdc48226354\",\n    \"filename\": \"backend/src/tripl/api/v1/scans.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 21,\n    \"deletions\": 0,\n    \"changes\": 21,\n    \"blob_url\": \"https://github.com/vladenisov/tripl/blob/83dc59032351b9215a7dc06700fc31805878e6bc/backend%2Fsrc%2Ftripl%2Fapi%2Fv1%2Fscans.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-948c1fdcd84c8215\",\n    \"filename\": \"backend/src/tripl/models/scan_job.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 4,\n    \"deletions\": 0,\n    \"changes\": 4,\n    \"blob_url\": \"https://github.com/vladenisov/tripl/blob/83dc59032351b9215a7dc06700fc31805878e6bc/backend%2Fsrc%2Ftripl%2Fmodels%2Fscan_job.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-391849f435d2c383\",\n    \"filename\": \"backend/src/tripl/services/scan_service.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 44,\n    \"deletions\": 0,\n    \"changes\": 44,\n    \"blob_url\": \"https://github.com/vladenisov/tripl/blob/83dc59032351b9215a7dc06700fc31805878e6bc/backend%2Fsrc%2Ftripl%2Fservices%2Fscan_service.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-9474c9e977b530ea\",\n    \"filename\": \"backend/src/tripl/\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vladenisov/tripl", "source_id": "comment-chain-pattern-assumption_checks-42954e8d40074864", "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": "vladenisov/tripl", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "gold_candidate"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: vladenisov/tripl"}, "properties": {"repobilityId": 313640, "scanner": "foundry_dataset", "fingerprint": "e546dd9717b5f73ce7a911a8a0a935dfb95b65b3dfa1595b158c9e35aa778938", "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": "vladenisov/tripl#1", "human_labels": ["api_or_backend", "data_schema_persistence", "human_feedback_general", "schema_or_data", "source_or_other", "test_or_ci", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "vladenisov/tripl", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-80ca68688bfdbeb8", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 4, "schemas": 2, "generated_claims": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 13, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 3, "api_or_backend": 5, "schema_or_data": 1, "ui_or_frontend": 2, "source_or_other": 2}, "linked_commit_count": 5, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: assumption_checks\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#1\nOutcome: ambiguous_needs_more_evidence\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: vladenisov/tripl#1\nRepo: vladenisov/tripl\nThread label: thread_has_human_issue_and_fix_context\nOutcome: ambiguous_needs_more_evidence\nComment count: 2\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 13\nLabels: {'human_feedback_general': 1, 'data_schema_persistence': 1}\nPolarities: {'neutral': 1, 'bad': 1}\nChanged file labels: {'source_or_other': 2, 'api_or_backend': 5, 'schema_or_data': 1, 'test_or_ci': 3, 'ui_or_frontend': 2}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-2fadf0acf614a40c\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/vladenisov/tripl/pull/1\",\n    \"text\": \"GitHub feedback: human_feedback_general\\nPolarity: neutral\\nKind: pull_request_body\\nRepo: vladenisov/tripl\\nAuthor: vladenisov (User)\\nURL: https://github.com/vladenisov/tripl/pull/1\\nTitle: Feat/replay chunked scans\\nBody:\\n\"\n  },\n  {\n    \"id\": \"github-pr-review-submission-d79a928ca2ced6f4\",\n    \"kind\": \"pr_review_submission\",\n    \"label\": \"data_schema_persistence\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vladenisov/tripl/pull/1#pullrequestreview-4372086196\",\n    \"text\": \"GitHub PR review submission: data_schema_persistence\\nPolarity: bad\\nReview state: COMMENTED\\nRepo: vladenisov/tripl\\nPull request: #1 Feat/replay chunked scans\\nAuthor: copilot-pull-request-reviewer[bot] (Bot)\\nURL: https://github.com/vladenisov/tripl/pull/1#pullrequestreview-4372086196\\nBody:\\n## Pull request overview\\n\\nAdds a per-scan `replay_chunk_interval` setting to split long metrics replays into interval-aligned sub-windows, reducing the risk of warehouse query timeouts during replay/collection while preserving \u201cwhole window\u201d behavior when unset.\\n\\n**Changes:**\\n- Introduces `replay_chunk_interval` across DB model/migration, API schemas/service validation, and frontend types.\\n- Updates metrics collection task to iterate over interval-aligned sub-windows (per-chunk query + delete + upsert + commit).\\n- Adds/updates backend and frontend tests to cover the new field and chunking behavior.\\n\\n### Reviewed changes\\n\\nCopilot reviewed 13 out of 13 changed files in this pull request and generated no comments.\\n\\n<details>\\n<summary>Show a summary per file</summary>\\n\\n| File | Description |\\r\\n| ---- | ----------- |\\r\\n| frontend/src/types/index.ts | Adds `replay_chunk_interval` to `ScanConfig` typing. |\\r\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-ed67c93b\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vladenisov/tripl", "source_id": "comment-chain-pattern-assumption_checks-265d6c4bb1a614bd", "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": "vladenisov/tripl", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_schema_ui_api_gap", "level": "error", "message": {"text": "Foundry mined schema ui api mismatch: vladenisov/tripl"}, "properties": {"repobilityId": 331165, "scanner": "foundry_dataset", "fingerprint": "38ca7e0a1154a21346a188bfef868dbe2e06055db420a426fdfe12d0ba239db2", "category": "quality", "severity": "high", "confidence": 0.76, "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": "Schema, UI, and API mismatch", "intent": "Assumption-check examples for data-path consistency across layers.", "labels": {"bug_fix": 1, "test_or_ci": 3, "api_or_backend": 5, "schema_or_data": 1, "ui_or_frontend": 2, "source_or_other": 2, "verification_or_tests": 4, "human_feedback_general": 1, "data_schema_persistence": 1, "unlinked_human_feedback": 1, "mostly follows blueprint": 1, "issue_or_pull_request_thread": 1, "ambiguous_needs_more_evidence": 3, "blueprint_human_gap_disagreement": 1, "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": "schema_ui_api_mismatch", "outcomes": {"ambiguous_needs_more_evidence": 6, "claimed_resolved_with_verification_signal": 2}, "polarity": "bad", "query_id": "schema_ui_api_mismatch", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 74, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 1, "thread_touches_file": 13, "thread_has_pr_review": 1, "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": 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": 33, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 13, "alignment": 1, "pr_review": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 5, "comment_chain": 2, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "vladenisov/tripl#1", "issue_number": "1", "quality_tiers": {"unresolved": 1, "assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "vladenisov/tripl", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-ec9c1ee80f525f8b", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 15, "api_or_backend": 25, "schema_or_data": 5, "ui_or_frontend": 10, "source_or_other": 10}}, "text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: supported_by_verification_signal\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: vladenisov/tripl\nThread: vladenisov/tripl#1\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vladenisov/tripl#1\nRepo: vladenisov/tripl\nIssue/PR number: 1\nGraph consistency label: supported_by_verification_signal\nNodes: 33\nEdges: 74\nNode types: {'pr_file': 13, 'link_quality': 5, 'commit': 5, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'pr_review': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_touches_file': 24, 'thread_touches_file': 13, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 5, 'comment_chain_links_commit': 5, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_pr_review': 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}\nLabels: {'api_or_backend': 5, 'verification_or_tests': 4, 'test_or_ci': 3, 'ambiguous_needs_more_evidence': 3, 'source_or_other': 2, 'ui_or_frontend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'human_feedback_general': 1, 'data_schema_persistence': 1, 'schema_or_data': 1, 'unlinked_human_feedback': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'bug_fix': 1, 'claimed_resolved_with_verification_signal': 1, 'blueprint_human_gap_disagreement': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6, 'claimed_resolved_with_verification_signal': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Create schema-to-API-to-UI consistency tasks with migrations and tests.\n- Teach models to verify persistence, route contracts, and UI state together.\nAssumption checks:\n- Do schema changes have matching API and UI handling?\n- Are migrations and tests present for the data path?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vladenisov/tripl", "source_id": "graph-query-motif_query-d64ba6f8fe300475", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/schema_ui_api_mismatch/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vladenisov/tripl", "source_dataset": "graph_queries/schema_ui_api_mismatch", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-b4017a873124d7ce", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "b4017a873124d7ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6309d482c8092a6", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c6309d482c8092a6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c3d4e5f6a7b8_add_scan_job_cancelled_and_task_id.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-16c3a66b711f3fdb", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "16c3a66b711f3fdb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c3d4e5f6a7b8_add_scan_job_cancelled_and_task_id.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c22776356d9d8ea", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "8c22776356d9d8ea", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/3d4e5f607182_add_webhook_alert_destination_fields.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e4f7899e1bcac1f3", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e4f7899e1bcac1f3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/3d4e5f607182_add_webhook_alert_destination_fields.py:35"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c760e43e5d06e69", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "7c760e43e5d06e69", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d6e5f4a3b2c1_add_distribution_drifts.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c5a694899c86c08", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "4c5a694899c86c08", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d6e5f4a3b2c1_add_distribution_drifts.py:68"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f9bd82af5f1c2e5", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6f9bd82af5f1c2e5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e8f9a0b1c2d3_add_search_documents.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f9f0aa71f62e202", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "7f9f0aa71f62e202", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e8f9a0b1c2d3_add_search_documents.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cdb990a017d894db", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "cdb990a017d894db", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/5f6e7d8c9b0a_add_pg_trgm_gin_indexes_for_events.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eed9ae46691eef91", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "eed9ae46691eef91", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/5f6e7d8c9b0a_add_pg_trgm_gin_indexes_for_events.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab25cf897289419c", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "ab25cf897289419c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f6a7b8c9d0e1_add_field_contract_rules.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5a8ca732fa5bf3cc", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "5a8ca732fa5bf3cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f6a7b8c9d0e1_add_field_contract_rules.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-114bf61533c4a313", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "114bf61533c4a313", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c6d7e8f9a0b1_fix_api_key_timestamp_defaults.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3ab9394dc9160cf", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d3ab9394dc9160cf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c6d7e8f9a0b1_fix_api_key_timestamp_defaults.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d836b64f677ca2a", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6d836b64f677ca2a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/af42585c6630_initial_schema.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-415712ecedb14ac8", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "415712ecedb14ac8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/af42585c6630_initial_schema.py:537"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0600754caf6af226", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "0600754caf6af226", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/b8c9d0e1f2a3_add_alert_rule_ai_explanation.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6ce77a06359c099b", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6ce77a06359c099b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/b8c9d0e1f2a3_add_alert_rule_ai_explanation.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9cf485d8a6f096ac", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "9cf485d8a6f096ac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d7e8f9a0b1c2_add_event_source_name.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1389e8793f7e6a18", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "1389e8793f7e6a18", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d7e8f9a0b1c2_add_event_source_name.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-773d54b715ac31fa", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "773d54b715ac31fa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e0f1a2b3c4d5_add_event_status_and_event_changes.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6551661611417497", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6551661611417497", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e0f1a2b3c4d5_add_event_status_and_event_changes.py:97"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-efff45bec33e738d", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "efff45bec33e738d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/2c3d4e5f6071_add_scan_config_replay_chunk_interval.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-68e98083c82b6df2", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "68e98083c82b6df2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/2c3d4e5f6071_add_scan_config_replay_chunk_interval.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6839b7b37322fe3b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6839b7b37322fe3b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/6071829305a1_add_email_alert_destination_fields.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-88818e8fe2b3978b", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "88818e8fe2b3978b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/6071829305a1_add_email_alert_destination_fields.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dfe7c2aa85773b1c", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "dfe7c2aa85773b1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/93050ed42d05_add_plan_branch_merge_resolutions.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-83f87f98af2ca787", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "83f87f98af2ca787", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/93050ed42d05_add_plan_branch_merge_resolutions.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b20aae855a363d1", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "0b20aae855a363d1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e4f5a6b7c8d9_convert_string_columns_to_enums.py:409"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-20cffe7c41ed923b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/branch-switcher.tsx:55"}, "properties": {"repobilityId": "757f840a11a6f89a", "scanner": "scanner-primary", "fingerprint": "20cffe7c41ed923b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1c922b4b86c30dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/command-palette.tsx:215"}, "properties": {"repobilityId": "09aa3014742938a6", "scanner": "scanner-primary", "fingerprint": "d1c922b4b86c30dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e31e15428a2da81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/app-sidebar.tsx:219"}, "properties": {"repobilityId": "bc721dd473a52541", "scanner": "scanner-primary", "fingerprint": "0e31e15428a2da81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bee40859e505a469", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/top-bar.tsx:67"}, "properties": {"repobilityId": "95f694715b5dd5d3", "scanner": "scanner-primary", "fingerprint": "bee40859e505a469", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-531ce2e218e46ff2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/event-photos-section.tsx:326"}, "properties": {"repobilityId": "badf6ff1e8abcf42", "scanner": "scanner-primary", "fingerprint": "531ce2e218e46ff2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86a68cabedaf7294", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/variable-value-contexts.tsx:29"}, "properties": {"repobilityId": "0d178b2ea88df71d", "scanner": "scanner-primary", "fingerprint": "86a68cabedaf7294", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ede4041cd59926bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/release-regression-panel.tsx:28"}, "properties": {"repobilityId": "b2dff68f1c1e4a8a", "scanner": "scanner-primary", "fingerprint": "ede4041cd59926bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c9db271edb137f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/monitoring/top-movers-panel.tsx:137"}, "properties": {"repobilityId": "32968662effc1ecc", "scanner": "scanner-primary", "fingerprint": "3c9db271edb137f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ed585003500c840", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/chart.tsx:249"}, "properties": {"repobilityId": "908ff3dbce948bf6", "scanner": "scanner-primary", "fingerprint": "9ed585003500c840", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98f3d2c521e8de21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitoringDetailPage.tsx:577"}, "properties": {"repobilityId": "19255b925d67c1cf", "scanner": "scanner-primary", "fingerprint": "98f3d2c521e8de21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d89b08dccafc2ec8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/OverviewPage.tsx:295"}, "properties": {"repobilityId": "b47fedec3682d0cd", "scanner": "scanner-primary", "fingerprint": "d89b08dccafc2ec8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e31fb11d0147da2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/MonitorsPage.tsx:160"}, "properties": {"repobilityId": "5218e542b9e6f626", "scanner": "scanner-primary", "fingerprint": "e31fb11d0147da2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9f02de203436d84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ReconciliationPage.tsx:170"}, "properties": {"repobilityId": "a63ef4573f17efbd", "scanner": "scanner-primary", "fingerprint": "b9f02de203436d84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7c86d862249fdcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DataSourcesPage.tsx:507"}, "properties": {"repobilityId": "7e0f044495ffd485", "scanner": "scanner-primary", "fingerprint": "c7c86d862249fdcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-477655228e1c7493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectsPage.tsx:583"}, "properties": {"repobilityId": "9a0446903db99c5c", "scanner": "scanner-primary", "fingerprint": "477655228e1c7493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-febba691099c7fc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectAlertingTab.tsx:344"}, "properties": {"repobilityId": "d5b56773ca75474c", "scanner": "scanner-primary", "fingerprint": "febba691099c7fc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0763b7bc5fa3ba40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/AuditTab.tsx:267"}, "properties": {"repobilityId": "7a3a6ced01c47503", "scanner": "scanner-primary", "fingerprint": "0763b7bc5fa3ba40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32451953279feeb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/HistoryTab.tsx:209"}, "properties": {"repobilityId": "59797489bd44fd7f", "scanner": "scanner-primary", "fingerprint": "32451953279feeb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1892274979b178d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/MetricBreakdownPicker.tsx:71"}, "properties": {"repobilityId": "71c5ff6b80b8f737", "scanner": "scanner-primary", "fingerprint": "b1892274979b178d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d16e72c6a622783f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/ScanPreviewPanel.tsx:51"}, "properties": {"repobilityId": "d5c2bd5cd12ec04e", "scanner": "scanner-primary", "fingerprint": "d16e72c6a622783f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-169870dce8e3748b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/settings/scans/DistributionDriftPicker.tsx:48"}, "properties": {"repobilityId": "df4b0c92da810496", "scanner": "scanner-primary", "fingerprint": "169870dce8e3748b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1543f1443bbd814a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventForm.tsx:298"}, "properties": {"repobilityId": "c1bfdcf2840be3af", "scanner": "scanner-primary", "fingerprint": "1543f1443bbd814a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d5bbf801882a21f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/SavedViewsMenu.tsx:31"}, "properties": {"repobilityId": "ce87037658c81ad0", "scanner": "scanner-primary", "fingerprint": "8d5bbf801882a21f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cec1dd9b6eb0761a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnFilter.tsx:158"}, "properties": {"repobilityId": "b4e277b2b34d5005", "scanner": "scanner-primary", "fingerprint": "cec1dd9b6eb0761a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-184399fffc38a9ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/ColumnsMenu.tsx:143"}, "properties": {"repobilityId": "8b36074a5da8f7c9", "scanner": "scanner-primary", "fingerprint": "184399fffc38a9ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb0b69df944b52a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventRow.tsx:131"}, "properties": {"repobilityId": "94460bb4c8f1faf4", "scanner": "scanner-primary", "fingerprint": "eb0b69df944b52a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf960e27e5c941f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/events/EventWindowMetricsCell.tsx:60"}, "properties": {"repobilityId": "906c40e74f5aad13", "scanner": "scanner-primary", "fingerprint": "bf960e27e5c941f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56d151164695afdf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/RuleReplayDialog.tsx:250"}, "properties": {"repobilityId": "ca49a376a81be797", "scanner": "scanner-primary", "fingerprint": "56d151164695afdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0de2ee1fe9d6f00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/alerting/FilterEditor.tsx:176"}, "properties": {"repobilityId": "f404ed703ec58a58", "scanner": "scanner-primary", "fingerprint": "c0de2ee1fe9d6f00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60427b03771411b6", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "properties": {"repobilityId": "735c01d8531dfd2c", "scanner": "scanner-primary", "fingerprint": "60427b03771411b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-922357bc2fb07f39", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:26-trixie-slim"}, "properties": {"repobilityId": "276540bfeefd8e86", "scanner": "scanner-primary", "fingerprint": "922357bc2fb07f39", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-b61acc5cc789bc21", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: alpine:3.24"}, "properties": {"repobilityId": "d1cb0c55efa576f2", "scanner": "scanner-primary", "fingerprint": "b61acc5cc789bc21", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-d90cecb342a72873", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:python3.14-trixie-slim"}, "properties": {"repobilityId": "261c154482e392d6", "scanner": "scanner-primary", "fingerprint": "d90cecb342a72873", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-96a03d8598608729", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.14-slim-trixie"}, "properties": {"repobilityId": "39a33ec36000e774", "scanner": "scanner-primary", "fingerprint": "96a03d8598608729", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 25}}}]}, {"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-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-467fa106cd1c1c9e", "level": "note", "message": {"text": "Very large file: frontend/src/pages/ProjectSettingsPage.test.tsx (1576 lines)"}, "properties": {"repobilityId": "dc8df54d0ad59d25", "scanner": "scanner-primary", "fingerprint": "467fa106cd1c1c9e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2a8ed3b3cbd34813", "level": "note", "message": {"text": "Very large file: backend/src/tripl/tests/test_metrics_tasks.py (3597 lines)"}, "properties": {"repobilityId": "635d7bc9f85cf15e", "scanner": "scanner-primary", "fingerprint": "2a8ed3b3cbd34813", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-38b8c4ae1f02b37b", "level": "note", "message": {"text": "Very large file: backend/src/tripl/tests/test_metrics_api.py (1545 lines)"}, "properties": {"repobilityId": "09c3e12a5365988c", "scanner": "scanner-primary", "fingerprint": "38b8c4ae1f02b37b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ebf6fe2fb669178", "level": "note", "message": {"text": "Very large file: backend/src/tripl/tests/test_alerting.py (3175 lines)"}, "properties": {"repobilityId": "44b6df17e6a16c30", "scanner": "scanner-primary", "fingerprint": "1ebf6fe2fb669178", "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": "81dfbd2692bcf505", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "ed01c52bda5f08cb", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "8f61b7a992a1e6f3", "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": "4cab496242912a2c", "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": "4243648b5b789919", "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": "7f31f19a4aaab131", "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": "52265bd7d03cc859", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-97831b64a8f5a8e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/eventPhotos.ts:17"}, "properties": {"repobilityId": "8731d6b6b048a1a4", "scanner": "scanner-primary", "fingerprint": "97831b64a8f5a8e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bca9ed6a603f9a4", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/pages/events/useEventRowMetrics.ts:13"}, "properties": {"repobilityId": "92774ef32846c803", "scanner": "scanner-primary", "fingerprint": "3bca9ed6a603f9a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-135b4a39892a9838", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/alembic/versions/e0f1a2b3c4d5_add_event_status_and_event_changes.py:26"}, "properties": {"repobilityId": "26d9f45f14bb3db3", "scanner": "scanner-primary", "fingerprint": "135b4a39892a9838", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54582cd920c34e0c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/tripl/config.py:83"}, "properties": {"repobilityId": "a57fe6681f1d65c6", "scanner": "scanner-primary", "fingerprint": "54582cd920c34e0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7894420838916f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/src/tripl/main.py:54"}, "properties": {"repobilityId": "f5eeddca3378ca73", "scanner": "scanner-primary", "fingerprint": "d7894420838916f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d29cbe4656be929", "level": "note", "message": {"text": "Legacy-named symbol `never_seen_old` in backend/src/tripl/tests/test_reconciliation.py:262"}, "properties": {"repobilityId": "ab48fa26ceddee6b", "scanner": "scanner-primary", "fingerprint": "9d29cbe4656be929", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-21234d69d2f4a5d1", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/tripl/api/v1/users.py:47"}, "properties": {"repobilityId": "2c64133673865711", "scanner": "scanner-primary", "fingerprint": "21234d69d2f4a5d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05de82702c308acd", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/analyzers/anomaly_detector.py:27"}, "properties": {"repobilityId": "feb170334a309b36", "scanner": "scanner-primary", "fingerprint": "05de82702c308acd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be734103b886099a", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/src/tripl/worker/tasks/metrics/schedule.py:34"}, "properties": {"repobilityId": "c36cc3ab9b067f0a", "scanner": "scanner-primary", "fingerprint": "be734103b886099a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5beadbcd66df111", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/tasks.py:416"}, "properties": {"repobilityId": "df164e9659a599da", "scanner": "scanner-primary", "fingerprint": "f5beadbcd66df111", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf3dfeb8475e072f", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/tripl/worker/tasks/metrics/schema_drift.py:21"}, "properties": {"repobilityId": "5c473b2484b67b11", "scanner": "scanner-primary", "fingerprint": "bf3dfeb8475e072f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11b836edcff5915d", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/tripl/worker/tasks/metrics/_helpers.py:45"}, "properties": {"repobilityId": "5ce45200365ebc1b", "scanner": "scanner-primary", "fingerprint": "11b836edcff5915d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1adba60eaa912841", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in backend/src/tripl/services/project_service.py:384"}, "properties": {"repobilityId": "23b7bd4d239764ac", "scanner": "scanner-primary", "fingerprint": "1adba60eaa912841", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9f464e92b9477616", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/tripl/services/event_service.py:110"}, "properties": {"repobilityId": "b5e205d0f3c5b3e1", "scanner": "scanner-primary", "fingerprint": "9f464e92b9477616", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3b6beed3ce69f88", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/src/tripl/services/demo_service.py:301"}, "properties": {"repobilityId": "f7ed43701c2f38ed", "scanner": "scanner-primary", "fingerprint": "c3b6beed3ce69f88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29d908a99f4551bd", "level": "note", "message": {"text": "Legacy-named symbol `_event_copy` in backend/src/tripl/services/activity_service.py:242"}, "properties": {"repobilityId": "2206ca3c55dff5cc", "scanner": "scanner-primary", "fingerprint": "29d908a99f4551bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fcd424c9e6d73fa6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "dae19416b0a94dce", "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": "659b506b2942ede3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "07ae629a5431da17", "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": "616207449d83bafb", "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": "1f71a8e2d13858e3", "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": "4e38488bd9fc2def", "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": "334a7a59b137aaab", "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": "0336e2c865ed041b", "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": "d841ba4115e9d5fa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "3cb2452cbcba7f7c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "55a65d71a4a457e1", "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": "c67b13c6c8efef2b", "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": "5a6a14a615ab434d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "f8e122a7a25e31d8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "dc4f76d980242f99", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "4b02b438f50bc0f3", "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": "616640293a7eb62d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "d579f8da8f41e378", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "122a8405434c2751", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-9d046ecb3dfe678d", "level": "warning", "message": {"text": "Frontend route `/settings/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/pages/DataSourcesPage.test.tsx"}, "properties": {"repobilityId": "23d4a373a57fedeb", "scanner": "scanner-primary", "fingerprint": "9d046ecb3dfe678d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b577acaa64d5fa05", "level": "warning", "message": {"text": "Frontend route `/settings/:tab` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "5b86f5aafba0db5d", "scanner": "scanner-primary", "fingerprint": "b577acaa64d5fa05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e18285690d66ccdf", "level": "warning", "message": {"text": "Frontend route `/data-sources` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "cefa116ac8c1c964", "scanner": "scanner-primary", "fingerprint": "e18285690d66ccdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e9fd55005c088c86", "level": "warning", "message": {"text": "Frontend route `/data-sources/:dsId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "72c9e82b237e36ea", "scanner": "scanner-primary", "fingerprint": "e9fd55005c088c86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-baf95c39c979811d", "level": "warning", "message": {"text": "Frontend route `/users` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "6daca1290f365cc9", "scanner": "scanner-primary", "fingerprint": "baf95c39c979811d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-deec1d9cf1f3a53c", "level": "warning", "message": {"text": "Frontend route `/account` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d163ee88ddb1a638", "scanner": "scanner-primary", "fingerprint": "deec1d9cf1f3a53c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9834291f65a09981", "level": "warning", "message": {"text": "Frontend route `/p/:slug/monitoring` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "properties": {"repobilityId": "22dae83985a8d3b6", "scanner": "scanner-primary", "fingerprint": "9834291f65a09981", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3c19aeafa019325e", "level": "warning", "message": {"text": "Frontend route `/p/:slug/alerting` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "properties": {"repobilityId": "ed6a34cd16b3da41", "scanner": "scanner-primary", "fingerprint": "3c19aeafa019325e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c959b717856468f5", "level": "warning", "message": {"text": "Frontend route `/p/:slug/events/detail/:eventId` has no Link/navigate to it \u2014 frontend/src/components/command-palette.test.tsx"}, "properties": {"repobilityId": "92d4c593df859e88", "scanner": "scanner-primary", "fingerprint": "c959b717856468f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-416baef9d5c4a852", "level": "warning", "message": {"text": "Frontend route `/p/:slug/monitoring/:scope/:id` has no Link/navigate to it \u2014 frontend/src/pages/MonitoringDetailPage.test.tsx"}, "properties": {"repobilityId": "5e70f8e176adf993", "scanner": "scanner-primary", "fingerprint": "416baef9d5c4a852", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-20cb4912bf2a8ede", "level": "warning", "message": {"text": "Frontend route `/p/:slug/events/:tab/:eventId` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "properties": {"repobilityId": "1958d392fcb7a5fc", "scanner": "scanner-primary", "fingerprint": "20cb4912bf2a8ede", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e6f52f27b602e3c4", "level": "warning", "message": {"text": "Frontend route `/p/:slug/events/:tab` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "properties": {"repobilityId": "c924c3de204f7f36", "scanner": "scanner-primary", "fingerprint": "e6f52f27b602e3c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-85885157a22811b2", "level": "warning", "message": {"text": "Frontend route `/p/:slug/events` has no Link/navigate to it \u2014 frontend/src/pages/EventsPage.test.tsx"}, "properties": {"repobilityId": "0d6f55b711fcabd7", "scanner": "scanner-primary", "fingerprint": "85885157a22811b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-04c86cfdbcb86192", "level": "warning", "message": {"text": "Frontend route `/p/:slug/overview` has no Link/navigate to it \u2014 frontend/src/pages/OverviewPage.test.tsx"}, "properties": {"repobilityId": "4115325d14783725", "scanner": "scanner-primary", "fingerprint": "04c86cfdbcb86192", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-563b553064754cc2", "level": "warning", "message": {"text": "Frontend route `/p/:slug/monitors` has no Link/navigate to it \u2014 frontend/src/pages/MonitorsPage.test.tsx"}, "properties": {"repobilityId": "62464de5b17b74ed", "scanner": "scanner-primary", "fingerprint": "563b553064754cc2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dea9d9d715a293a9", "level": "warning", "message": {"text": "Frontend route `/p/:slug/reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "74fa20ce9a38256c", "scanner": "scanner-primary", "fingerprint": "dea9d9d715a293a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d2b5c14737aead53", "level": "warning", "message": {"text": "Frontend route `/p/:slug/settings/:tab/:itemId` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "properties": {"repobilityId": "d3b89460614f83f7", "scanner": "scanner-primary", "fingerprint": "d2b5c14737aead53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0cffa63b15f510cc", "level": "warning", "message": {"text": "Frontend route `/p/:slug/settings/:tab` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "properties": {"repobilityId": "f6beabec868f46ce", "scanner": "scanner-primary", "fingerprint": "0cffa63b15f510cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4947ae5a193c114", "level": "warning", "message": {"text": "Frontend route `/p/:slug/settings` has no Link/navigate to it \u2014 frontend/src/pages/ProjectSettingsPage.test.tsx"}, "properties": {"repobilityId": "2e63497fe8d6708f", "scanner": "scanner-primary", "fingerprint": "a4947ae5a193c114", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7c1c82a6c9a9f829", "level": "warning", "message": {"text": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "00c8a7da1baa57b0", "scanner": "scanner-primary", "fingerprint": "7c1c82a6c9a9f829", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc040d7a24de92cf", "level": "error", "message": {"text": "FastAPI POST `create_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:18"}, "properties": {"repobilityId": "eb888ee4b2e49dbd", "scanner": "scanner-primary", "fingerprint": "bc040d7a24de92cf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/projects.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-31787c47d8eebe04", "level": "error", "message": {"text": "FastAPI POST `create_demo_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:28"}, "properties": {"repobilityId": "f582ba9acc45957c", "scanner": "scanner-primary", "fingerprint": "31787c47d8eebe04", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/projects.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-59b458e5988187a7", "level": "error", "message": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:43"}, "properties": {"repobilityId": "860ef14c2774fedc", "scanner": "scanner-primary", "fingerprint": "59b458e5988187a7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/projects.py"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-741f7a08ed1954f4", "level": "error", "message": {"text": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/src/tripl/api/v1/projects.py:52"}, "properties": {"repobilityId": "26fa577c0ce23d5f", "scanner": "scanner-primary", "fingerprint": "741f7a08ed1954f4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/projects.py"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-26a23850a45e7476", "level": "error", "message": {"text": "FastAPI POST `get_events_window_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:58"}, "properties": {"repobilityId": "9349f68dddb9f671", "scanner": "scanner-primary", "fingerprint": "26a23850a45e7476", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/metrics.py"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-2e63516b63378c59", "level": "error", "message": {"text": "FastAPI POST `query_active_signals` without auth dependency \u2014 backend/src/tripl/api/v1/metrics.py:163"}, "properties": {"repobilityId": "3f8803c458b4dfb9", "scanner": "scanner-primary", "fingerprint": "2e63516b63378c59", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/metrics.py"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-e273bb3734eeb3dd", "level": "error", "message": {"text": "FastAPI POST `add_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:22"}, "properties": {"repobilityId": "ba7b4c083a5696a7", "scanner": "scanner-primary", "fingerprint": "e273bb3734eeb3dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_type_owners.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-095a2099cbd19496", "level": "error", "message": {"text": "FastAPI DELETE `remove_owner` without auth dependency \u2014 backend/src/tripl/api/v1/event_type_owners.py:46"}, "properties": {"repobilityId": "27f9140b488b9058", "scanner": "scanner-primary", "fingerprint": "095a2099cbd19496", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_type_owners.py"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-453f394aebdc39e4", "level": "error", "message": {"text": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:32"}, "properties": {"repobilityId": "adba16cc6f551b91", "scanner": "scanner-primary", "fingerprint": "453f394aebdc39e4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/api_keys.py"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-13f627bdd856fcbe", "level": "error", "message": {"text": "FastAPI DELETE `revoke_api_key` without auth dependency \u2014 backend/src/tripl/api/v1/api_keys.py:80"}, "properties": {"repobilityId": "b43dfdaf39818a3e", "scanner": "scanner-primary", "fingerprint": "13f627bdd856fcbe", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/api_keys.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-e980c6bd85754df8", "level": "error", "message": {"text": "FastAPI POST `accept_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:38"}, "properties": {"repobilityId": "fae885c9c384839b", "scanner": "scanner-primary", "fingerprint": "e980c6bd85754df8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/reconciliation.py"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-4dea465d3577923b", "level": "error", "message": {"text": "FastAPI POST `dismiss_shadow_event` without auth dependency \u2014 backend/src/tripl/api/v1/reconciliation.py:60"}, "properties": {"repobilityId": "a0cb896600b58c64", "scanner": "scanner-primary", "fingerprint": "4dea465d3577923b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/reconciliation.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-2c257408e4e5f95d", "level": "error", "message": {"text": "FastAPI POST `create_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:24"}, "properties": {"repobilityId": "86bc6af6ac61105f", "scanner": "scanner-primary", "fingerprint": "2c257408e4e5f95d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/variables.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-e5c60232e2c9d4ed", "level": "error", "message": {"text": "FastAPI PATCH `update_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:56"}, "properties": {"repobilityId": "759e0386af82c534", "scanner": "scanner-primary", "fingerprint": "e5c60232e2c9d4ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/variables.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-b5d0be6bfe303404", "level": "error", "message": {"text": "FastAPI DELETE `delete_variable` without auth dependency \u2014 backend/src/tripl/api/v1/variables.py:79"}, "properties": {"repobilityId": "44637910864ee5f5", "scanner": "scanner-primary", "fingerprint": "b5d0be6bfe303404", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/variables.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-ae59aa2cf7e6ef02", "level": "error", "message": {"text": "FastAPI POST `create_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:28"}, "properties": {"repobilityId": "f5789b43e7a66785", "scanner": "scanner-primary", "fingerprint": "ae59aa2cf7e6ef02", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-aa42027f2349103a", "level": "error", "message": {"text": "FastAPI POST `preview_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:49"}, "properties": {"repobilityId": "0f479c1c0ed9a8dc", "scanner": "scanner-primary", "fingerprint": "aa42027f2349103a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-72f9d465854fd544", "level": "error", "message": {"text": "FastAPI PATCH `update_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:82"}, "properties": {"repobilityId": "b967738166822d70", "scanner": "scanner-primary", "fingerprint": "72f9d465854fd544", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-c9701b586e82ce59", "level": "error", "message": {"text": "FastAPI DELETE `delete_scan_config` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:104"}, "properties": {"repobilityId": "55d56dba0d2c9ae0", "scanner": "scanner-primary", "fingerprint": "c9701b586e82ce59", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-c4e237d93119db4d", "level": "error", "message": {"text": "FastAPI POST `run_scan` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:125"}, "properties": {"repobilityId": "f5c39824a3c75ec6", "scanner": "scanner-primary", "fingerprint": "c4e237d93119db4d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-c5003f990810cdae", "level": "error", "message": {"text": "FastAPI POST `apply_scan_event_groups` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:135"}, "properties": {"repobilityId": "5dbb84f167579462", "scanner": "scanner-primary", "fingerprint": "c5003f990810cdae", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-6065412629dcb18e", "level": "error", "message": {"text": "FastAPI POST `replay_scan_metrics` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:161"}, "properties": {"repobilityId": "754f618fe34b3a09", "scanner": "scanner-primary", "fingerprint": "6065412629dcb18e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-f362e5a9e2c6811c", "level": "error", "message": {"text": "FastAPI POST `cancel_scan_job` without auth dependency \u2014 backend/src/tripl/api/v1/scans.py:191"}, "properties": {"repobilityId": "9e5f23765a040f1b", "scanner": "scanner-primary", "fingerprint": "f362e5a9e2c6811c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/scans.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-7c8c49bb1aacbaa0", "level": "error", "message": {"text": "FastAPI POST `upload_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:55"}, "properties": {"repobilityId": "c5754fe112e4ae93", "scanner": "scanner-primary", "fingerprint": "7c8c49bb1aacbaa0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-a7b9ec9a8a377197", "level": "error", "message": {"text": "FastAPI PATCH `reorder_event_photos` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:76"}, "properties": {"repobilityId": "8a354be2f0fc73e8", "scanner": "scanner-primary", "fingerprint": "a7b9ec9a8a377197", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-dc0301f0c41d6876", "level": "error", "message": {"text": "FastAPI DELETE `delete_event_photo` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:89"}, "properties": {"repobilityId": "06e7ff5cd177a62e", "scanner": "scanner-primary", "fingerprint": "dc0301f0c41d6876", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-eebcb97c4c55500f", "level": "error", "message": {"text": "FastAPI POST `attach_figma_spec` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:128"}, "properties": {"repobilityId": "5188a3c85de56f8e", "scanner": "scanner-primary", "fingerprint": "eebcb97c4c55500f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-1c49faca05e80ec3", "level": "error", "message": {"text": "FastAPI POST `create_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:158"}, "properties": {"repobilityId": "15d72db054067f3b", "scanner": "scanner-primary", "fingerprint": "1c49faca05e80ec3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-1df59cf9a2e76f83", "level": "error", "message": {"text": "FastAPI DELETE `delete_photo_comment` without auth dependency \u2014 backend/src/tripl/api/v1/event_photos.py:179"}, "properties": {"repobilityId": "7839ffb4fe62ee81", "scanner": "scanner-primary", "fingerprint": "1df59cf9a2e76f83", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_photos.py"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-491ec58eaf16623b", "level": "error", "message": {"text": "FastAPI POST `create_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:62"}, "properties": {"repobilityId": "7bc0cffb9a3370ed", "scanner": "scanner-primary", "fingerprint": "491ec58eaf16623b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-75c08661e401322a", "level": "error", "message": {"text": "FastAPI POST `bulk_create_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:74"}, "properties": {"repobilityId": "b5dcc4b9b0624a11", "scanner": "scanner-primary", "fingerprint": "75c08661e401322a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-1a908ea1fe0e99e8", "level": "error", "message": {"text": "FastAPI POST `bulk_delete_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:86"}, "properties": {"repobilityId": "81767f0db8a8b284", "scanner": "scanner-primary", "fingerprint": "1a908ea1fe0e99e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-ae8d3815089dad5d", "level": "error", "message": {"text": "FastAPI POST `bulk_update_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:93"}, "properties": {"repobilityId": "ec1a0c5e9f592bd8", "scanner": "scanner-primary", "fingerprint": "ae8d3815089dad5d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-002eb9257f5f6024", "level": "error", "message": {"text": "FastAPI PATCH `reorder_events` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:104"}, "properties": {"repobilityId": "2fd35c4120b4a6fd", "scanner": "scanner-primary", "fingerprint": "002eb9257f5f6024", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-d56cbc805b37d362", "level": "error", "message": {"text": "FastAPI PATCH `update_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:129"}, "properties": {"repobilityId": "4e680dc66610356f", "scanner": "scanner-primary", "fingerprint": "d56cbc805b37d362", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-7374b064abf5284c", "level": "error", "message": {"text": "FastAPI PATCH `move_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:146"}, "properties": {"repobilityId": "c95428b9f064480a", "scanner": "scanner-primary", "fingerprint": "7374b064abf5284c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-e285bcee5143b37e", "level": "error", "message": {"text": "FastAPI DELETE `delete_event` without auth dependency \u2014 backend/src/tripl/api/v1/events.py:161"}, "properties": {"repobilityId": "7b4d1930c3ab7b8d", "scanner": "scanner-primary", "fingerprint": "e285bcee5143b37e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/events.py"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-8b428f015d70ea28", "level": "error", "message": {"text": "FastAPI PATCH `update_user_role` without auth dependency \u2014 backend/src/tripl/api/v1/users.py:24"}, "properties": {"repobilityId": "35ff471f7687dbba", "scanner": "scanner-primary", "fingerprint": "8b428f015d70ea28", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/users.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-84e4742ecde18b82", "level": "error", "message": {"text": "FastAPI POST `describe_event` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:38"}, "properties": {"repobilityId": "80d36feb344a97c0", "scanner": "scanner-primary", "fingerprint": "84e4742ecde18b82", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/ai.py"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-29b4aa7315ed0250", "level": "error", "message": {"text": "FastAPI POST `describe_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:50"}, "properties": {"repobilityId": "02dc7d97b8955d35", "scanner": "scanner-primary", "fingerprint": "29b4aa7315ed0250", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/ai.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-96ffa446223188e5", "level": "error", "message": {"text": "FastAPI POST `ask_plan` without auth dependency \u2014 backend/src/tripl/api/v1/ai.py:67"}, "properties": {"repobilityId": "093a7ccd9108be1c", "scanner": "scanner-primary", "fingerprint": "96ffa446223188e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/ai.py"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-27f63309376b87c8", "level": "error", "message": {"text": "FastAPI POST `create_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:43"}, "properties": {"repobilityId": "ba4eadbab11a7d5f", "scanner": "scanner-primary", "fingerprint": "27f63309376b87c8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/chart_annotations.py"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-20f416afd1e4f780", "level": "error", "message": {"text": "FastAPI DELETE `delete_chart_annotation` without auth dependency \u2014 backend/src/tripl/api/v1/chart_annotations.py:64"}, "properties": {"repobilityId": "8ece5d80e570c97e", "scanner": "scanner-primary", "fingerprint": "20f416afd1e4f780", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/chart_annotations.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-2186c8c545e73510", "level": "error", "message": {"text": "FastAPI POST `create_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:30"}, "properties": {"repobilityId": "024b747f997ba298", "scanner": "scanner-primary", "fingerprint": "2186c8c545e73510", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/fields.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-67de55260aefe79e", "level": "error", "message": {"text": "FastAPI POST `bulk_create_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:53"}, "properties": {"repobilityId": "166aa7b8e03b291b", "scanner": "scanner-primary", "fingerprint": "67de55260aefe79e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/fields.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-a78f77d742e26706", "level": "error", "message": {"text": "FastAPI PATCH `reorder_fields` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:79"}, "properties": {"repobilityId": "775cace515f1af18", "scanner": "scanner-primary", "fingerprint": "a78f77d742e26706", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/fields.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-07dceb20be6d64d2", "level": "error", "message": {"text": "FastAPI PATCH `update_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:94"}, "properties": {"repobilityId": "5cddff0f8c6b82fe", "scanner": "scanner-primary", "fingerprint": "07dceb20be6d64d2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/fields.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-9746f73b977dc103", "level": "error", "message": {"text": "FastAPI DELETE `delete_field` without auth dependency \u2014 backend/src/tripl/api/v1/fields.py:120"}, "properties": {"repobilityId": "29508a49e078b31b", "scanner": "scanner-primary", "fingerprint": "9746f73b977dc103", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/fields.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-c9d370aeca8081b5", "level": "error", "message": {"text": "FastAPI POST `reindex_project_search` without auth dependency \u2014 backend/src/tripl/api/v1/search.py:35"}, "properties": {"repobilityId": "a57b1ee15c20926b", "scanner": "scanner-primary", "fingerprint": "c9d370aeca8081b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/search.py"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-a2cfc7be94a49f52", "level": "error", "message": {"text": "FastAPI POST `create_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:26"}, "properties": {"repobilityId": "8b6d8ba18b7a9881", "scanner": "scanner-primary", "fingerprint": "a2cfc7be94a49f52", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/data_sources.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-43eb1f1118ac1d92", "level": "error", "message": {"text": "FastAPI PATCH `update_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:50"}, "properties": {"repobilityId": "259484481a7b1685", "scanner": "scanner-primary", "fingerprint": "43eb1f1118ac1d92", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/data_sources.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-fc3acb87c12134f0", "level": "error", "message": {"text": "FastAPI DELETE `delete_data_source` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:70"}, "properties": {"repobilityId": "74af25a2910503ed", "scanner": "scanner-primary", "fingerprint": "fc3acb87c12134f0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/data_sources.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-0fbf54bc52ea3d4c", "level": "error", "message": {"text": "FastAPI POST `test_data_source_connection` without auth dependency \u2014 backend/src/tripl/api/v1/data_sources.py:89"}, "properties": {"repobilityId": "d12ad5f2fc195953", "scanner": "scanner-primary", "fingerprint": "0fbf54bc52ea3d4c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/data_sources.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-b38cb70f878a5eb2", "level": "error", "message": {"text": "FastAPI POST `create_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:39"}, "properties": {"repobilityId": "522da764da488c29", "scanner": "scanner-primary", "fingerprint": "b38cb70f878a5eb2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-c6d545b19e5c8234", "level": "error", "message": {"text": "FastAPI PATCH `update_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:67"}, "properties": {"repobilityId": "539dd6a52faaea7d", "scanner": "scanner-primary", "fingerprint": "c6d545b19e5c8234", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-7d0962b5faf31a88", "level": "error", "message": {"text": "FastAPI DELETE `delete_alert_destination` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:89"}, "properties": {"repobilityId": "91440d3c5ec6f41a", "scanner": "scanner-primary", "fingerprint": "7d0962b5faf31a88", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-a359131850647a80", "level": "error", "message": {"text": "FastAPI POST `create_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:110"}, "properties": {"repobilityId": "52e0dadd613267fa", "scanner": "scanner-primary", "fingerprint": "a359131850647a80", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-7fa8e61ee8b553a2", "level": "error", "message": {"text": "FastAPI PATCH `update_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:136"}, "properties": {"repobilityId": "22f6144844da30f8", "scanner": "scanner-primary", "fingerprint": "7fa8e61ee8b553a2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-f36e66b1ae7011de", "level": "error", "message": {"text": "FastAPI DELETE `delete_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:162"}, "properties": {"repobilityId": "1aa73b177e17b793", "scanner": "scanner-primary", "fingerprint": "f36e66b1ae7011de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-23f11450d52deee7", "level": "error", "message": {"text": "FastAPI POST `simulate_alert_rule` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:188"}, "properties": {"repobilityId": "438d214253f0d68c", "scanner": "scanner-primary", "fingerprint": "23f11450d52deee7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-2a11fa3898025536", "level": "error", "message": {"text": "FastAPI POST `apply_alert_inbox_action` without auth dependency \u2014 backend/src/tripl/api/v1/alerting.py:263"}, "properties": {"repobilityId": "cfbd52cada0896b2", "scanner": "scanner-primary", "fingerprint": "2a11fa3898025536", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/alerting.py"}, "region": {"startLine": 263}}}]}, {"ruleId": "scanner-fa1293b513f30402", "level": "error", "message": {"text": "FastAPI POST `create_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:25"}, "properties": {"repobilityId": "42779d61b981dfcd", "scanner": "scanner-primary", "fingerprint": "fa1293b513f30402", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_types.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-3e95d276f8a5c7ea", "level": "error", "message": {"text": "FastAPI PATCH `update_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:57"}, "properties": {"repobilityId": "4860904ae6305e95", "scanner": "scanner-primary", "fingerprint": "3e95d276f8a5c7ea", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_types.py"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-2d8436b7c9a32785", "level": "error", "message": {"text": "FastAPI DELETE `delete_event_type` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:80"}, "properties": {"repobilityId": "a49877246e27cf5c", "scanner": "scanner-primary", "fingerprint": "2d8436b7c9a32785", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_types.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-951f8a3dddd8a71c", "level": "error", "message": {"text": "FastAPI POST `apply_schema_drift_action` without auth dependency \u2014 backend/src/tripl/api/v1/event_types.py:109"}, "properties": {"repobilityId": "be28c8c3579b48a6", "scanner": "scanner-primary", "fingerprint": "951f8a3dddd8a71c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/event_types.py"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-b3bfeccc64836a34", "level": "error", "message": {"text": "FastAPI POST `create_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:20"}, "properties": {"repobilityId": "a86eeaed29f0faa7", "scanner": "scanner-primary", "fingerprint": "b3bfeccc64836a34", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/meta_fields.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-4a1ec2e92ef4c4a1", "level": "error", "message": {"text": "FastAPI PATCH `update_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:42"}, "properties": {"repobilityId": "6b172c624d40d1b2", "scanner": "scanner-primary", "fingerprint": "4a1ec2e92ef4c4a1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/meta_fields.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-c5710afa2f0bdf7e", "level": "error", "message": {"text": "FastAPI DELETE `delete_meta_field` without auth dependency \u2014 backend/src/tripl/api/v1/meta_fields.py:65"}, "properties": {"repobilityId": "1646ec210fafaac0", "scanner": "scanner-primary", "fingerprint": "c5710afa2f0bdf7e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/meta_fields.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-d5f0537d9bb36352", "level": "error", "message": {"text": "FastAPI POST `create_revision` without auth dependency \u2014 backend/src/tripl/api/v1/plan_revisions.py:18"}, "properties": {"repobilityId": "13cf2b5861c5e884", "scanner": "scanner-primary", "fingerprint": "d5f0537d9bb36352", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_revisions.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-35b0eec2493f9454", "level": "error", "message": {"text": "FastAPI POST `create_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:36"}, "properties": {"repobilityId": "bbaa0779a5642770", "scanner": "scanner-primary", "fingerprint": "35b0eec2493f9454", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-6049a30074356576", "level": "error", "message": {"text": "FastAPI DELETE `delete_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:64"}, "properties": {"repobilityId": "facd5fa4c97d3607", "scanner": "scanner-primary", "fingerprint": "6049a30074356576", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-bcf72a54434dd560", "level": "error", "message": {"text": "FastAPI POST `transition_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:84"}, "properties": {"repobilityId": "1dd31c0a25165971", "scanner": "scanner-primary", "fingerprint": "bcf72a54434dd560", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-fd2c517767ccce7c", "level": "error", "message": {"text": "FastAPI POST `add_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:108"}, "properties": {"repobilityId": "82f032d24420c659", "scanner": "scanner-primary", "fingerprint": "fd2c517767ccce7c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-60894c62b687ce22", "level": "error", "message": {"text": "FastAPI DELETE `remove_reviewer` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:130"}, "properties": {"repobilityId": "b49820f6a521b284", "scanner": "scanner-primary", "fingerprint": "60894c62b687ce22", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-5da449379897b7b9", "level": "error", "message": {"text": "FastAPI POST `create_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:158"}, "properties": {"repobilityId": "2a8a6c8e86406e7a", "scanner": "scanner-primary", "fingerprint": "5da449379897b7b9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-096229393c4ba6fa", "level": "error", "message": {"text": "FastAPI DELETE `delete_comment` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:171"}, "properties": {"repobilityId": "4bd0b39f8aea1aae", "scanner": "scanner-primary", "fingerprint": "096229393c4ba6fa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-bbeb61b048460137", "level": "error", "message": {"text": "FastAPI POST `save_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:194"}, "properties": {"repobilityId": "d83d6aeaff50b358", "scanner": "scanner-primary", "fingerprint": "bbeb61b048460137", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-70185f5c2add6bc5", "level": "error", "message": {"text": "FastAPI DELETE `delete_branch_resolution` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:207"}, "properties": {"repobilityId": "9990bdd5a5b4d636", "scanner": "scanner-primary", "fingerprint": "70185f5c2add6bc5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-0960687533022ad6", "level": "error", "message": {"text": "FastAPI POST `merge_branch` without auth dependency \u2014 backend/src/tripl/api/v1/plan_branches.py:218"}, "properties": {"repobilityId": "e57ada27732259ba", "scanner": "scanner-primary", "fingerprint": "0960687533022ad6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/plan_branches.py"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-596c9432d25cd239", "level": "error", "message": {"text": "FastAPI PATCH `update_project_anomaly_settings` without auth dependency \u2014 backend/src/tripl/api/v1/project_anomaly_settings.py:23"}, "properties": {"repobilityId": "562dd72e98d9683f", "scanner": "scanner-primary", "fingerprint": "596c9432d25cd239", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/project_anomaly_settings.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-e0a8db74db8c652b", "level": "error", "message": {"text": "FastAPI PATCH `patch_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:53"}, "properties": {"repobilityId": "687c525d57e1db3b", "scanner": "scanner-primary", "fingerprint": "e0a8db74db8c652b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/app_settings.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-19ac152369e4e9bc", "level": "error", "message": {"text": "FastAPI PUT `put_service_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:65"}, "properties": {"repobilityId": "eec72fa04765601a", "scanner": "scanner-primary", "fingerprint": "19ac152369e4e9bc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/app_settings.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-bc5c3126be7c7f13", "level": "error", "message": {"text": "FastAPI PUT `put_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:82"}, "properties": {"repobilityId": "6c27f107022e3297", "scanner": "scanner-primary", "fingerprint": "bc5c3126be7c7f13", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/app_settings.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-a101a23ceb9d819f", "level": "error", "message": {"text": "FastAPI POST `test_ai_settings` without auth dependency \u2014 backend/src/tripl/api/v1/app_settings.py:95"}, "properties": {"repobilityId": "c270718f3880b881", "scanner": "scanner-primary", "fingerprint": "a101a23ceb9d819f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/app_settings.py"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-296f546ba4ed7676", "level": "error", "message": {"text": "FastAPI POST `create_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:20"}, "properties": {"repobilityId": "181e1ac4d8580a9a", "scanner": "scanner-primary", "fingerprint": "296f546ba4ed7676", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/relations.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-cb6b28a3c8327e93", "level": "error", "message": {"text": "FastAPI DELETE `delete_relation` without auth dependency \u2014 backend/src/tripl/api/v1/relations.py:42"}, "properties": {"repobilityId": "3d27d6c1549b9272", "scanner": "scanner-primary", "fingerprint": "cb6b28a3c8327e93", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/tripl/api/v1/relations.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "99bfcfa38bf01a93", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "2a3641f7ff43d34c", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-019f89a12641e77e", "level": "note", "message": {"text": "Unused endpoint: POST /demo"}, "properties": {"repobilityId": "083987a7e79e5d2d", "scanner": "scanner-primary", "fingerprint": "019f89a12641e77e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56608a3bd032f5f4", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}"}, "properties": {"repobilityId": "13cc88035bcd698b", "scanner": "scanner-primary", "fingerprint": "56608a3bd032f5f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd783a507a0abc70", "level": "note", "message": {"text": "Unused endpoint: PATCH /{slug}"}, "properties": {"repobilityId": "003a0c721789d04a", "scanner": "scanner-primary", "fingerprint": "dd783a507a0abc70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-115736d40adf25ab", "level": "note", "message": {"text": "Unused endpoint: DELETE /{slug}"}, "properties": {"repobilityId": "bd6adbef6aea025f", "scanner": "scanner-primary", "fingerprint": "115736d40adf25ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e547ce2dfbf6f101", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/events-metrics"}, "properties": {"repobilityId": "0c33a3bce33dc5ca", "scanner": "scanner-primary", "fingerprint": "e547ce2dfbf6f101", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c73d21666477f314", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{slug}/events/window-metrics"}, "properties": {"repobilityId": "39ba5e8a2e4a9fbb", "scanner": "scanner-primary", "fingerprint": "c73d21666477f314", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad5bb369d6dcf93d", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/metrics/total"}, "properties": {"repobilityId": "e4b19512f19d9b08", "scanner": "scanner-primary", "fingerprint": "ad5bb369d6dcf93d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-089874699816fb05", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics"}, "properties": {"repobilityId": "ac584caf14f7b78f", "scanner": "scanner-primary", "fingerprint": "089874699816fb05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-25f9c2b9434e6dda", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/events/{event_id}/metrics/breakdowns"}, "properties": {"repobilityId": "86d302c7b250a561", "scanner": "scanner-primary", "fingerprint": "25f9c2b9434e6dda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4396e607332fe4f", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/event-types/{event_type_id}/metrics"}, "properties": {"repobilityId": "d297267131d4a062", "scanner": "scanner-primary", "fingerprint": "a4396e607332fe4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f53c0a2edee9fb", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/anomalies/signals"}, "properties": {"repobilityId": "783b6ea40578ab73", "scanner": "scanner-primary", "fingerprint": "38f53c0a2edee9fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08365760eecf44a3", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{slug}/anomalies/signals/query"}, "properties": {"repobilityId": "815a51ad4688e596", "scanner": "scanner-primary", "fingerprint": "08365760eecf44a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bfd98187cb6678a3", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/top-movers"}, "properties": {"repobilityId": "ad1194a8c66a9fbe", "scanner": "scanner-primary", "fingerprint": "bfd98187cb6678a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dea17ff9d004dc06", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/seasonality"}, "properties": {"repobilityId": "dff94ab2277571f9", "scanner": "scanner-primary", "fingerprint": "dea17ff9d004dc06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1337319b98b430b5", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/breakdown-timeline"}, "properties": {"repobilityId": "03c056eec56e552a", "scanner": "scanner-primary", "fingerprint": "1337319b98b430b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9850d4b62621a9f", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/app-versions"}, "properties": {"repobilityId": "1d14c01bef89a0cd", "scanner": "scanner-primary", "fingerprint": "a9850d4b62621a9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd9d17495be7c21e", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/version-adoption"}, "properties": {"repobilityId": "cf4d46c604c02246", "scanner": "scanner-primary", "fingerprint": "dd9d17495be7c21e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c632849eae3d9cb6", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/scans/{scan_config_id}/release-regressions"}, "properties": {"repobilityId": "b5ca4b322cbfe516", "scanner": "scanner-primary", "fingerprint": "c632849eae3d9cb6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e43d655a5403575c", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{slug}/distribution-drifts"}, "properties": {"repobilityId": "23852b5069765d68", "scanner": "scanner-primary", "fingerprint": "e43d655a5403575c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2237995f6b8df190", "level": "note", "message": {"text": "Unused endpoint: DELETE /{owner_id}"}, "properties": {"repobilityId": "c6dceffee22f8fe4", "scanner": "scanner-primary", "fingerprint": "2237995f6b8df190", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f0a0bf734e5bcc", "level": "note", "message": {"text": "Unused endpoint: DELETE /{key_id}"}, "properties": {"repobilityId": "23236ade234d0a80", "scanner": "scanner-primary", "fingerprint": "38f0a0bf734e5bcc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff7208523efd8317", "level": "note", "message": {"text": "Unused endpoint: GET /shadow-events"}, "properties": {"repobilityId": "e6158c89dd304425", "scanner": "scanner-primary", "fingerprint": "ff7208523efd8317", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c345040b44afb42", "level": "note", "message": {"text": "Unused endpoint: POST /shadow-events/{candidate_id}/accept"}, "properties": {"repobilityId": "ae4c0bfb68138210", "scanner": "scanner-primary", "fingerprint": "6c345040b44afb42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56c0fc957e9b5db6", "level": "note", "message": {"text": "Unused endpoint: POST /shadow-events/{candidate_id}/dismiss"}, "properties": {"repobilityId": "bfbd5af6ba59f8f0", "scanner": "scanner-primary", "fingerprint": "56c0fc957e9b5db6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b27dcb02af21dbd", "level": "note", "message": {"text": "Unused endpoint: GET /dead-events"}, "properties": {"repobilityId": "8bcfd4e8e2774e8c", "scanner": "scanner-primary", "fingerprint": "5b27dcb02af21dbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6fc0caa269292c44", "level": "note", "message": {"text": "Unused endpoint: GET /coverage"}, "properties": {"repobilityId": "90df359b19fd2614", "scanner": "scanner-primary", "fingerprint": "6fc0caa269292c44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08a9d596dcf8c446", "level": "note", "message": {"text": "Unused endpoint: GET /{variable_id}/values"}, "properties": {"repobilityId": "aac240e9b3438097", "scanner": "scanner-primary", "fingerprint": "08a9d596dcf8c446", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc39515c8d5ea890", "level": "note", "message": {"text": "Unused endpoint: PATCH /{variable_id}"}, "properties": {"repobilityId": "a8dfde1cc0f070dd", "scanner": "scanner-primary", "fingerprint": "cc39515c8d5ea890", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f54dfba73ed1ec62", "level": "note", "message": {"text": "Unused endpoint: DELETE /{variable_id}"}, "properties": {"repobilityId": "2cafaea3692506b4", "scanner": "scanner-primary", "fingerprint": "f54dfba73ed1ec62", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "7d0a3d50000454af", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "5e4a7cf3c7bcbd1a", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "622d59cbfcc8753f", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "c1d628c45fafd641", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cccfe89f81ab208f", "level": "note", "message": {"text": "Unused endpoint: POST /preview"}, "properties": {"repobilityId": "45698cac6078979f", "scanner": "scanner-primary", "fingerprint": "cccfe89f81ab208f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9eb070f92accf95", "level": "note", "message": {"text": "Unused endpoint: GET /preview-jobs/{job_id}"}, "properties": {"repobilityId": "2a3336b92987e14d", "scanner": "scanner-primary", "fingerprint": "b9eb070f92accf95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-acfc279b767e6f3c", "level": "note", "message": {"text": "Unused endpoint: GET /{scan_id}"}, "properties": {"repobilityId": "95f0cf5ed570dbbf", "scanner": "scanner-primary", "fingerprint": "acfc279b767e6f3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00ac09b003d30935", "level": "note", "message": {"text": "Unused endpoint: PATCH /{scan_id}"}, "properties": {"repobilityId": "8998789a864141cc", "scanner": "scanner-primary", "fingerprint": "00ac09b003d30935", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fac3eaa72b5e399c", "level": "note", "message": {"text": "Unused endpoint: DELETE /{scan_id}"}, "properties": {"repobilityId": "a3f96e4f95f59c42", "scanner": "scanner-primary", "fingerprint": "fac3eaa72b5e399c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-474aae6303a4f2c1", "level": "note", "message": {"text": "Unused endpoint: POST /{scan_id}/run"}, "properties": {"repobilityId": "751acda17eeae368", "scanner": "scanner-primary", "fingerprint": "474aae6303a4f2c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc6285c3bf858173", "level": "note", "message": {"text": "Unused endpoint: POST /{scan_id}/event-groups/apply"}, "properties": {"repobilityId": "5fe8c6d68c8c3cea", "scanner": "scanner-primary", "fingerprint": "bc6285c3bf858173", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10418adb19aec2ac", "level": "note", "message": {"text": "Unused endpoint: POST /{scan_id}/metrics/replay"}, "properties": {"repobilityId": "55861e5d2c5dea91", "scanner": "scanner-primary", "fingerprint": "10418adb19aec2ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea52759b05ac2b24", "level": "note", "message": {"text": "Unused endpoint: GET /{scan_id}/jobs"}, "properties": {"repobilityId": "ef094ccc8061a9bb", "scanner": "scanner-primary", "fingerprint": "ea52759b05ac2b24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57dc950544f92168", "level": "note", "message": {"text": "Unused endpoint: GET /{scan_id}/jobs/{job_id}"}, "properties": {"repobilityId": "e5839a9381f7a078", "scanner": "scanner-primary", "fingerprint": "57dc950544f92168", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7197b34256d56f74", "level": "note", "message": {"text": "Unused endpoint: POST /{scan_id}/jobs/{job_id}/cancel"}, "properties": {"repobilityId": "c10dddcf2fd38d2b", "scanner": "scanner-primary", "fingerprint": "7197b34256d56f74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7aea7456f76f9b8e", "level": "note", "message": {"text": "Unused endpoint: PATCH /reorder"}, "properties": {"repobilityId": "660d41e18cee8bac", "scanner": "scanner-primary", "fingerprint": "7aea7456f76f9b8e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24d86d57684f08eb", "level": "note", "message": {"text": "Unused endpoint: DELETE /{photo_id}"}, "properties": {"repobilityId": "f4b7a6e47039a099", "scanner": "scanner-primary", "fingerprint": "24d86d57684f08eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e0123ce9372ecc5", "level": "note", "message": {"text": "Unused endpoint: GET /{photo_id}/file"}, "properties": {"repobilityId": "62b803a46995271c", "scanner": "scanner-primary", "fingerprint": "3e0123ce9372ecc5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b3d0dd53b75e494", "level": "note", "message": {"text": "Unused endpoint: POST /figma"}, "properties": {"repobilityId": "7f0983d87598d286", "scanner": "scanner-primary", "fingerprint": "7b3d0dd53b75e494", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}