{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"]}},{"id":"AC1","name":"Text alternatives","shortDescription":{"text":"Text alternatives"},"helpUri":"https://codehealth.canine.dev/dimensions/AC1"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC4","name":"Keyboard semantics","shortDescription":{"text":"Keyboard semantics"},"helpUri":"https://codehealth.canine.dev/dimensions/AC4"},{"id":"AC5","name":"ARIA correctness","shortDescription":{"text":"ARIA correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/AC5"},{"id":"AC6","name":"Visual \u0026 motion safety","shortDescription":{"text":"Visual \u0026 motion safety"},"helpUri":"https://codehealth.canine.dev/dimensions/AC6"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX9","name":"CQS / query purity","shortDescription":{"text":"CQS / query purity"},"helpUri":"https://codehealth.canine.dev/dimensions/AX9"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"id":"ED1","name":"Handler temporal coupling","shortDescription":{"text":"Handler temporal coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/ED1"},{"id":"ED2","name":"Event/command shape","shortDescription":{"text":"Event/command shape"},"helpUri":"https://codehealth.canine.dev/dimensions/ED2"},{"id":"ES1","name":"Fold determinism","shortDescription":{"text":"Fold determinism"},"helpUri":"https://codehealth.canine.dev/dimensions/ES1"},{"id":"ES2","name":"Immutable events","shortDescription":{"text":"Immutable events"},"helpUri":"https://codehealth.canine.dev/dimensions/ES2"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"P7","name":"Outbound HTTP resilience","shortDescription":{"text":"Outbound HTTP resilience"},"helpUri":"https://codehealth.canine.dev/dimensions/P7"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"S1","name":"Web-Security Posture","shortDescription":{"text":"Web-Security Posture"},"helpUri":"https://codehealth.canine.dev/dimensions/S1"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X31","name":"Test-only surface in a production module","shortDescription":{"text":"Test-only surface in a production module"},"helpUri":"https://codehealth.canine.dev/dimensions/X31"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"AdvancedMCPDashboard.AdvancedMCPDashboard (cyclomatic 113): AdvancedMCPDashboard.AdvancedMCPDashboard has cyclomatic complexity 113 (threshold 15). Most of this is not in the body itself: 7 of the 113 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 791, 321, 381, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"896f27114044d336632e2a4a9b625b2a9088f8b3876a6c4a126540fb46c6db0c"}},{"ruleId":"D1","level":"warning","message":{"text":"SimpleAdvancedChat.SimpleAdvancedChat (cyclomatic 104): SimpleAdvancedChat.SimpleAdvancedChat has cyclomatic complexity 104 (threshold 15). Of this number, 17 points are the body\u0027s own statements and 87 belong to 24 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"87bd6c779f6c41c3d19a4157b822b25453f8a9d556ecd49c79bc790d4f2dda52"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_tools.predefined_executor (cyclomatic 85): agent_tools.predefined_executor has cyclomatic complexity 85 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1319}}}],"partialFingerprints":{"codehealthFindingId/v1":"775ae49ce0254e3fcf47c5dfa670937e909e3af6fac20ba09c169de96d7e1c3d"}},{"ruleId":"D1","level":"warning","message":{"text":"hyper_graph_storage.handle_call (cyclomatic 73): hyper_graph_storage.handle_call has cyclomatic complexity 73 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/hyper_graph_storage.erl"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ccf10e429a0fc44006b4a663eae835d0272be03d8d1ea7ad0cbcd494f38fd32"}},{"ruleId":"D1","level":"warning","message":{"text":"embedding_integration.handle_call (cyclomatic 70): embedding_integration.handle_call has cyclomatic complexity 70 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"0aaf37c1b363a853c113057a14b984e13ccdf6ac3111abebf6fc71c6869f576f"}},{"ruleId":"D1","level":"warning","message":{"text":"App.App (cyclomatic 69): App.App has cyclomatic complexity 69 (threshold 15). Most of this is not in the body itself: 5 of the 69 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 226, 334, 131, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"c972c7be85146d28a14d41f3566aa9d5c218009b0746e54d48e7ad14e671fb11"}},{"ruleId":"D1","level":"warning","message":{"text":"Timeline.Timeline (cyclomatic 64): Timeline.Timeline has cyclomatic complexity 64 (threshold 15). Most of this is not in the body itself: 4 of the 64 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 180, 492, 297, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Timeline.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"d91a36fd15f2730de71cc3f69177c13eff82afe64e56c3cc6881cfad4f48c956"}},{"ruleId":"D1","level":"warning","message":{"text":"SystemMonitoringDashboard.SystemMonitoringDashboard (cyclomatic 62): SystemMonitoringDashboard.SystemMonitoringDashboard has cyclomatic complexity 62 (threshold 15). Of this number, 25 points are the body\u0027s own statements and 37 belong to 14 function literals inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SystemMonitoringDashboard.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"18057fd08b404c8460515c528b1437cc5798802bbcf3300f6fa8bb6bee23dc6b"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_manager.handle_call (cyclomatic 58): mcp_manager.handle_call has cyclomatic complexity 58 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_manager.erl"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"284bbedce6fe30831d25101c10a802ca05bd2662a25f7528fc764c0d7c03e534"}},{"ruleId":"D1","level":"warning","message":{"text":"CrashMonitorDashboard.CrashMonitorDashboard (cyclomatic 58): CrashMonitorDashboard.CrashMonitorDashboard has cyclomatic complexity 58 (threshold 15). Most of this is not in the body itself: 15 of the 58 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 275, 136, 264, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"988161fe57ad261cb4f9e4623d37d77659d750c87c4f6b4fb429c7c5f4db02ff"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedMessageRenderer.AdvancedMessageRenderer (cyclomatic 58): AdvancedMessageRenderer.AdvancedMessageRenderer has cyclomatic complexity 58 (threshold 15). Of this number, 56 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"591dafae7a43cf98145443803e1139d61ad3c5b77b52d91dd05c86e960aaedc1"}},{"ruleId":"D1","level":"warning","message":{"text":"ComprehensiveMCPManager.ComprehensiveMCPManager (cyclomatic 55): ComprehensiveMCPManager.ComprehensiveMCPManager has cyclomatic complexity 55 (threshold 15). Most of this is not in the body itself: 11 of the 55 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 290, 336, 351, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"69b76a78a8fe694ba4e7684b765bec7e2b3901fe065572026bb5295dfd2cd274"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_api_handler.handle_request (cyclomatic 50): mcp_api_handler.handle_request has cyclomatic complexity 50 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"205e91c9ca4e0f19267bb954037ca27ffb7387def4a7777a5b6321212b5fea64"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelTypeEditor.ModelTypeEditor (cyclomatic 45): ModelTypeEditor.ModelTypeEditor has cyclomatic complexity 45 (threshold 15). Most of this is not in the body itself: 4 of the 45 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 402, 338, 374, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2aa05e7dd9c923263b487e86f4f247f7a4c8ee5bbb6718b59bbe8fa0ff0260"}},{"ruleId":"D1","level":"warning","message":{"text":"ChainOfThoughtVisualization.ChainOfThoughtVisualization (cyclomatic 43): ChainOfThoughtVisualization.ChainOfThoughtVisualization has cyclomatic complexity 43 (threshold 15). Most of this is not in the body itself: 14 of the 43 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 235, 136, 125, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f322d2511f17a6accbd116ad58a0185dd4f20fc33bf89179225eb76d3258ca5"}},{"ruleId":"D1","level":"warning","message":{"text":"ErrorInterpretationPanel.ErrorInterpretationPanel (cyclomatic 42): ErrorInterpretationPanel.ErrorInterpretationPanel has cyclomatic complexity 42 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 24 belong to 11 function literals inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec3b09e82a97e235a44b8b76500189aceefc6eac563a195df26a1c992f8f06d9"}},{"ruleId":"D1","level":"warning","message":{"text":"DiscoveryMeshDashboard.DiscoveryMeshDashboard (cyclomatic 42): DiscoveryMeshDashboard.DiscoveryMeshDashboard has cyclomatic complexity 42 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 24 belong to 13 function literals inside it that branch. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"85abb17bd5cf0ba6959b74292d2c8db960cd6bcb6471f4de87be94734ab74f3b"}},{"ruleId":"D1","level":"warning","message":{"text":"FleetManagementDashboard.FleetManagementDashboard (cyclomatic 41): FleetManagementDashboard.FleetManagementDashboard has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 11 of the 41 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 150, 439, 120, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a8f4afb945819540be8260b86b152727b8bf8a403ede3dec37eb61fc92363a8"}},{"ruleId":"D1","level":"warning","message":{"text":"ToolRegistry.ToolRegistry (cyclomatic 41): ToolRegistry.ToolRegistry has cyclomatic complexity 41 (threshold 15). Most of this is not in the body itself: 2 of the 41 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 258, 270, 326, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ToolRegistry.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"452b543090ba0c29b021fc57249f0d402bcce0cf89392743ec7a4d7c37bcfac5"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_scheduling_handler.handle_request (cyclomatic 40): agent_scheduling_handler.handle_request has cyclomatic complexity 40 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e12418ef83fd68666c5916718762225a10704ff8de9d7ee1c7864c93d5c04de"}},{"ruleId":"D1","level":"warning","message":{"text":"MCPOrchestrationEngine.MCPOrchestrationEngine (cyclomatic 40): MCPOrchestrationEngine.MCPOrchestrationEngine has cyclomatic complexity 40 (threshold 15). Most of this is not in the body itself: 12 of the 40 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 404, 202, 324, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"f82e9bf90705476a004818ff1b286878595540c6522f17c61d630359a7b38e8d"}},{"ruleId":"D1","level":"warning","message":{"text":"swarm_intelligence_engine.handle_call (cyclomatic 38): swarm_intelligence_engine.handle_call has cyclomatic complexity 38 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/swarm_intelligence_engine.erl"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2ba55e24268e97cc9ccd22e68423d70cf2b8b6ce7c5fe8e3b719ad11e440375"}},{"ruleId":"D1","level":"warning","message":{"text":"ApiKeyManager.ApiKeyManager (cyclomatic 37): ApiKeyManager.ApiKeyManager has cyclomatic complexity 37 (threshold 15). Most of this is not in the body itself: 15 of the 37 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 69, 89, 107, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyManager.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"f557d8e8f50a7a5a38c4af4ecb41ea80c031bdf48fc9ae19f9db75347e0447b6"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_orchestration_handler.handle_request (cyclomatic 36): mcp_orchestration_handler.handle_request has cyclomatic complexity 36 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_orchestration_handler.erl"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"39a8635bf78cda67042aafade0f950aac8ba44969f14e16af09c18985427b7f9"}},{"ruleId":"D1","level":"warning","message":{"text":"PipedreamConnectionManager.PipedreamConnectionManager (cyclomatic 35): PipedreamConnectionManager.PipedreamConnectionManager has cyclomatic complexity 35 (threshold 15). Most of this is not in the body itself: 5 of the 35 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 305, 80, 92, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"819baf721655fc7d9602c14baac8bc7b0141e83fa3c31a4b8f93074af762c806"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_http_routes.validate_config_field (cyclomatic 34): mcp_http_routes.validate_config_field has cyclomatic complexity 34 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_http_routes.erl"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"50a27950883326f55f6088901d0a4790b1ab8a6e91458a926a43a34231c3c959"}},{"ruleId":"D1","level":"warning","message":{"text":"model_definition_manager.handle_call (cyclomatic 34): model_definition_manager.handle_call has cyclomatic complexity 34 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_definition_manager.erl"},"region":{"startLine":75}}}],"partialFingerprints":{"codehealthFindingId/v1":"39638765c29460b965abed1761117515a7aac1f12579761594d2854064269abf"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedStructuredOutputsManager.AdvancedStructuredOutputsManager (cyclomatic 34): AdvancedStructuredOutputsManager.AdvancedStructuredOutputsManager has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 11 of the 34 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 75, 133, 240, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"22c8efc12323e6498a8488f373991fc0ab8d5d1232d9330a3abc476912757624"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentCommunicationPanel.AgentCommunicationPanel (cyclomatic 34): AgentCommunicationPanel.AgentCommunicationPanel has cyclomatic complexity 34 (threshold 15). Most of this is not in the body itself: 4 of the 34 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 63, 96, 200, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c731f678a278f0995de825dbd7d3e28dd28bf5709eeb7e44e68ce8bdfae7396"}},{"ruleId":"D1","level":"warning","message":{"text":"DynamicUIManager.DynamicUIManager (cyclomatic 33): DynamicUIManager.DynamicUIManager has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 6 of the 33 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 233, 120, 181, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DynamicUIManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"3981d1f36d353f392b6b41c1e2add30110c9ec18b6d778b927de2ad1996b66c5"}},{"ruleId":"D1","level":"warning","message":{"text":"MCPServerManager.MCPServerManager (cyclomatic 33): MCPServerManager.MCPServerManager has cyclomatic complexity 33 (threshold 15). Most of this is not in the body itself: 12 of the 33 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 221, 91, 100, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPServerManager.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c08fc392de0c0786038dc6a7b35173f4c14e008f18ef8e1577d7fe8d8b715c5f"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_connection_manager.handle_call (cyclomatic 32): mcp_connection_manager.handle_call has cyclomatic complexity 32 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_connection_manager.erl"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d7c849ed5e847c2c7e718c4a58e95e7de50301145f18b49866b45f894aae3a"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelConfiguration.ModelConfiguration (cyclomatic 31): ModelConfiguration.ModelConfiguration has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 6 of the 31 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 113, 422, 140, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bf20a695d5e0119e75d942f0d912dd5471b8ade434d86cf0f1bdd1f427e616b"}},{"ruleId":"D1","level":"warning","message":{"text":"ClaudeCLI.ClaudeCLI (cyclomatic 31): ClaudeCLI.ClaudeCLI has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 4 of the 31 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 151, 69, 125, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ClaudeCLI.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e10d29a5169cbed43747a068934692f28e0d3ff4b4e7712227f9382bfd136b9a"}},{"ruleId":"D1","level":"warning","message":{"text":"MCPOAuthManager.MCPOAuthManager (cyclomatic 31): MCPOAuthManager.MCPOAuthManager has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 10 of the 31 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 51, 109, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOAuthManager.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"1264402fc2ef9ed5aa63d59f877476e7704b2e171292a0e434e261d40691e27a"}},{"ruleId":"D1","level":"warning","message":{"text":"OAuthManager.OAuthManager (cyclomatic 31): OAuthManager.OAuthManager has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 2 of the 31 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 173, 131, 242, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/OAuthManager.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"a202b965f5f586e3c934a6b6b18fcffa1b8e30489828d9e5dca795b3829d3c89"}},{"ruleId":"D1","level":"warning","message":{"text":"QuantumConsciousnessInterface.QuantumConsciousnessInterface (cyclomatic 31): QuantumConsciousnessInterface.QuantumConsciousnessInterface has cyclomatic complexity 31 (threshold 15). Most of this is not in the body itself: 6 of the 31 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 173, 413, 102, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"b88fa1bba0e0f4f63e75612bbdfd2c196a6eff458e6994abe27f5027e498c79d"}},{"ruleId":"D1","level":"warning","message":{"text":"useAgents.useAgents (cyclomatic 30): useAgents.useAgents has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 1 of the 30 points is its own statement and the rest belongs to 11 function literals inside it that branch (lines 125, 50, 22, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/hooks/useAgents.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1028ba97772d3ffb07042a3138432dc21be5a6bece132504e549a800e18627a"}},{"ruleId":"D1","level":"warning","message":{"text":"InteractiveReasoningControls.InteractiveReasoningControls (cyclomatic 30): InteractiveReasoningControls.InteractiveReasoningControls has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 13 of the 30 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 112, 158, 193, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"097406913737d89440047a8702778cc594aabe8f71628c31826720bc75dc4388"}},{"ruleId":"D1","level":"warning","message":{"text":"MultiAgentChat.MultiAgentChat (cyclomatic 30): MultiAgentChat.MultiAgentChat has cyclomatic complexity 30 (threshold 15). Most of this is not in the body itself: 14 of the 30 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 54, 100, 76, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"476fe1d1c72fe36803891090f6414a774fbaaef7b4a19d47a9cf3a7840edae54"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_tools.handle_call (cyclomatic 29): agent_tools.handle_call has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"117edb782ba356af2a738194a7a85f223a706b7ecf21c292ac0da5e69129f752"}},{"ruleId":"D1","level":"warning","message":{"text":"consciousness_simulation_engine.handle_call (cyclomatic 29): consciousness_simulation_engine.handle_call has cyclomatic complexity 29 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/consciousness_simulation_engine.erl"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"aec81c0f0e28d7df258a434bed48828639f4fe729a153589aaba36eee732908c"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_api_handler.create_agent_by_type (cyclomatic 28): agent_api_handler.create_agent_by_type has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"42338ba27a23e76fd720e3d1b1cdec1b9e4db6b51cff5cf180aec7afd5fc070f"}},{"ruleId":"D1","level":"warning","message":{"text":"dimensional_phase_shift_engine.handle_call (cyclomatic 28): dimensional_phase_shift_engine.handle_call has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dimensional_phase_shift_engine.erl"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc29e885393f4b7259b761ed997ce9c67394f2089072e25091433f79ae0ff532"}},{"ruleId":"D1","level":"warning","message":{"text":"temporal_transcendence_engine.handle_call (cyclomatic 28): temporal_transcendence_engine.handle_call has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/temporal_transcendence_engine.erl"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c62dc907178acc9b2eb7bd6edf73baea150ab2d0f0560286510e9ca98f3d380"}},{"ruleId":"D1","level":"warning","message":{"text":"DenseApp.DenseApp (cyclomatic 28): DenseApp.DenseApp has cyclomatic complexity 28 (threshold 15). Most of this is not in the body itself: 4 of the 28 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 137, 90, 109, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseApp.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca8669c689f506467c585f96350a939b00112936bfd2cafa511b353417e62285"}},{"ruleId":"D1","level":"warning","message":{"text":"examples_handler.run_example (cyclomatic 27): examples_handler.run_example has cyclomatic complexity 27 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/examples_handler.erl"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d2364869618a62ab3bd9c9c2ca3fffa82de7d4ab556e98998ee4315c418fd6"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_tool_registry.handle_call (cyclomatic 27): agent_tool_registry.handle_call has cyclomatic complexity 27 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tool_registry.erl"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ee6e6be6570abacd159f1da7c8053dc6e4084b24c9b22b709dbc94a59ebb909"}},{"ruleId":"D1","level":"warning","message":{"text":"AgentQuorumPanel.AgentQuorumPanel (cyclomatic 27): AgentQuorumPanel.AgentQuorumPanel has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 2 of the 27 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 279, 225, 84, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef20be1704ec5afe025852ebe7a4f520bc34a7839e1725a9b14b2cb96fda819"}},{"ruleId":"D1","level":"warning","message":{"text":"knowledge_base_handler.handle_request (cyclomatic 26): knowledge_base_handler.handle_request has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/knowledge_base_handler.erl"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd2b9341cc9dea9bd90f0353ab01974f3876e2fed6ebf3e3ee34d397a07a8f6"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_collaboration.handle_call (cyclomatic 26): agent_collaboration.handle_call has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_collaboration.erl"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"c21750ca91f1c4b7181db889c5ecc51a08f179d3f907e91c7bee8c4c717b0744"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_dynamic_system.handle_call (cyclomatic 26): agent_dynamic_system.handle_call has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_dynamic_system.erl"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ec104f2f090de633c38a9c34a4a5d5a4debb8a7f9c20cab692ff4dac01680cc"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_ws_handler.websocket_handle (cyclomatic 25): agent_ws_handler.websocket_handle has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_ws_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8916c05a26ad6f12657666587bb802fd6c1b7552f76209cccaed77ee9565dc5"}},{"ruleId":"D1","level":"warning","message":{"text":"oauth_manager.handle_call (cyclomatic 25): oauth_manager.handle_call has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_manager.erl"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"76cd66bb54378d4454a245713df0a2eafab7cd8f1245841dbc67f591cac883a9"}},{"ruleId":"D1","level":"warning","message":{"text":"self_modifying_agent_engine.handle_call (cyclomatic 25): self_modifying_agent_engine.handle_call has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_modifying_agent_engine.erl"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf33fa95669c30982e271d48318d248d4f8fc7252b2968fd15b317f4619830d"}},{"ruleId":"D1","level":"warning","message":{"text":"openai_chat.do_create_chat_completion (cyclomatic 25): openai_chat.do_create_chat_completion has cyclomatic complexity 25 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"107b8814ae1085d456ca61ea06d07a5d30abcc8914cd956ddbe77bc87c7b80c4"}},{"ruleId":"D1","level":"warning","message":{"text":"SimpleAdvancedChat.AdvancedMessageContent (cyclomatic 25): SimpleAdvancedChat.AdvancedMessageContent has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 7 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 144, 86, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cef5673777a0eeab4b9cc3543c7a61063e969a3e459de5f8521f91d2260cec7"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_discovery.handle_call (cyclomatic 24): agent_discovery.handle_call has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccae64ceba27a43b8b5db37a65521227175ec7da3ef5103133a403c87487ca2b"}},{"ruleId":"D1","level":"warning","message":{"text":"token_stream_fsm.streaming (cyclomatic 24): token_stream_fsm.streaming has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"86cf9d3a7c43f963e05dfd690d3ad4d6c07b3db46cce07d0121d6d6701131c79"}},{"ruleId":"D1","level":"warning","message":{"text":"openapi_validator.validate_parameter (cyclomatic 24): openapi_validator.validate_parameter has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_validator.erl"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"743ea25028a992808f5fecee5032080a3465239e2a4d6edc4ddb6b5cea3a79ed"}},{"ruleId":"D1","level":"warning","message":{"text":"AdaptiveAIInterface.AdaptiveAIInterface (cyclomatic 24): AdaptiveAIInterface.AdaptiveAIInterface has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 131, 212, 205, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9fd5206a4f5faba785ddf2de67cc2645452ce1f3c41334c4ca4057a4d0dead"}},{"ruleId":"D1","level":"warning","message":{"text":"pipedream_auth_handler.handle_call (cyclomatic 23): pipedream_auth_handler.handle_call has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_auth_handler.erl"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c46796fe8697450e111f32f73f067b4b6cf3d75f63411f86595e0b1ca759f3"}},{"ruleId":"D1","level":"warning","message":{"text":"dynamic_supervisor_manager.handle_call (cyclomatic 23): dynamic_supervisor_manager.handle_call has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_supervisor_manager.erl"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"f83931d2efbfa72439f18d29ac018d59f8c854bd794655529c8274857f56d785"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_oauth_handler.handle_request (cyclomatic 22): mcp_oauth_handler.handle_request has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_handler.erl"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c8fa35c7ec57a6871f994dfcebb149992dfa57b45e9dd52417ef73f6976a3f"}},{"ruleId":"D1","level":"warning","message":{"text":"openapi_dynamic_handler.generate_mock_for_type (cyclomatic 22): openapi_dynamic_handler.generate_mock_for_type has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_dynamic_handler.erl"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"28501330ecf6c23bf6eda023bd86c946235b0a60b3bfa6fecd8baf3b70a25a4e"}},{"ruleId":"D1","level":"warning","message":{"text":"Dashboard.Dashboard (cyclomatic 22): Dashboard.Dashboard has cyclomatic complexity 22 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 4 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Dashboard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa598cd32de28b07a7ec6ccaf1902d639dade019a4891a1fb361d1091096dd1b"}},{"ruleId":"D1","level":"warning","message":{"text":"MultiAgentChat.GroupChatInterface (cyclomatic 22): MultiAgentChat.GroupChatInterface has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 2 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 370, 392, 484, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"2345c5462722270181becfdb295a1f0ac6d5a174dbc32cccd7f09c02592df498"}},{"ruleId":"D1","level":"warning","message":{"text":"crash_report_api_handler.handle_get_path (cyclomatic 21): crash_report_api_handler.handle_get_path has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"df7e02a2f10aadf51e38c2daed170d1b1e5baca08a1b10d4f08673a96302e4ed"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_oauth_client.handle_call (cyclomatic 21): mcp_oauth_client.handle_call has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3154e51322c3c3db9b1da87aa4158b2fa234d23035ee7ee39a499678f1eb440"}},{"ruleId":"D1","level":"warning","message":{"text":"streaming_function_handler.process_token_for_display (cyclomatic 21): streaming_function_handler.process_token_for_display has cyclomatic complexity 21 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/streaming_function_handler.erl"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b4f35bff55cf19a501992f1d5998a251dcf4e1481bc5f4b4d43622ee9187612"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_server.handle_mcp_request (cyclomatic 20): mcp_server.handle_mcp_request has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"77906087987dc71fdc5d9161031b9eac8a80faf48ad19bded8a8b48d3fe8df04"}},{"ruleId":"D1","level":"warning","message":{"text":"agent_tools.execute_file_list (cyclomatic 20): agent_tools.execute_file_list has cyclomatic complexity 20 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":3106}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff2b073f0bce6475e20b6623891b8e0fb3eb54265936ebb3e9c574b9c1b4d13"}},{"ruleId":"D1","level":"warning","message":{"text":"SimpleAdvancedChat.ContentAnalysisBadge (cyclomatic 20): SimpleAdvancedChat.ContentAnalysisBadge has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"be717e39dd9a0941e5eb1762fed63a64a91d05f6563fbce2e2eedae5ba30fc0f"}},{"ruleId":"D1","level":"warning","message":{"text":"CommandPalette.CommandPalette (cyclomatic 20): CommandPalette.CommandPalette has cyclomatic complexity 20 (threshold 15). Of this number, 10 points are the body\u0027s own statements and 10 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CommandPalette.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"910e7d00bcad02b03bcb656b49766bd6787422943035e48d87240f015458475e"}},{"ruleId":"D1","level":"warning","message":{"text":"consciousness_bridge_api_handler.handle_post (cyclomatic 19): consciousness_bridge_api_handler.handle_post has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7ba3ada690d65122e8b882c253aec0ed81c851b8e88f76b18d90742d4d7a3c9"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_client_v2.start_websocket_connection (cyclomatic 19): mcp_client_v2.start_websocket_connection has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"d94ffeb83acfe075eaf8f630de2357c6f73738180b21798bed4cd56e2d2b0ed0"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_server_config.add_server (cyclomatic 19): mcp_server_config.add_server has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/mcp_server_config.erl"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aceb69fefc97aa98ffce483a2f0e6876304a0326f44409ef4753ad261967a48"}},{"ruleId":"D1","level":"warning","message":{"text":"openapi_introspection.handle_call (cyclomatic 19): openapi_introspection.handle_call has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_introspection.erl"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"69f28b780c4f4a5bc7e23896f682eb64b57678c1ec37b6610c7602534c86f881"}},{"ruleId":"D1","level":"warning","message":{"text":"DenseDashboard.DenseDashboard (cyclomatic 19): DenseDashboard.DenseDashboard has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 5 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 85, 36, 16, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseDashboard.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"29ce3de7ee1ea8b85564adf4846d1861fad3859c2006a4f8a34ba812085db04f"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_client_v2.handle_call (cyclomatic 18): mcp_client_v2.handle_call has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3c99105e13b2e58ffd754853d692daf964b289a8cd008819e4e82fe2f5ed05"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_client_v2.send_message (cyclomatic 18): mcp_client_v2.send_message has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7df7aa3c9014f27f6d47b82b7b2acedebe632f2b358228a6a0226c8b6681150"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_http_session_manager.handle_call (cyclomatic 18): mcp_http_session_manager.handle_call has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_http_session_manager.erl"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3299971243af576d270f669eda04cbee449574e1c18023704626c2ec5a164fa"}},{"ruleId":"D1","level":"warning","message":{"text":"specialized_agent_factory.handle_call (cyclomatic 18): specialized_agent_factory.handle_call has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/specialized_agent_factory.erl"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"f784fafc1806336758bb5e0b4b90a33e2a3d70e2ae67dabe7ea9c38f8e2673f6"}},{"ruleId":"D1","level":"warning","message":{"text":"openai_chat.do_create_streaming_completion (cyclomatic 18): openai_chat.do_create_streaming_completion has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing. This is NOT this file\u0027s highest cyclomatic complexity: openai_chat.process_streaming_event (cyclomatic 25) is higher and carries no row of its own \u2014 it was excluded as a flat dispatcher (a long switch/match over independent cases: many branches, almost no nesting), which this dimension does not treat as a refactor obligation. It is named here so the ranking you see in this file is not mistaken for the whole of it; the excluded function is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"f24ee71b8be4c953604c3d10d87b2574c6d2094f2a024a4c6395966800b2720f"}},{"ruleId":"D1","level":"warning","message":{"text":"ResourceSentinelBar.ResourceSentinelBar (cyclomatic 18): ResourceSentinelBar.ResourceSentinelBar has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 2 of the 18 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 38, 52, 68). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d726516fe9c8a1685d30413dd3be73033fff675a212cb338801ba1dbb059fe"}},{"ruleId":"D1","level":"warning","message":{"text":"conversation_stats_logger.handle_cast (cyclomatic 17): conversation_stats_logger.handle_cast has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_stats_logger.erl"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"9da52bd9a65a614a0df0ddcc4342a1f20577a76bdfd873aa0b70a81a147cbf3a"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_registry.handle_call (cyclomatic 17): mcp_registry.handle_call has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_registry.erl"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"1657d9ae7606d9b7c1ea42815f32c324d515408103d3c73a15de6a70f5d36210"}},{"ruleId":"D1","level":"warning","message":{"text":"neural_swarm_api_handler.handle_post (cyclomatic 17): neural_swarm_api_handler.handle_post has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/neural_swarm_api_handler.erl"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aa2a0490e7b7d5eb6cad66eb14b84b69b80722b4a2dae2b7b12b06e8d0799c1"}},{"ruleId":"D1","level":"warning","message":{"text":"mcp_advanced_config.handle_call (cyclomatic 16): mcp_advanced_config.handle_call has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_config.erl"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"90f1198a5bcbbdf69e5394f95cfff73de05d7daac16d899687a4a9bab6d59fd3"}},{"ruleId":"D1","level":"warning","message":{"text":"SeedServersDialog.SeedServersDialog (cyclomatic 16): SeedServersDialog.SeedServersDialog has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 143, 212, 125, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SeedServersDialog.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b9aadb41113d2a78d55e4851957b620e7c8b5bd3284866f94ae543fb841819"}},{"ruleId":"D1","level":"warning","message":{"text":"AdvancedMCPDashboard.ServerDetailPanel (cyclomatic 16): AdvancedMCPDashboard.ServerDetailPanel has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93ff87f2b0211966570ee8ae60f8b4101c2e7345ca59a6a1b6ef0ec7ab89270"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleAdvancedChat.SimpleAdvancedChat (cognitive 100): SimpleAdvancedChat.SimpleAdvancedChat has cognitive complexity 100 (threshold 15). Drivers by points: if/else 37 (46 pts), boolean chains 35, error handling 9, ternaries 8, loops 1, match/switch 1 (nesting depth added 9). Most of this is not in the body itself: 13 of the 100 points are its own statements and the rest belongs to 24 function literals inside it that branch (lines 792, 527, 763, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed756254d5a4ec5d85a2d605b7d2bbd7666a64eb620cf2d764db41099dd91c6f"}},{"ruleId":"D2","level":"warning","message":{"text":"colored_io.detect_log_type (cognitive 90): colored_io.detect_log_type has cognitive complexity 90 (threshold 15). Drivers by points: match/switch 24 (90 pts) (nesting depth added 66). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/colored_io.erl"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df1a8173cbb6f487a31e5be0166caa1842019a13744636abbebd05061673f04"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedMCPDashboard.AdvancedMCPDashboard (cognitive 89): AdvancedMCPDashboard.AdvancedMCPDashboard has cognitive complexity 89 (threshold 15). Drivers by points: boolean chains 33, if/else 20, ternaries 15 (17 pts), match/switch 8 (9 pts), error handling 7, loops 2 (3 pts) (nesting depth added 4). Most of this is not in the body itself: 6 of the 89 points are its own statements and the rest belongs to 35 function literals inside it that branch (lines 791, 356, 381, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"580f24dbb186166f4d7744e8ee2a955121addab37065cde1c7ed3f7f1891cae6"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedMessageRenderer.AdvancedMessageRenderer (cognitive 62): AdvancedMessageRenderer.AdvancedMessageRenderer has cognitive complexity 62 (threshold 15). Drivers by points: if/else 23 (31 pts), boolean chains 23, loops 5, ternaries 3 (nesting depth added 8). Of this number, 60 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"a58715a9672d7474032c896b1e52b9d817f42951a43a70cd35b7c241f08cf355"}},{"ruleId":"D2","level":"warning","message":{"text":"CrashMonitorDashboard.CrashMonitorDashboard (cognitive 56): CrashMonitorDashboard.CrashMonitorDashboard has cognitive complexity 56 (threshold 15). Drivers by points: ternaries 9 (19 pts), boolean chains 16, if/else 10 (12 pts), error handling 6, match/switch 3 (nesting depth added 12). Of this number, 16 points are the body\u0027s own statements and 40 belong to 17 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7cdfd3b600f6b3c632f5cc7bb6121a4548af6acab23ab1fb6915799382ac4cf"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tools.execute_file_list (cognitive 50): agent_tools.execute_file_list has cognitive complexity 50 (threshold 15). Drivers by points: match/switch 12 (31 pts), if/else 2 (10 pts), loops 2 (8 pts), error handling 1 (nesting depth added 33). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":3106}}}],"partialFingerprints":{"codehealthFindingId/v1":"279feb9bddefa6a9fd9ab99678414c1b4ecab697302fc3691dd918bdc19f9399"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelTypeEditor.ModelTypeEditor (cognitive 50): ModelTypeEditor.ModelTypeEditor has cognitive complexity 50 (threshold 15). Drivers by points: ternaries 13 (27 pts), if/else 9 (10 pts), boolean chains 9, error handling 2, match/switch 2 (nesting depth added 15). Most of this is not in the body itself: 5 of the 50 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 374, 338, 94, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0846e17361705f818ab95f96a0dc75b3582ecbeda2d2e4cab7a4b00dab1258e"}},{"ruleId":"D2","level":"warning","message":{"text":"ComprehensiveMCPManager.ComprehensiveMCPManager (cognitive 49): ComprehensiveMCPManager.ComprehensiveMCPManager has cognitive complexity 49 (threshold 15). Drivers by points: if/else 18 (21 pts), boolean chains 13, error handling 11, match/switch 2, ternaries 2 (nesting depth added 3). Most of this is not in the body itself: 7 of the 49 points are its own statements and the rest belongs to 16 function literals inside it that branch (lines 290, 130, 161, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e00ed0e3ed6c994aa320613072d51d10bc335a020ab0d0adca92e619addce3d"}},{"ruleId":"D2","level":"warning","message":{"text":"SystemMonitoringDashboard.SystemMonitoringDashboard (cognitive 47): SystemMonitoringDashboard.SystemMonitoringDashboard has cognitive complexity 47 (threshold 15). Drivers by points: boolean chains 23, if/else 12, ternaries 6, error handling 4, match/switch 2. Of this number, 21 points are the body\u0027s own statements and 26 belong to 14 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SystemMonitoringDashboard.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c74aabedee26f43f39bc42ac97032b2c6656a1c39ca299fdaebecfbe76ae27fc"}},{"ruleId":"D2","level":"warning","message":{"text":"Timeline.Timeline (cognitive 46): Timeline.Timeline has cognitive complexity 46 (threshold 15). Drivers by points: boolean chains 20, if/else 14, error handling 4 (6 pts), match/switch 4, ternaries 2 (nesting depth added 2). Most of this is not in the body itself: 3 of the 46 points are its own statements and the rest belongs to 15 function literals inside it that branch (lines 492, 180, 263, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Timeline.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"827c8ef23c6e4e3b57889d8d6c68d02173935a4774da7939e7d3aa9490665455"}},{"ruleId":"D2","level":"warning","message":{"text":"App.App (cognitive 45): App.App has cognitive complexity 45 (threshold 15). Drivers by points: boolean chains 22, if/else 9 (10 pts), error handling 6 (7 pts), ternaries 4, match/switch 2 (nesting depth added 2). Most of this is not in the body itself: 4 of the 45 points are its own statements and the rest belongs to 14 function literals inside it that branch (lines 131, 226, 334, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"745ce3071632c3b4e91cfd809670ceae2e0f8788bb850c9515457297a7facfe7"}},{"ruleId":"D2","level":"warning","message":{"text":"FleetManagementDashboard.FleetManagementDashboard (cognitive 43): FleetManagementDashboard.FleetManagementDashboard has cognitive complexity 43 (threshold 15). Drivers by points: boolean chains 17, if/else 15, error handling 5, ternaries 5, match/switch 1. Most of this is not in the body itself: 10 of the 43 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 150, 120, 189, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3842c56c0926c35dd3f6e850551b00945608a10203eec5d264e5e31dde386d6"}},{"ruleId":"D2","level":"warning","message":{"text":"embedding_integration.handle_call (cognitive 40): embedding_integration.handle_call has cognitive complexity 40 (threshold 15). Drivers by points: match/switch 14 (33 pts), error handling 7 (nesting depth added 19). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4ffcbc35dc2872633953ecf395fa342702d6dbcd85ae67c25bb407322be7c53"}},{"ruleId":"D2","level":"warning","message":{"text":"OAuthManager.OAuthManager (cognitive 40): OAuthManager.OAuthManager has cognitive complexity 40 (threshold 15). Drivers by points: if/else 21 (25 pts), boolean chains 5, error handling 5, ternaries 2 (4 pts), loops 1 (nesting depth added 6). Most of this is not in the body itself: 1 of the 40 points is its own statement and the rest belongs to 13 function literals inside it that branch (lines 173, 242, 103, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/OAuthManager.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea420d93ed664db63a809477553e1da53fd641aa85c15a4d169ed80421507468"}},{"ruleId":"D2","level":"warning","message":{"text":"ToolRegistry.ToolRegistry (cognitive 38): ToolRegistry.ToolRegistry has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 10 (15 pts), boolean chains 8, if/else 8, error handling 5, match/switch 2 (nesting depth added 5). Most of this is not in the body itself: 1 of the 38 points is its own statement and the rest belongs to 12 function literals inside it that branch (lines 270, 84, 199, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ToolRegistry.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf7c0773e833d9ec6ca5749257bcd4a922f2160c52f1e22dd41d9490673864c"}},{"ruleId":"D2","level":"warning","message":{"text":"ClaudeCLI.ClaudeCLI (cognitive 37): ClaudeCLI.ClaudeCLI has cognitive complexity 37 (threshold 15). Drivers by points: if/else 14 (17 pts), ternaries 5 (10 pts), boolean chains 8, error handling 2 (nesting depth added 8). Most of this is not in the body itself: 3 of the 37 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 151, 125, 69, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ClaudeCLI.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"e946c53904de7873fc0a8a7f331b3299effadd305385c3cd1354158d09372775"}},{"ruleId":"D2","level":"warning","message":{"text":"distributed_consensus_tracker.calculate_efficiency_metrics (cognitive 35): distributed_consensus_tracker.calculate_efficiency_metrics has cognitive complexity 35 (threshold 15). Drivers by points: loops 5 (15 pts), match/switch 8 (13 pts), if/else 2 (7 pts) (nesting depth added 20). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/distributed_consensus_tracker.erl"},"region":{"startLine":741}}}],"partialFingerprints":{"codehealthFindingId/v1":"a885e1b7c378c264ff1a33ea9a8010c0009b7f3ae4b8114b83aef92cc9a9deb3"}},{"ruleId":"D2","level":"warning","message":{"text":"DiscoveryMeshDashboard.DiscoveryMeshDashboard (cognitive 35): DiscoveryMeshDashboard.DiscoveryMeshDashboard has cognitive complexity 35 (threshold 15). Drivers by points: boolean chains 14, ternaries 9, error handling 5, if/else 5, match/switch 2. Of this number, 17 points are the body\u0027s own statements and 18 belong to 13 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cefc3196e9b2c2d3c9a828168fd754769f8e967d3174b1adcbbcf3f98c73e6a"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_api_handler.handle_request (cognitive 34): mcp_api_handler.handle_request has cognitive complexity 34 (threshold 15). Drivers by points: match/switch 25 (32 pts), boolean chains 1, error handling 1 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"31aa61bdd5f1b8718571198e8009a29c1b9d25d66f7177c36d665e05f5b0285c"}},{"ruleId":"D2","level":"warning","message":{"text":"MCPOrchestrationEngine.MCPOrchestrationEngine (cognitive 34): MCPOrchestrationEngine.MCPOrchestrationEngine has cognitive complexity 34 (threshold 15). Drivers by points: boolean chains 21, if/else 7, error handling 6. Most of this is not in the body itself: 11 of the 34 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 404, 202, 324, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"74bef8d8bbbca700b774945a7700468c746637f8f04f9ac345dba74ed76df188"}},{"ruleId":"D2","level":"warning","message":{"text":"MCPOAuthManager.MCPOAuthManager (cognitive 34): MCPOAuthManager.MCPOAuthManager has cognitive complexity 34 (threshold 15). Drivers by points: if/else 12 (13 pts), ternaries 5 (9 pts), boolean chains 7, error handling 5 (nesting depth added 5). Most of this is not in the body itself: 9 of the 34 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 51, 109, 154, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOAuthManager.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d42fd76d0cdb59a1bf10a476d5dfb9abdfbe429b11e27aa589ac34ebb14cbd77"}},{"ruleId":"D2","level":"warning","message":{"text":"PipedreamConnectionManager.PipedreamConnectionManager (cognitive 34): PipedreamConnectionManager.PipedreamConnectionManager has cognitive complexity 34 (threshold 15). Drivers by points: boolean chains 10, error handling 8, if/else 8, ternaries 7 (8 pts) (nesting depth added 1). Most of this is not in the body itself: 4 of the 34 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 305, 80, 92, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"7047107d1046f4be95c88e649c0071627baa86f9169af2afa35a4842db934b7f"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentQuorumPanel.AgentQuorumPanel (cognitive 33): AgentQuorumPanel.AgentQuorumPanel has cognitive complexity 33 (threshold 15). Drivers by points: ternaries 14 (22 pts), boolean chains 6, if/else 3, error handling 2 (nesting depth added 8). Most of this is not in the body itself: 1 of the 33 points is its own statement and the rest belongs to 9 function literals inside it that branch (lines 279, 225, 84, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b55061453e5fc762f450fa91afd3826e99c226179218a5a38bb47d779837f2"}},{"ruleId":"D2","level":"warning","message":{"text":"QuantumConsciousnessInterface.QuantumConsciousnessInterface (cognitive 33): QuantumConsciousnessInterface.QuantumConsciousnessInterface has cognitive complexity 33 (threshold 15). Drivers by points: if/else 12 (14 pts), ternaries 7 (8 pts), boolean chains 4, loops 4, error handling 3 (nesting depth added 3). Most of this is not in the body itself: 5 of the 33 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 173, 102, 245, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"84819543162d34f6bc8fecc506fe94dfb8f798ed5032fcbebb24d3f10746fdf6"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tools.predefined_executor (cognitive 32): agent_tools.predefined_executor has cognitive complexity 32 (threshold 15). Drivers by points: match/switch 16 (30 pts), loops 1 (2 pts) (nesting depth added 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1319}}}],"partialFingerprints":{"codehealthFindingId/v1":"9dc9e5e77d5138f2541ff47056f0e2bc8b686449bdc5dffea4eb07e5bf2ba154"}},{"ruleId":"D2","level":"warning","message":{"text":"ChainOfThoughtVisualization.ChainOfThoughtVisualization (cognitive 32): ChainOfThoughtVisualization.ChainOfThoughtVisualization has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16 (17 pts), boolean chains 11, ternaries 2, error handling 1, match/switch 1 (nesting depth added 1). Most of this is not in the body itself: 10 of the 32 points are its own statements and the rest belongs to 12 function literals inside it that branch (lines 98, 125, 248, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22983516e8ac02f362d70ebd32d7599bd8cf6c0dca6aeace9e51ff9fc8076b3"}},{"ruleId":"D2","level":"warning","message":{"text":"ApiKeyManager.ApiKeyManager (cognitive 32): ApiKeyManager.ApiKeyManager has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 16, if/else 7 (8 pts), error handling 4, ternaries 4 (nesting depth added 1). Most of this is not in the body itself: 11 of the 32 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 69, 107, 89, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyManager.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"08f1a4fdcbe5d891a8f92f7f2ddb7d187bd97ee62f5273b52cc137701c68f51f"}},{"ruleId":"D2","level":"warning","message":{"text":"DynamicUIManager.DynamicUIManager (cognitive 32): DynamicUIManager.DynamicUIManager has cognitive complexity 32 (threshold 15). Drivers by points: boolean chains 21, if/else 7, ternaries 3 (4 pts) (nesting depth added 1). Most of this is not in the body itself: 5 of the 32 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 233, 120, 181, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DynamicUIManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae8bcad08da5673849c99a96517981e50dd9e95cf392b883a1fefecf2ed8701"}},{"ruleId":"D2","level":"warning","message":{"text":"openai_chat.do_create_chat_completion (cognitive 31): openai_chat.do_create_chat_completion has cognitive complexity 31 (threshold 15). Drivers by points: match/switch 22 (28 pts), error handling 2 (3 pts) (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"05b436c77d328cf1da4297fa09dde0035027fea0a55da639204941929741b36c"}},{"ruleId":"D2","level":"warning","message":{"text":"ErrorInterpretationPanel.ErrorInterpretationPanel (cognitive 31): ErrorInterpretationPanel.ErrorInterpretationPanel has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 15, if/else 7, ternaries 4 (5 pts), error handling 2, match/switch 2 (nesting depth added 1). Most of this is not in the body itself: 14 of the 31 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 109, 153, 74, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea86b481b91461459972180729b0bbd71f8b187f7c1902bc5d90096faa4a2acd"}},{"ruleId":"D2","level":"warning","message":{"text":"AgentCommunicationPanel.AgentCommunicationPanel (cognitive 31): AgentCommunicationPanel.AgentCommunicationPanel has cognitive complexity 31 (threshold 15). Drivers by points: boolean chains 15, ternaries 5 (8 pts), if/else 7, error handling 1 (nesting depth added 3). Most of this is not in the body itself: 2 of the 31 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 63, 96, 200, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"07cc0e3f3325e8f3df063e988d31637813216803672c774f20872786c6606675"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelConfiguration.ModelConfiguration (cognitive 30): ModelConfiguration.ModelConfiguration has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 8 (9 pts), if/else 8, boolean chains 7, error handling 6 (nesting depth added 1). Most of this is not in the body itself: 5 of the 30 points are its own statements and the rest belongs to 13 function literals inside it that branch (lines 113, 422, 140, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"df30f5be2b65bd1bb7b61d9a59573b591145f54b003fcab0df436ad34a19ad82"}},{"ruleId":"D2","level":"warning","message":{"text":"MCPServerManager.MCPServerManager (cognitive 30): MCPServerManager.MCPServerManager has cognitive complexity 30 (threshold 15). Drivers by points: boolean chains 14, error handling 4 (5 pts), ternaries 4 (5 pts), if/else 4, match/switch 2 (nesting depth added 2). Most of this is not in the body itself: 11 of the 30 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 221, 91, 80, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPServerManager.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7fa0d020b8fac40b91fa7638e0bd1ed3ee1dc883a02f0657b5f56f1cc255cb5"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_client_v2.send_message (cognitive 29): mcp_client_v2.send_message has cognitive complexity 29 (threshold 15). Drivers by points: match/switch 14 (26 pts), error handling 2 (3 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"200b6118d308e3c0afc415a63156fb12a3ac42e24130b52a742dffb4bf4c222a"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_dynamic_system.handle_call (cognitive 29): agent_dynamic_system.handle_call has cognitive complexity 29 (threshold 15). Drivers by points: match/switch 19 (25 pts), if/else 1 (2 pts), error handling 1, loops 1 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_dynamic_system.erl"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97e1dec37a4a468ea494a5d72080401cc63ac87fa0fae6684299394f83f04b0"}},{"ruleId":"D2","level":"warning","message":{"text":"AdvancedStructuredOutputsManager.AdvancedStructuredOutputsManager (cognitive 29): AdvancedStructuredOutputsManager.AdvancedStructuredOutputsManager has cognitive complexity 29 (threshold 15). Drivers by points: boolean chains 13, ternaries 5 (6 pts), error handling 4, if/else 4, match/switch 2 (nesting depth added 1). Most of this is not in the body itself: 9 of the 29 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 75, 133, 96, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"b52f0c49162aca68498762cb31fc6fa6a53fbead36a91ebc177b91400285d481"}},{"ruleId":"D2","level":"warning","message":{"text":"streaming_function_handler.process_token_for_display (cognitive 28): streaming_function_handler.process_token_for_display has cognitive complexity 28 (threshold 15). Drivers by points: match/switch 11 (18 pts), error handling 2 (6 pts), boolean chains 3, if/else 1 (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/streaming_function_handler.erl"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c64e1459e627f31a86c7b4a02aeec9f164935a454d7cd67dcb136f8eee5c87c"}},{"ruleId":"D2","level":"warning","message":{"text":"MultiAgentChat.MultiAgentChat (cognitive 28): MultiAgentChat.MultiAgentChat has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 11, ternaries 8 (10 pts), if/else 6 (7 pts) (nesting depth added 3). Most of this is not in the body itself: 13 of the 28 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 54, 100, 132, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0f36cfc971ead2d5bc71c0a7b2ac494913709de90f381ab2b6e2ccc44314cda"}},{"ruleId":"D2","level":"warning","message":{"text":"MultiAgentChat.GroupChatInterface (cognitive 28): MultiAgentChat.GroupChatInterface has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (12 pts), boolean chains 7, error handling 2 (5 pts), ternaries 4 (nesting depth added 8). Most of this is not in the body itself: 1 of the 28 points is its own statement and the rest belongs to 6 function literals inside it that branch (lines 370, 392, 484, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"b567f8424c086748c987c7edc644515abfb45bf9d7c87ef5df98d55952a65957"}},{"ruleId":"D2","level":"warning","message":{"text":"AdaptiveAIInterface.AdaptiveAIInterface (cognitive 28): AdaptiveAIInterface.AdaptiveAIInterface has cognitive complexity 28 (threshold 15). Drivers by points: ternaries 22 (27 pts), if/else 1 (nesting depth added 5). Most of this is not in the body itself: 5 of the 28 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 131, 212, 205, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"62264e441902e7fd38fd215c434ca0d497e30850820799a57567173123976abe"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_orchestration_handler.handle_request (cognitive 27): mcp_orchestration_handler.handle_request has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 19 (24 pts), loops 1 (3 pts) (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_orchestration_handler.erl"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"83405935c13007aa29dfcaada1ae776af990da524cfaf4db1b71187cc3cbf353"}},{"ruleId":"D2","level":"warning","message":{"text":"ResourceSentinelBar.ResourceSentinelBar (cognitive 27): ResourceSentinelBar.ResourceSentinelBar has cognitive complexity 27 (threshold 15). Drivers by points: ternaries 7 (16 pts), if/else 5 (9 pts), match/switch 2 (nesting depth added 13). Most of this is not in the body itself: 1 of the 27 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 38, 52, 68). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6a0161873cb2dea7b0d20180efb95d76b48f0ea80fcb10d052c763f324356f"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_web_app.health_monitor (cognitive 25): agent_web_app.health_monitor has cognitive complexity 25 (threshold 15). Drivers by points: error handling 5 (12 pts), match/switch 4 (7 pts), if/else 2 (4 pts), loops 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_web_app.erl"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d9d1a9c3752b4ba774cb6e863d5d15d279e9ad2321edc16694ab94135ce49ee"}},{"ruleId":"D2","level":"warning","message":{"text":"hyper_graph_storage.handle_call (cognitive 25): hyper_graph_storage.handle_call has cognitive complexity 25 (threshold 15). Drivers by points: error handling 11 (15 pts), match/switch 10 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/hyper_graph_storage.erl"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4439e9886f7855766e3f7c9029011481fb2543f8009f3c0a970bcef5b4c0867"}},{"ruleId":"D2","level":"warning","message":{"text":"pipedream_auth_handler.handle_call (cognitive 25): pipedream_auth_handler.handle_call has cognitive complexity 25 (threshold 15). Drivers by points: match/switch 15 (19 pts), loops 3 (5 pts), if/else 1 (nesting depth added 6). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_auth_handler.erl"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ebed6a7d8076fbbdee09d5f3bdbc96fe502a62b85df2eb4ff6ed5e8eb37f08b"}},{"ruleId":"D2","level":"warning","message":{"text":"useAgents.useAgents (cognitive 25): useAgents.useAgents has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (13 pts), boolean chains 5, error handling 4, loops 1 (2 pts), ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 0 of the 25 points are its own statements and the rest belongs to 11 function literals inside it that branch (lines 125, 50, 22, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/hooks/useAgents.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b993299749187f91f848adee4978d50d9af935a99b393a389740c18a4a6a281"}},{"ruleId":"D2","level":"warning","message":{"text":"sanitize.cleanNode (cognitive 25): sanitize.cleanNode has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (15 pts), boolean chains 4, error handling 1 (3 pts), loops 1 (3 pts) (nesting depth added 12). Most of this is not in the body itself: 9 of the 25 points are its own statements and the rest belongs to one function literal inside it that branches (line 51). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/utils/sanitize.ts"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"43965e201ce2099088d93afce29a1d155cc14aec11d07bb81e9ac1b85509086d"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tools.evaluate_math_expression (cognitive 24): agent_tools.evaluate_math_expression has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 8 (18 pts), error handling 3 (6 pts) (nesting depth added 13). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":3217}}}],"partialFingerprints":{"codehealthFindingId/v1":"d20edae5dd98510f1df4c166f1ffcb8f48631521a53fe89c4ce0e48e6001ff58"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_ws_handler.websocket_handle (cognitive 23): agent_ws_handler.websocket_handle has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 11 (19 pts), error handling 2 (4 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_ws_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eb437779b5961a4e8602ffb41fa6ffde791c2deb9e08d0506c1f0954df46362"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tool_registry.handle_call (cognitive 23): agent_tool_registry.handle_call has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 11 (12 pts), if/else 3 (6 pts), loops 4, boolean chains 1 (nesting depth added 4). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tool_registry.erl"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfbf5799590d2a3f3e18338838e88cd69191fee798b5b66598a49ee36cf86bed"}},{"ruleId":"D2","level":"warning","message":{"text":"meta_server.execute_meta_command_impl (cognitive 23): meta_server.execute_meta_command_impl has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 14 (17 pts), error handling 3 (6 pts) (nesting depth added 6). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_server.erl"},"region":{"startLine":727}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a7ffe9e84d689c6e22989a232abb387d9aee4f1e8ba709b045a5ad6b8843d5"}},{"ruleId":"D2","level":"warning","message":{"text":"InteractiveReasoningControls.InteractiveReasoningControls (cognitive 23): InteractiveReasoningControls.InteractiveReasoningControls has cognitive complexity 23 (threshold 15). Drivers by points: boolean chains 11, if/else 5, error handling 4, ternaries 3. Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 112, 158, 193, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"0647220c57e4bee15631757c23ad981bfe8dcbfef99912ffa249248f41a3f4f9"}},{"ruleId":"D2","level":"warning","message":{"text":"streaming_function_handler.log_safe (cognitive 22): streaming_function_handler.log_safe has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 8 (15 pts), error handling 3 (7 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/streaming_function_handler.erl"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"06fac9b1a7a84c552b13b7cd2b9570f78cc08191ba9e188e518efa8f9142c288"}},{"ruleId":"D2","level":"warning","message":{"text":"openai_streaming.log_safe (cognitive 22): openai_streaming.log_safe has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 8 (15 pts), error handling 3 (7 pts) (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_streaming.erl"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"f51982d6b6f5f0ca6ab7c319e7d7bb430305af28e78fa58220734e551de5b3ea"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleAdvancedChat.AdvancedMessageContent (cognitive 22): SimpleAdvancedChat.AdvancedMessageContent has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 13 (15 pts), boolean chains 5, error handling 1, match/switch 1 (nesting depth added 2). Most of this is not in the body itself: 2 of the 22 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 144, 86, 108, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f318176a9a8e21107be5b6082ed58252957f714b7b888b7584986acbc348c5"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_api_handler.list_agents (cognitive 21): agent_api_handler.list_agents has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 10 (15 pts), error handling 2 (6 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6a22e0cfbca1cb934167fab961cb026bf4a4fba72ebb6bbc469c8f3c93edab"}},{"ruleId":"D2","level":"warning","message":{"text":"auto_healing_startup.ensure_all_systems_running (cognitive 21): auto_healing_startup.ensure_all_systems_running has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 12 (19 pts), error handling 1 (2 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/auto_healing_startup.erl"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6ecaf543bda50b7a146e133d31d641d3ee0097e6869b6ef1d6bd3abcbd92a1"}},{"ruleId":"D2","level":"warning","message":{"text":"conversation_handler.handle_post (cognitive 21): conversation_handler.handle_post has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 7 (14 pts), error handling 2 (5 pts), if/else 2 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"32a37ce0542d95e7c9a14f3d6cf63d7cab93ec757ff6dfd1de5f8854328806cd"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_collaboration.handle_call (cognitive 21): agent_collaboration.handle_call has cognitive complexity 21 (threshold 15). Drivers by points: match/switch 18 (21 pts) (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_collaboration.erl"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7172d136336201518e4c1a4b74a261adcf5322cbc6b25122fb56340348fd55"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_connection_manager.handle_call (cognitive 20): mcp_connection_manager.handle_call has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 8 (12 pts), error handling 3 (8 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_connection_manager.erl"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"f75d6392702f0b0e7cc04c74d0096d0d5ef5e17867e2ca0fe064380fab884dcf"}},{"ruleId":"D2","level":"warning","message":{"text":"realtime_metrics_engine.analyze_q_table (cognitive 20): realtime_metrics_engine.analyze_q_table has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 8 (11 pts), loops 3 (6 pts), if/else 1 (3 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/realtime_metrics_engine.erl"},"region":{"startLine":605}}}],"partialFingerprints":{"codehealthFindingId/v1":"930a2690d72a0c9017b1c30240831d857811036108cb5b2cd39f2fdf48510e49"}},{"ruleId":"D2","level":"warning","message":{"text":"jina_tools.jina_classify (cognitive 20): jina_tools.jina_classify has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 6 (10 pts), loops 4 (6 pts), if/else 2 (4 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":570}}}],"partialFingerprints":{"codehealthFindingId/v1":"67fed79533fa7fc06a0a146062ec5b1e827ac8fcdea097bfb643298d92920939"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_client_v2.start_websocket_connection (cognitive 19): mcp_client_v2.start_websocket_connection has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 8 (17 pts), boolean chains 2 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"15b769e9248d9306e3bfaae39c061665c295e3b9342493fb3cd7d4b30be67390"}},{"ruleId":"D2","level":"warning","message":{"text":"openapi_introspection.handle_call (cognitive 19): openapi_introspection.handle_call has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 10 (16 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_introspection.erl"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b8d6d544c9000bc3c19462433b7fdc07a16b41454b153a1c655f22919d9b94"}},{"ruleId":"D2","level":"warning","message":{"text":"DenseDashboard.DenseDashboard (cognitive 19): DenseDashboard.DenseDashboard has cognitive complexity 19 (threshold 15). Drivers by points: boolean chains 15, ternaries 3 (4 pts) (nesting depth added 1). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 85, 36, 16, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseDashboard.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0554bd9be57a1c02b7bd121ea117f34025d82f738778e5bf47c6514fde19768"}},{"ruleId":"D2","level":"warning","message":{"text":"conversation_stats_logger.display_periodic_stats (cognitive 18): conversation_stats_logger.display_periodic_stats has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 12 (16 pts), if/else 2 (nesting depth added 4). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_stats_logger.erl"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"09028ca6fb1d9f8820f9314a93008bd225b7fc5b1af521a7af46a56efac3de12"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_manager.handle_call (cognitive 18): mcp_manager.handle_call has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 15 (18 pts) (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_manager.erl"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d8d7d31adffc5399a37e727edd8ee52958ee0470aa28a92ebddbd475b0803b6"}},{"ruleId":"D2","level":"warning","message":{"text":"ssl_cert_handler.validate_cert_key_match (cognitive 18): ssl_cert_handler.validate_cert_key_match has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 6 (12 pts), error handling 2 (6 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ssl_cert_handler.erl"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"a40e860de85d7980e653cd1d6642daeebe2dca4c5655a7816b6cb3919f2f2d51"}},{"ruleId":"D2","level":"warning","message":{"text":"dynamic_supervisor_manager.handle_call (cognitive 18): dynamic_supervisor_manager.handle_call has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 13 (18 pts) (nesting depth added 5). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_supervisor_manager.erl"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"c66f1f0efdef9842c0baf67f60e9706476dc389672bbb3dc05b07f9ed068f5ed"}},{"ruleId":"D2","level":"warning","message":{"text":"lockfree_coordination.lockfree_dequeue_loop (cognitive 18): lockfree_coordination.lockfree_dequeue_loop has cognitive complexity 18 (threshold 15). Drivers by points: match/switch 10 (18 pts) (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/lockfree_coordination.erl"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3a58d59aa59939060a5cc15766b3b6b435675cd42f845985468432bc1b55c34"}},{"ruleId":"D2","level":"warning","message":{"text":"Dashboard.Dashboard (cognitive 18): Dashboard.Dashboard has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 10, ternaries 4 (5 pts), if/else 3 (nesting depth added 1). Of this number, 15 points are the body\u0027s own statements and 3 belong to 4 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Dashboard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"11d35f91683156119b3e625d94184ef49ea8b3d3b7988a44fef76249fc32b430"}},{"ruleId":"D2","level":"warning","message":{"text":"ai_log_integration.detect_and_analyze_error (cognitive 17): ai_log_integration.detect_and_analyze_error has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 8 (17 pts) (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_log_integration.erl"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87949497fbda6eb5f0e50e6dc86bfb29a14af9a9f0ed653f7da434c48851131"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_connection_manager.start_new_connection (cognitive 17): mcp_connection_manager.start_new_connection has cognitive complexity 17 (threshold 15). Drivers by points: error handling 5 (14 pts), match/switch 2 (3 pts) (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_connection_manager.erl"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e79ac1eb3b62d578172f478f9a0ddbf54275c587995faef948becbaeb178d8"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_manager.connect_configured_server (cognitive 17): mcp_manager.connect_configured_server has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 4 (10 pts), error handling 2 (5 pts), boolean chains 1, if/else 1 (nesting depth added 9). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_manager.erl"},"region":{"startLine":546}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab193e09642c203538b47168f601061f3b12741e60aac3861d8af251998826f"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_manager.parse_websocket_url (cognitive 17): mcp_manager.parse_websocket_url has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 5 (11 pts), error handling 2 (6 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_manager.erl"},"region":{"startLine":917}}}],"partialFingerprints":{"codehealthFindingId/v1":"645dc8bc6de6bed742f170e9189b1847e0c2dd5d6ef6af7c2132f9f7a1c789fc"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_oauth_client.handle_call (cognitive 17): mcp_oauth_client.handle_call has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 9 (14 pts), if/else 3 (nesting depth added 5). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"19afa01d5604df01c63fef473e4b57c5375813ba1cf805d257ba4b090c9333f9"}},{"ruleId":"D2","level":"warning","message":{"text":"CommandPalette.CommandPalette (cognitive 17): CommandPalette.CommandPalette has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 15, if/else 1, match/switch 1. Of this number, 9 points are the body\u0027s own statements and 8 belong to 5 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CommandPalette.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"5637285fc611c5eabc346168a50b205be6b1efba681761374131995ea95220eb"}},{"ruleId":"D2","level":"warning","message":{"text":"knowledge_base_handler.handle_request (cognitive 16): knowledge_base_handler.handle_request has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 14 (16 pts) (nesting depth added 2). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/knowledge_base_handler.erl"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c179d0193ddff386f01ae8c5531a3160c7f7f9849d811340d521bb1b4489905"}},{"ruleId":"D2","level":"warning","message":{"text":"mcp_oauth_handler.handle_request (cognitive 16): mcp_oauth_handler.handle_request has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 12 (16 pts) (nesting depth added 4). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_handler.erl"},"region":{"startLine":21}}}],"partialFingerprints":{"codehealthFindingId/v1":"91d2bb2ba7e5066e737f1854458b537abb4a4c162e51e489a3448b062e7ceb74"}},{"ruleId":"D2","level":"warning","message":{"text":"oauth_manager.handle_call (cognitive 16): oauth_manager.handle_call has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 8 (13 pts), error handling 1, if/else 1, loops 1 (nesting depth added 5). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_manager.erl"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3bc8940cf60dc997690b562dd1f692766f03b8c4f2e65a6b3e294dc6dab1675"}},{"ruleId":"D2","level":"warning","message":{"text":"ssl_cert_handler.check_expiry (cognitive 16): ssl_cert_handler.check_expiry has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (16 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ssl_cert_handler.erl"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d8065c773f9d590da76c92ce2ac180c59d46f6b71c038aa903fac1def092162"}},{"ruleId":"D2","level":"warning","message":{"text":"agent.mcp_agent_process (cognitive 16): agent.mcp_agent_process has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 5 (15 pts), error handling 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"5be92f60c57894c1f7d3c7ca59235d222896d623e80c6402f2c05ce2a28829a6"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tools.execute_database_query (cognitive 16): agent_tools.execute_database_query has cognitive complexity 16 (threshold 15). Drivers by points: loops 2 (7 pts), match/switch 3 (5 pts), error handling 2 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":3558}}}],"partialFingerprints":{"codehealthFindingId/v1":"45b492b150a8ef138981d6ffa284e06aa6cc4d591e0c57ad7a3b850ca0f41ed4"}},{"ruleId":"D2","level":"warning","message":{"text":"agent_tools.handle_call (cognitive 16): agent_tools.handle_call has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 8 (10 pts), error handling 4 (6 pts) (nesting depth added 4). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ce50637c2eeca7143c1231166e4430c6c4731a7202838e7c6227c51ebc358ba"}},{"ruleId":"D2","level":"warning","message":{"text":"swarm_intelligence_engine.handle_call (cognitive 16): swarm_intelligence_engine.handle_call has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 13 (16 pts) (nesting depth added 3). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/swarm_intelligence_engine.erl"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bfe0a9e953f98c1e21008f8873ef9647beb5039a0ad63b8b2d057c80444727d"}},{"ruleId":"D2","level":"warning","message":{"text":"token_stream_fsm.streaming (cognitive 16): token_stream_fsm.streaming has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 9 (16 pts) (nesting depth added 7). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":244}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc59db220299db9a6487861fa9a7800dd5edb9d084e2007d8faaf00188353daa"}},{"ruleId":"D2","level":"warning","message":{"text":"SeedServersDialog.SeedServersDialog (cognitive 16): SeedServersDialog.SeedServersDialog has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (6 pts), boolean chains 3, error handling 2 (3 pts), if/else 2, match/switch 2 (nesting depth added 4). Most of this is not in the body itself: 0 of the 16 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 143, 212, 125, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SeedServersDialog.tsx"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf60be43a3d0b4b79dac93ba5f60078ffbcf438e7a6c398e80e8989f6f6aed1f"}},{"ruleId":"D2","level":"warning","message":{"text":"TokenHeatmap.TokenHeatmap (cognitive 16): TokenHeatmap.TokenHeatmap has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, ternaries 4 (5 pts), boolean chains 2, loops 2 (nesting depth added 1). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 62, 40, 31, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/TokenHeatmap.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1184ced29e94a2f2752bf5471b6466110669f4b5c57e03b5c279b7c85aef5da3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdvancedMCPDashboard.AdvancedMCPDashboard: FunctionTooLong \u2014 AdvancedMCPDashboard runs 832 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 732 over it, 8.32\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"109728609cf6f98c5512d61fcd71cae61a7917c96967ec8fd993aabe59774800"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelTypeEditor.ModelTypeEditor: FunctionTooLong \u2014 ModelTypeEditor runs 678 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 578 over it, 6.78\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d843ac4d14e3b1bd251923cbed93f513a5d098dea9d2f047ac845466f842d70"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SimpleAdvancedChat.SimpleAdvancedChat: FunctionTooLong \u2014 SimpleAdvancedChat runs 628 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 528 over it, 6.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"be3af1589948860e748f4efa9330090632d737d230f11cca33ed6a2b0d9560ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/agent_tools.erl: FileTooLong \u2014 2747 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 83 functions. The bar is 500 significant lines; this is 2247 over it, 5.49\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45f318b737059b60ef528fc5186599ea0ccb15d342669dfecba564a37ff01614"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ComprehensiveMCPManager.ComprehensiveMCPManager: FunctionTooLong \u2014 ComprehensiveMCPManager runs 539 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 439 over it, 5.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"94ec7b64580ea8fa2ce7bc6d6a72df7cb404760c0387a1b826a55ca5096667a0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: App.App: FunctionTooLong \u2014 App runs 528 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 428 over it, 5.28\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"63ad2700109fe5e3dccfb15f6b0532a3c2611a943ed8aab5a026bb7901dc8d48"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CrashMonitorDashboard.CrashMonitorDashboard: FunctionTooLong \u2014 CrashMonitorDashboard runs 491 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 391 over it, 4.91\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"10dc52bcc7d7fc9f7cbd918ffddb40e788fead225f582b3f0ec4899ffd5a673c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DiscoveryMeshDashboard.DiscoveryMeshDashboard: FunctionTooLong \u2014 DiscoveryMeshDashboard runs 476 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 376 over it, 4.76\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c32b2f1cb5fc127d4952b3ffdf015e652af33dede7af91aa55e2f3d20ddd81e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UltimatePerformanceDashboard.UltimatePerformanceDashboard: FunctionTooLong \u2014 UltimatePerformanceDashboard runs 472 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 372 over it, 4.72\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d5615488658caf734c94945639bc13a6e1168d3df5ed6c65eb15b2710a737d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ModelConfiguration.ModelConfiguration: FunctionTooLong \u2014 ModelConfiguration runs 459 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 359 over it, 4.59\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"202fea606823340a1bfc13f2367b42fa95e96d75004f8b7492ae18ef1aca6dfb"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdvancedStructuredOutputsManager.AdvancedStructuredOutputsManager: FunctionTooLong \u2014 AdvancedStructuredOutputsManager runs 448 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 348 over it, 4.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc21e5ed521b038be35ae93a6a2cfb46ed2d971feeff224817cf9c67ce210fa3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: QuantumConsciousnessInterface.QuantumConsciousnessInterface: FunctionTooLong \u2014 QuantumConsciousnessInterface runs 448 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 348 over it, 4.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"e98da4c5d158e81eb59cd5501df8649c890b8b8ba4c5bb7cd078840c95ccd87b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdaptiveAIInterface.AdaptiveAIInterface: FunctionTooLong \u2014 AdaptiveAIInterface runs 429 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 329 over it, 4.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"96b90714a5db47fdd6296f68c1b8af03837d789b137a4ed1944127a826f84551"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Timeline.Timeline: FunctionTooLong \u2014 Timeline runs 401 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 301 over it, 4.01\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Timeline.tsx"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"82bf1824215be41e0571dd325fa44084dc95f9d72912301a0d5adfa0b782ca1b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: UltraAdvancedDashboard.UltraAdvancedDashboard: FunctionTooLong \u2014 UltraAdvancedDashboard runs 399 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 299 over it, 3.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"402df37e9619c370215f7c2ccf16f118cd1bce067cc5b67382395a475c3e46ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ToolRegistry.ToolRegistry: FunctionTooLong \u2014 ToolRegistry runs 396 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 296 over it, 3.96\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ToolRegistry.tsx"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd63ec056c741ce2b18a8632d9393819fcde2fd9a1af2fbb0fbf97664e810355"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SystemMonitoringDashboard.SystemMonitoringDashboard: FunctionTooLong \u2014 SystemMonitoringDashboard runs 394 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 294 over it, 3.94\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SystemMonitoringDashboard.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"955cee02ff17427dd72355a976b4888fe1d023ce82b99c048f615b13868b7ab4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ErrorInterpretationPanel.ErrorInterpretationPanel: FunctionTooLong \u2014 ErrorInterpretationPanel runs 382 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 282 over it, 3.82\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"9036c7f0d893a27933a1401724fc3739d492531fdd85eca32bc72a95bde72018"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MCPOrchestrationEngine.MCPOrchestrationEngine: FunctionTooLong \u2014 MCPOrchestrationEngine runs 367 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 267 over it, 3.67\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"59195094205777e614a8623f850237bece02769e4bf71991781c99dde0de011f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InteractiveReasoningControls.InteractiveReasoningControls: FunctionTooLong \u2014 InteractiveReasoningControls runs 353 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 253 over it, 3.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0d7649865dc9c0670584f2189eaef12cc11b8ef898c87f4d42dd93cf339c3b3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: distributed_consciousness_engine: TooManyFunctions \u2014 105 functions. The bar is 30 functions; this is 75 over it, 3.50\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/distributed_consciousness_engine.erl"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad9cae862b393f065782b75135bcaebef99084684f1d69df00f9c9ef7cf5a72a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FleetManagementDashboard.FleetManagementDashboard: FunctionTooLong \u2014 FleetManagementDashboard runs 350 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 250 over it, 3.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"486e6e7c3dec15dfe7265c0528a7ceaa93c55b4360c34ddf6196f110ff3890ed"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_runtime: TooManyFunctions \u2014 100 functions. The bar is 30 functions; this is 70 over it, 3.33\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_runtime.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"377b1af76b0608187fcf47d91ecc77e483adf2d11339df052c5312fa2ef07747"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: time_travel_debugging: TooManyFunctions \u2014 99 functions. The bar is 30 functions; this is 69 over it, 3.30\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/time_travel_debugging.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6642f087fe7dd918a3a3518e60606a8741404aea1960ab73dc6c659883c2047"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: PipedreamConnectionManager.PipedreamConnectionManager: FunctionTooLong \u2014 PipedreamConnectionManager runs 327 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 227 over it, 3.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"1125fd5209fc914bc1368c6f89af8163dbd92b054b68d67eb35f201c12fcf39c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/agent_instance.erl: FileTooLong \u2014 1611 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 99 functions. The bar is 500 significant lines; this is 1111 over it, 3.22\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0d4c2125ae03e6585a49ee1fe51088c6687191030acc6607e3c637ee5a5dca2"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ChainOfThoughtVisualization.ChainOfThoughtVisualization: FunctionTooLong \u2014 ChainOfThoughtVisualization runs 321 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 221 over it, 3.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"f33f7584b3af6c2b29bdb945a342c7dcabf17feec35337f2f2811878cdac5b46"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: cognitive_workflow_orchestrator: TooManyFunctions \u2014 95 functions. The bar is 30 functions; this is 65 over it, 3.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/cognitive_workflow_orchestrator.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f981b4f9acdff0678085bf6d0013df7dae421129ec5ea58b3f67845c09a60a81"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: evolutionary_supervision: TooManyFunctions \u2014 93 functions. The bar is 30 functions; this is 63 over it, 3.10\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/evolutionary_supervision.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc70e37a340b7ba81cbd841d756ed3ee6474fba64328fcb751ab13d950157e2e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: neural_symbolic_reasoning_engine: TooManyFunctions \u2014 93 functions. The bar is 30 functions; this is 63 over it, 3.10\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/neural_symbolic_reasoning_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ada7fc0f067f1c28e31e23d197c55c5d2a03f88fe652eea0f303bca74c6e337"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: OAuthManager.OAuthManager: FunctionTooLong \u2014 OAuthManager runs 307 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 207 over it, 3.07\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/OAuthManager.tsx"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"533386f94c3fd865451587aad9f070dbed3f491c539ccee56838780e39ae4588"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: self_reflection_system: TooManyFunctions \u2014 92 functions. The bar is 30 functions; this is 62 over it, 3.07\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_reflection_system.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e078061a2a4a8d357592cf7336da81a160cb97ad2201ec65522edbc690be602"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ClaudeCLI.ClaudeCLI: FunctionTooLong \u2014 ClaudeCLI runs 294 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 194 over it, 2.94\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ClaudeCLI.tsx"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddb5138f68419ffb1f47e633b8b7e4ed641f072404d4bad26451557897d8f7c7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: dimensional_phase_shift_engine: TooManyFunctions \u2014 88 functions. The bar is 30 functions; this is 58 over it, 2.93\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dimensional_phase_shift_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae2722d3526acebb3585f9c2bfbf8179ae1619cc74b1976c8fc94199e535ada4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: self_modifying_agent_engine: TooManyFunctions \u2014 87 functions. The bar is 30 functions; this is 57 over it, 2.90\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_modifying_agent_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8ebee6ea40b2617be94bef5da93422ed45a44ac563bc6b431ee888db14b362a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: swarm_intelligence_engine: TooManyFunctions \u2014 87 functions. The bar is 30 functions; this is 57 over it, 2.90\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/swarm_intelligence_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"9102397dd56a5774566bd57621bd831ad9093f91b78b42c029ea59e8e6ba164d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_digital_twins_engine: TooManyFunctions \u2014 86 functions. The bar is 30 functions; this is 56 over it, 2.87\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_digital_twins_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"931711e708913911e8d0952d5e775f8573ec29b6202236a39cfbe5976de6fece"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: absolute_impossibility_orchestrator: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/absolute_impossibility_orchestrator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8b72258d4124c054b00be000f15f88aede54a50727fc987fd6ff59dea6f8583"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: concept_creation_engine: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/concept_creation_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"96f1e7236f18a3ececb8ecad6098c1f127fb06df62ef094998a0d2bc69bdad9e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: paradox_resolution_matrix: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/paradox_resolution_matrix.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6876a40797fc64c1e429571d2bbadb427efe8654cf2a4fa0ad0a5f67bd9bb152"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: self_contradiction_synthesis_protocol: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/self_contradiction_synthesis_protocol.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"da0300f55e0e68bad9189ea18d37b549ba8e19febc98b6b1f5a8aa67cf574bbf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: void_architecture_system: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/void_architecture_system.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff1656c071df9f1487b244b4dcbe322ca260202ecbf090f8381886587c01e7d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: autonomous_knowledge_ingestion: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/autonomous_knowledge_ingestion.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"750a32fb4fcf99d4ad1897e237d3d87358d9d6c9bfc1b6ef8bf1cba38d118255"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: distributed_consensus_engine: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/distributed_consensus_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60d4efbf4bcc970d3783f17feb4e663eb3a3b16bc399c6ffea085bcd8b63361"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: temporal_meta_analyzer: TooManyFunctions \u2014 85 functions. The bar is 30 functions; this is 55 over it, 2.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/temporal_meta_analyzer.erl"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"d638deda2571d57d29cdc54222b117c74528722cc927cbbee9145ed29bb3da71"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: meta_reality_generator: TooManyFunctions \u2014 84 functions. The bar is 30 functions; this is 54 over it, 2.80\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/meta_reality_generator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3379770868e5cd2157272ece985be723d7c2016f4b19ad5e761ea8c6b4133410"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: continuous_self_monitor: TooManyFunctions \u2014 83 functions. The bar is 30 functions; this is 53 over it, 2.77\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/continuous_self_monitor.erl"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0f99c8c2bf47aae97cd918dabc1845c5588563d0fa065ebd9f27c19873e5bbb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: hierarchical_task_executor: TooManyFunctions \u2014 83 functions. The bar is 30 functions; this is 53 over it, 2.77\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/hierarchical_task_executor.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f48407ace66b34cc4c65729bb8928707824afadc966e541b0ed430a39371430e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: expert_agent_selector: TooManyFunctions \u2014 79 functions. The bar is 30 functions; this is 49 over it, 2.63\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/expert_agent_selector.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"137442d3967caa1f67f6ba9f55f43507baec671d12d500a2e98ca1ec2e5e96f9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: reflection_mechanism: TooManyFunctions \u2014 78 functions. The bar is 30 functions; this is 48 over it, 2.60\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/reflection_mechanism.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"014df6e3d68d490f4efa984f8f1aa82a7e455a643c4084b1e59cda8bbe833aea"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_process_network: TooManyFunctions \u2014 77 functions. The bar is 30 functions; this is 47 over it, 2.57\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_process_network.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0d6f5573f7d8b03ae28109a3422b539dbf3d7333a2abca9e7b6254ff0da3db6"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SimpleAdvancedChat.detectContentFormat: FunctionTooLong \u2014 detectContentFormat runs 255 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 155 over it, 2.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"102b29d694e6523d569d7c8ba0144ce08135e4842e1b0614e891f6783c1047fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/AdvancedMCPDashboard.tsx: FileTooLong \u2014 1268 significant lines (blank, comment-only and punctuation-only lines excluded), about 66% of them inside a single declaration: AdvancedMCPDashboard (157-1219). The bar is 500 significant lines; this is 768 over it, 2.54\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a442c00de0989fe99715dcbfcca8e380d33f912daa86b0dbe12d3fb5db848f7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: temporal_transcendence_engine: TooManyFunctions \u2014 76 functions. The bar is 30 functions; this is 46 over it, 2.53\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/temporal_transcendence_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3b116fde9698a6c519a423e03b72fbc4b244d444e4f1fa0ff4cab8cbfddf22d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ApiKeyManager.ApiKeyManager: FunctionTooLong \u2014 ApiKeyManager runs 253 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 153 over it, 2.53\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyManager.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"010055bfa3f05b441adf53bd354a58b23b6f36af2815aca1473b6e291cad3d8e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: Dashboard.Dashboard: FunctionTooLong \u2014 Dashboard runs 251 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 151 over it, 2.51\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Dashboard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb15d49569b505b4e099533d42169e2826d9991d4fc1959ffcd80dba7471f883"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MultiAgentChat.MultiAgentChat: FunctionTooLong \u2014 MultiAgentChat runs 250 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 150 over it, 2.50\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"169bfe53c138cbe1a4f532f6e125decfcc24284e7f9c20ad9cb662a95f646343"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InternalsPanel.InternalsPanel: FunctionTooLong \u2014 InternalsPanel runs 248 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 148 over it, 2.48\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InternalsPanel.tsx"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"978faf8475913e7c32ecf4c24522198fc9ac610dbb8f517357c90162b281a67e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentQuorumPanel.AgentQuorumPanel: FunctionTooLong \u2014 AgentQuorumPanel runs 247 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 147 over it, 2.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"011c21eb7dc19d2929af9efb709305a8610bedf2abce9b0e344e9c7bee48ec14"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: intelligent_query_router: TooManyFunctions \u2014 74 functions. The bar is 30 functions; this is 44 over it, 2.47\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/intelligent_query_router.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"fab7e5493d3a8074d86ed00c1b04b21f5e7202d1d90ade9e08797b048aa06396"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_protocol: TooManyFunctions \u2014 74 functions. The bar is 30 functions; this is 44 over it, 2.47\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_protocol.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"194ec3e02ad4ce081c0a4514e8706ba1d73dd657042fdffccfa673f689cf9d72"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: missing_function_stubs: TooManyFunctions \u2014 73 functions. The bar is 30 functions; this is 43 over it, 2.43\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/missing_function_stubs.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9a0ebd5f6d906418a1daffc80940fe613a9716aa9402af8498b1beeccf6b88"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AdvancedMCPDashboard.ServerDetailPanel: FunctionTooLong \u2014 ServerDetailPanel runs 242 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 142 over it, 2.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5fc8d97c659dda33d3997584b81900e1df9dc21c0cd9ada5f1abab531dc44c4"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: subgoal_decomposition_engine: TooManyFunctions \u2014 71 functions. The bar is 30 functions; this is 41 over it, 2.37\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/subgoal_decomposition_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b3cd8553926bbd700e4462fca0b7d27f74496005f7dd07cd9242626e75768d5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: temporal_debugger: TooManyFunctions \u2014 70 functions. The bar is 30 functions; this is 40 over it, 2.33\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/temporal_debugger.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c96f0787cc1e26ff6d595e4c2a1fda6566a4cf6e31474a0e8d1e3fc7468b52a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentCommunicationPanel.AgentCommunicationPanel: FunctionTooLong \u2014 AgentCommunicationPanel runs 229 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 129 over it, 2.29\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"b95b14562f652feef1793cfef3effa8635c36d71913a5f3c7bff6f796c6e32b6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: consciousness_digital_twins_engine: TooManyFunctions \u2014 68 functions. The bar is 30 functions; this is 38 over it, 2.27\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/consciousness_digital_twins_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c6ba2345339828d18f1f77cf836ea0fc8e8d155fd058b9328db538239537b47"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/ai_performance_optimizer.erl: FileTooLong \u2014 1103 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 103 functions. The bar is 500 significant lines; this is 603 over it, 2.21\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_performance_optimizer.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d9a90c7a63de523f3fd89de5ae7892dc005af9001274ee68251a339833f13b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: ai_orchestration_engine: TooManyFunctions \u2014 66 functions. The bar is 30 functions; this is 36 over it, 2.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_orchestration_engine.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"803516f5dec4c607ec999be583bb7f3a8df873fb1f7b81cc1cfae20aad5aa419"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MainLayoutWithSidebar.MainLayoutWithSidebar: FunctionTooLong \u2014 MainLayoutWithSidebar runs 220 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 120 over it, 2.20\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MainLayoutWithSidebar.tsx"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cadba501eae5f2ae119a1baec6cbc3d35973aa17a3a755b2a1faa1b017f937b"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DenseApp.DenseApp: FunctionTooLong \u2014 DenseApp runs 214 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 114 over it, 2.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseApp.tsx"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce364aa981754d4a59d1b0cbd7b1dc919f3bdba6e3b474f2cb4ac90aa89e233f"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DynamicUIManager.DynamicUIManager: FunctionTooLong \u2014 DynamicUIManager runs 212 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 112 over it, 2.12\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DynamicUIManager.tsx"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"378891f833c45d37aa6b503484377e13abbc93d50f97ec2341d07809ed6f9325"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: RightDrawerInspector.RightDrawerInspector: FunctionTooLong \u2014 RightDrawerInspector runs 211 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 111 over it, 2.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/RightDrawerInspector.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5daaca8232ec9f9b19d809a4e206ca9b116a495f97b499d75f9484fcecdc696"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: intelligent_search_processor: TooManyFunctions \u2014 63 functions. The bar is 30 functions; this is 33 over it, 2.10\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/intelligent_search_processor.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b92ce92d6f863eb4b96ca832bfe058046f988a5903b295161c6b844de197c2df"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openapi_mock_engine: TooManyFunctions \u2014 63 functions. The bar is 30 functions; this is 33 over it, 2.10\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_mock_engine.erl"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"78dbcc9aa4d5c5cb93d15ce1a9376c2b11263c14d798b9330732935e15bd2c13"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AdvancedMCPDashboard: ClassTooLong \u2014 832 significant lines (blank, comment-only and punctuation-only lines excluded), 7 methods. The bar is 400 significant lines; this is 432 over it, 2.08\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37ad7f60775883a3b95c04598641f69462dd3531bef7007a46223db70bd19f58"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_performance_analyzer: TooManyFunctions \u2014 62 functions. The bar is 30 functions; this is 32 over it, 2.07\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/quantum_performance_analyzer.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d60a70b7db56d692bf4b09226c7fdd18d9f3b1737f21f3d316112ed269c3d409"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: VirtualizedAgentList.VirtualizedAgentList: FunctionTooLong \u2014 VirtualizedAgentList runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/VirtualizedAgentList.tsx"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"f82d25ea8bede562662025b8096d70fef54e552b161edd19991d8064d6a6bf3b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: autonomous_codebase: TooManyFunctions \u2014 61 functions. The bar is 30 functions; this is 31 over it, 2.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/autonomous_codebase.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccab12fa35c873abc7d8b8fa7047a1d197643035848fc9973f37cfc9d9206b11"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: universal_knowledge_compiler: TooManyFunctions \u2014 61 functions. The bar is 30 functions; this is 31 over it, 2.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/universal_knowledge_compiler.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d44b07e7a061b6bb446c776076d38e14dd03a636c8f0d02e43e55e781351294"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: lockfree_coordination: TooManyFunctions \u2014 61 functions. The bar is 30 functions; this is 31 over it, 2.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/lockfree_coordination.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"84345ca4758e3a89c2ef7d77b150b0979447de902eb8a0ccda68404dafb57c7e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_entanglement_engine: TooManyFunctions \u2014 61 functions. The bar is 30 functions; this is 31 over it, 2.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_entanglement_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"c295a2ad7cc5a9861232f46c405eb1c37d1c8fa576a8f975b75ab66a3d0e264d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: blockchain_auth_system: TooManyFunctions \u2014 58 functions. The bar is 30 functions; this is 28 over it, 1.93\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/blockchain_auth_system.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9cf98eaf74613be75e0c82a16d1ffd33a448c30836932e656d3d9f0bbe9a7b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: consciousness_merger_protocol: TooManyFunctions \u2014 58 functions. The bar is 30 functions; this is 28 over it, 1.93\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_merger_protocol.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"531a063d3b2d65df91a0b26c3c4d3982b40a15b557eff7e04e25ab3c8a8fc178"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: quantum_consensus_engine: TooManyFunctions \u2014 58 functions. The bar is 30 functions; this is 28 over it, 1.93\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/quantum_consensus_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"5edc709f3cbd3b85411126ff4e84baad8221ed0814ee71cae0af0ace96a5f0df"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: FlameGraph.FlameGraph: FunctionTooLong \u2014 FlameGraph runs 192 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 92 over it, 1.92\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FlameGraph.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"18d14282b219ebb911493db3f7d1bdda9af09fdf8784d69f1f4ef8dec2463736"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/specialized_agent_templates.erl: FileTooLong \u2014 958 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 458 over it, 1.92\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/specialized_agent_templates.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7e81727d3c2981ce81466382d953a6092d467415bf2bb6f7cf54764c4ccc751"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: neural_load_balancer: TooManyFunctions \u2014 57 functions. The bar is 30 functions; this is 27 over it, 1.90\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/neural_load_balancer.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"83a714e8d17a7c1fbcdf20883a60ca22313b88e36307eb4c6ec0479341d7bdc8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: omniscient_digital_twin_orchestrator: TooManyFunctions \u2014 56 functions. The bar is 30 functions; this is 26 over it, 1.87\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/omniscient_digital_twin_orchestrator.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"6331392293e3e017f050fd753102a5165e57763dda989b215c1cb24c0a01b9bd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: reality_digital_twins_engine: TooManyFunctions \u2014 56 functions. The bar is 30 functions; this is 26 over it, 1.87\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/reality_digital_twins_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2011d0783261a4f047b8548c2fc301b2ce3535bbd02adbbb3d55e45fc8bd653c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: temporal_digital_twins_engine: TooManyFunctions \u2014 56 functions. The bar is 30 functions; this is 26 over it, 1.87\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/temporal_digital_twins_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0428dfe48ee8a18387fc4f2ccdb38b3accfdbe55f66d4e0fce0b1d0df3f31d31"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/SimpleAdvancedChat.tsx: FileTooLong \u2014 922 significant lines (blank, comment-only and punctuation-only lines excluded), about 68% of them inside a single declaration: SimpleAdvancedChat (384-1226). The bar is 500 significant lines; this is 422 over it, 1.84\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83df286d35b93139c67901e5c12ac747494a3355f2a9861109b7ae63fe1f6917"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: colored_logger: TooManyFunctions \u2014 55 functions. The bar is 30 functions; this is 25 over it, 1.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/colored_logger.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d15bbac8c433c1364d5289ec68cf1b0645681c033c5a2a888ede2330857822e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: reality_manipulation_engine: TooManyFunctions \u2014 55 functions. The bar is 30 functions; this is 25 over it, 1.83\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/reality_manipulation_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"051aca8dc65c152f16433d3a079e895aa8bd2be5f9d227a8efc3d60f7791a33a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/emergent_swarm_intelligence.erl: FileTooLong \u2014 901 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 157 functions. The bar is 500 significant lines; this is 401 over it, 1.80\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/emergent_swarm_intelligence.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7f47ff213eed4d4a09673f975173934e8892d3ad2d8c4a6d7b36786d23e45b9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: self_aware_ai_consciousness_engine: TooManyFunctions \u2014 54 functions. The bar is 30 functions; this is 24 over it, 1.80\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_aware_ai_consciousness_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"cec851da076a8d0ce73209b34c3675a0eed3ad33104470989d226f712463c86c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/MCPOrchestrationEngine.tsx: FileTooLong \u2014 891 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 391 over it, 1.78\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bcc34180019902b4860c305902fc8f476197c3ba3bbb1a2d67b8443b849f65f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: existence_manipulation_engine: TooManyFunctions \u2014 53 functions. The bar is 30 functions; this is 23 over it, 1.77\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/existence_manipulation_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb82bc03259d68f08a59711c2faafc5eb97f33b6d53976edd91b7a456c50ef14"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openapi_metrics: TooManyFunctions \u2014 53 functions. The bar is 30 functions; this is 23 over it, 1.77\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_metrics.erl"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2c48d0a2030113f88babf6e9f8dacb6f615262d3f2dcebcf8e60edd76b24889"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/ComprehensiveMCPManager.tsx: FileTooLong \u2014 883 significant lines (blank, comment-only and punctuation-only lines excluded), about 61% of them inside a single declaration: ComprehensiveMCPManager (48-718). The bar is 500 significant lines; this is 383 over it, 1.77\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f39ab3e7cf6defaa24f0feee35db19473f8ed7ea7903cd274329aafec833911d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: dimensional_gateway_system: TooManyFunctions \u2014 52 functions. The bar is 30 functions; this is 22 over it, 1.73\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/dimensional_gateway_system.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"58db4677366b0682ac0cacbfaefef083d316952b67543120ce65f5aeb174b90b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: edge_computing_network: TooManyFunctions \u2014 52 functions. The bar is 30 functions; this is 22 over it, 1.73\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/edge_computing_network.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef333053446d74cef78d132a22dd113c1f7d85938a5bddd4b887872f77a3e2dd"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: impossible_mathematics_engine: TooManyFunctions \u2014 52 functions. The bar is 30 functions; this is 22 over it, 1.73\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/impossible_mathematics_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a666422a4dcfc80b57963405ae5c9c85ef236eecf2880d8503d1513cd78169"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: self_healing_system: TooManyFunctions \u2014 52 functions. The bar is 30 functions; this is 22 over it, 1.73\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/self_healing_system.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"59e7727180a8699361987f7e87ff0143c44462fdd37739857ec12feacb93e0bb"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: mcp_transport_streamable_http: TooManyFunctions \u2014 51 functions. The bar is 30 functions; this is 21 over it, 1.70\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_transport_streamable_http.erl"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"b51b3515132347bcbfc9153dee3b93df801eba26da26a2cf8d4543591fce0613"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ModelTypeEditor: ClassTooLong \u2014 678 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 278 over it, 1.70\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"329cc68a382692b12bf2ff0f0d05e16c281a227c06c26eaf330972942b8641a9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: meta_ai_optimizer: TooManyFunctions \u2014 50 functions. The bar is 30 functions; this is 20 over it, 1.67\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/meta_ai_optimizer.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53de078ee201c066ef36dbee365338b6e8b70f5a795a4bf7d76fa4912de6d38"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/openapi_advanced_codegen.erl: FileTooLong \u2014 810 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 65 functions. The bar is 500 significant lines; this is 310 over it, 1.62\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_advanced_codegen.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a56ccd87c7482e05814654fff1d9df2d0f08089d44072818ee6d9053ec80cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: NetworkTopology.NetworkTopology: FunctionTooLong \u2014 NetworkTopology runs 162 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 62 over it, 1.62\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/NetworkTopology.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b97de16150c7e8c2284c00135b920499fd43bf18a41bbf99d60c5af42506dc3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: backtracking_engine: TooManyFunctions \u2014 48 functions. The bar is 30 functions; this is 18 over it, 1.60\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/backtracking_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"358b82cdb2eacc978c33e48c8319bb9c9b3191ae31434fe629178f1d285bf1ae"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SimpleAdvancedChat: ClassTooLong \u2014 628 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 228 over it, 1.57\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3ab8ea6de229cb335fdb25101d71c6d2f6baa8a5723899697d8189e965dfce5"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ComprehensiveMCPManager.InspectorCompatibilityPanel: FunctionTooLong \u2014 InspectorCompatibilityPanel runs 157 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 57 over it, 1.57\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":861}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1178bb4c42484dcc2c44536618dc3fbd57e871b7b1dda9e03c71d5ec3c673b5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: ai_emotional_intelligence_engine: TooManyFunctions \u2014 47 functions. The bar is 30 functions; this is 17 over it, 1.57\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/ai_emotional_intelligence_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39005b054910c29ac25d8b1ff3fc5eb053d149fc47b6b421cc1b30f6abd7b99"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: artificial_qualia_generation_engine: TooManyFunctions \u2014 47 functions. The bar is 30 functions; this is 17 over it, 1.57\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/artificial_qualia_generation_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fa5a8fe02f81dabeea159786a6b2195d1359d4896ac865018b9d64f0df54c72"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: dynamic_agent_router: TooManyFunctions \u2014 47 functions. The bar is 30 functions; this is 17 over it, 1.57\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_agent_router.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"570c71aec3a15babe85f698a323996ba18993f731d983e482bd6a3c18a7f20d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/UltraAdvancedDashboard.tsx: FileTooLong \u2014 777 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 277 over it, 1.55\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4000b375830e0143070ae082ca7aa8f8fd61f7e65198690768447d28c6f43e4"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CleanSystemDashboard.CleanSystemDashboard: FunctionTooLong \u2014 CleanSystemDashboard runs 155 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 55 over it, 1.55\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CleanSystemDashboard.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f79ecf402c6ba4f58199671e1f327e1fcd4c09e33d86c4799d92971dc82364fa"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/distributed_consensus_tracker.erl: FileTooLong \u2014 770 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 68 functions. The bar is 500 significant lines; this is 270 over it, 1.54\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/distributed_consensus_tracker.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e3d6113881bed26600300b2df08b849ea191826f76e56cc6273101558124d3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: distributed_error_coordinator: TooManyFunctions \u2014 46 functions. The bar is 30 functions; this is 16 over it, 1.53\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/distributed_error_coordinator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa75988c0acf5f87dd1c64f7bee28b1d6922cbf72571092b5f4ed712e1e7f763"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: multi_turn_function_caller: TooManyFunctions \u2014 46 functions. The bar is 30 functions; this is 16 over it, 1.53\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/multi_turn_function_caller.erl"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"46647f9177b43d834a768b11ab83d23c8ea3a4fd9da7b2441fdbfd60af250230"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp_manager.erl: FileTooLong \u2014 764 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 59 functions. The bar is 500 significant lines; this is 264 over it, 1.53\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_manager.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2513c574e8e856464d53fdc21792b4726ed217585db559020764d5113191b3bd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp_client_v2.erl: FileTooLong \u2014 756 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 40 functions. The bar is 500 significant lines; this is 256 over it, 1.51\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af0c22017f9e0c8631ce4721f6dce8dedf95bb1cd64fb4a51325d58a9148b3a2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: consciousness_transfer_protocol_engine: TooManyFunctions \u2014 45 functions. The bar is 30 functions; this is 15 over it, 1.50\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/consciousness_transfer_protocol_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2b4c21ef4c2e86f99db79a3493c5223ea11530f56f7da19fac48ba9ba9cb61"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: meta_cognitive_awareness_engine: TooManyFunctions \u2014 45 functions. The bar is 30 functions; this is 15 over it, 1.50\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_cognitive_awareness_engine.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"47160c2fa4f43e6755a1ca52d5dde448468358ebf3c9d125e968daff77968432"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: model_construct_registry: TooManyFunctions \u2014 45 functions. The bar is 30 functions; this is 15 over it, 1.50\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/model_construct_registry.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b59f26f43ff2616099eb1b7ee031fde1913ee14f05b80eac3158b807f60a4307"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/ModelTypeEditor.tsx: FileTooLong \u2014 749 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: ModelTypeEditor (82-896). The bar is 500 significant lines; this is 249 over it, 1.50\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa633a766dc7786ae72195ea55de72e5df10ed3eb6ac37c918a2c4f3f5781fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CommandPalette.CommandPalette: FunctionTooLong \u2014 CommandPalette runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CommandPalette.tsx"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ebdd5677a26ac57e05f5e539607dc7632e014cf224c1b3365a58923dbb6fa9"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MultiAgentChat.GroupChatInterface: FunctionTooLong \u2014 GroupChatInterface runs 147 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 47 over it, 1.47\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"20adf3fe07624061a5691c84a8e84c0ab9668ae37eb8027781d257d1f620e399"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: advanced_agent_system: TooManyFunctions \u2014 44 functions. The bar is 30 functions; this is 14 over it, 1.47\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/advanced_agent_system.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8a26afed083a0a03ea55ec6a63f3c720f7f312f5600f10c2bc6d9dffae9b930"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: backward_chaining_engine: TooManyFunctions \u2014 44 functions. The bar is 30 functions; this is 14 over it, 1.47\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/backward_chaining_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeea45e3ca95dee4e3d8780b534dfa217e366c5a5dde382363b4417ffefa6071"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openapi_smart_cache: TooManyFunctions \u2014 44 functions. The bar is 30 functions; this is 14 over it, 1.47\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_smart_cache.erl"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a849ee3912f83a9d1f69318c692b6d6729c82685a68f0670706101439378bb3d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/specialized_agent_factory.erl: FileTooLong \u2014 730 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 31 functions. The bar is 500 significant lines; this is 230 over it, 1.46\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/specialized_agent_factory.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f0a72be76aea83cdf26f661cf65a1f54e71ef01032e2f5db3c1ba2b23dd5fa3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/openapi_playground.erl: FileTooLong \u2014 727 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 77 functions. The bar is 500 significant lines; this is 227 over it, 1.45\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_playground.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f05e09f718271aa9f9b090bbc70c7dba4301e164d1e4074595029cbb495fc122"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: enhanced_logger: TooManyFunctions \u2014 43 functions. The bar is 30 functions; this is 13 over it, 1.43\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/enhanced_logger.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"309e0670b4c472439cc76b40c693025a67e8c80336baa9f5a170e005ad1852e7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: reflective_agent_instance: TooManyFunctions \u2014 43 functions. The bar is 30 functions; this is 13 over it, 1.43\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/reflective_agent_instance.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e64685ef8dbe8821b0c15bc8cecbedb929873cbe14dbd8c4ef819c2c11e2151"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: CreateAgentDialog.CreateAgentDialog: FunctionTooLong \u2014 CreateAgentDialog runs 142 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 42 over it, 1.42\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CreateAgentDialog.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"284fdb69f5bbe4e4bd037e44ecf20054891bf4f2e5f43572a53a6453bde9871e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/super_agent_tools.erl: FileTooLong \u2014 707 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 93 functions. The bar is 500 significant lines; this is 207 over it, 1.41\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/super_agent_tools.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"287ff452af733a324c1d2d2f3f87913de147322797121e2facc0a0749f44fec6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/openapi_security.erl: FileTooLong \u2014 707 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 76 functions. The bar is 500 significant lines; this is 207 over it, 1.41\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_security.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba129b48acfa1ae6638f6ebda2f70e45f352f788b9bf3e4b292c6ecc214e12d1"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: verification_validation_engine: TooManyFunctions \u2014 42 functions. The bar is 30 functions; this is 12 over it, 1.40\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/verification_validation_engine.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"824f8139037c67505e6772ca85f7f257fb1ca98fa3c475756fcc870ee49b219a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/bulk_operations_handler.erl: FileTooLong \u2014 692 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 41 functions. The bar is 500 significant lines; this is 192 over it, 1.38\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f2380edd40a8a18692c58dcc5972a4fc01d6cebf26b6f8a97090bbafb7a24f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/jina_tools.erl: FileTooLong \u2014 690 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 190 over it, 1.38\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2aaa5c7330ca12171e71d1daa85e2527ed08fdf941fe126304908176d57cc23"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: intelligent_tool_optimizer: TooManyFunctions \u2014 41 functions. The bar is 30 functions; this is 11 over it, 1.37\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/intelligent_tool_optimizer.erl"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"7310c60dd2a99ce2e4bf84e0288c8bceff04b4c70bf8e884a7e3cd3d2a316a49"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openapi_ai_transform: TooManyFunctions \u2014 41 functions. The bar is 30 functions; this is 11 over it, 1.37\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_ai_transform.erl"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbc923523e332b153604a7f0c0856df075f7b1e1c483b2b85cd9bde25ee0c14c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp_server.erl: FileTooLong \u2014 683 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 183 over it, 1.37\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7053cc814c88b2008b427e3a81ec63a074d01b18af50bc0cd79f444114c8c07"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: InteractiveWidgets.DataVisualizationWidget: FunctionTooLong \u2014 DataVisualizationWidget runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveWidgets.tsx"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c00bfc82a340615d121d26d494e1f9ad0bbf6439d71632c6990e475bc532712"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ComprehensiveMCPManager: ClassTooLong \u2014 539 significant lines (blank, comment-only and punctuation-only lines excluded), 6 methods. The bar is 400 significant lines; this is 139 over it, 1.35\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e418eb2bd0f3b43e11d1fae02977fe1446b170b55fd25fb7d34bffce4800f4c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/active_exploration_engine.erl: FileTooLong \u2014 671 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 178 functions. The bar is 500 significant lines; this is 171 over it, 1.34\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/active_exploration_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c03bea5e94b51a8dc08cc89e47bef151d8cac73cf73cdb520a836c2e07c669ac"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: useAgents.useAgents: FunctionTooLong \u2014 useAgents runs 134 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 34 over it, 1.34\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/hooks/useAgents.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a8238bbeff4fee903019fd23c1211ebb5a1b1a1a08d9a297687bc6358084f43"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: unified_feedback_system: TooManyFunctions \u2014 40 functions. The bar is 30 functions; this is 10 over it, 1.33\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/unified_feedback_system.erl"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6289ffbfed990b9678b8b731109dd5b2e706d4914d85abece7de8918be92329"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: App: ClassTooLong \u2014 528 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 128 over it, 1.32\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8054ad8110c3e2097ab986c2487e0e7374628dc6e3e128baf67911f61ede6a9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/agent.erl: FileTooLong \u2014 660 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 56 functions. The bar is 500 significant lines; this is 160 over it, 1.32\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"675f9864d0098c1c89354f25882855d5dd1aa9b4a3e7a2b1c1001ac7ae40c6cf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: system_awareness_logger: TooManyFunctions \u2014 39 functions. The bar is 30 functions; this is 9 over it, 1.30\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/system_awareness_logger.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c63efa309ba2e22676fca7999368c21394bfc34c93371ca4764ec4c0a1f556b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: enhanced_agent_tools: TooManyFunctions \u2014 39 functions. The bar is 30 functions; this is 9 over it, 1.30\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/enhanced_agent_tools.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b480546f9c3916a60af437e0783da3b6e70dc9457d3005d717f3ffbb3d9d296"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/environmental_learning_engine.erl: FileTooLong \u2014 645 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 148 functions. The bar is 500 significant lines; this is 145 over it, 1.29\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/environmental_learning_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d2812e9ae9de4944a90979034bab3d9fb387c42a941019d6051932195860969"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/philosophical_code_evaluator.erl: FileTooLong \u2014 636 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 157 functions. The bar is 500 significant lines; this is 136 over it, 1.27\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/philosophical_code_evaluator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35174a78e9d6f7abaf571b3521facfee7d7cd1233cda574d737ad7bea227ad16"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: AgentPillXL.AgentPillXL: FunctionTooLong \u2014 AgentPillXL runs 127 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 27 over it, 1.27\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentPillXL.tsx"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"0017bc114fad9d615fee61dd2f07d1724784b366e33308e72a10daa4147d2604"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChainOfThoughtEngine: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/services/ChainOfThoughtEngine.ts"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5815564e5c729ec0b7c119f24bc7e6a0759b176a0a7a94ce091c6a82b43812e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: TokenHeatmap.TokenHeatmap: FunctionTooLong \u2014 TokenHeatmap runs 126 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 26 over it, 1.26\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/TokenHeatmap.tsx"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3cda173de21edb14cf31aaaa018255f2a6b3c51b136b680042937058fc6911"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp_server_config.erl: FileTooLong \u2014 629 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 129 over it, 1.26\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/mcp_server_config.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b39a0bc320ef6569fbe445bdc9f67ff7b87ff6dcdad0a0bc48e7710402cfdc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/realtime_pricing.erl: FileTooLong \u2014 627 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 127 over it, 1.25\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/realtime_pricing.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"42bbc672f8bbe8da765cb6543390231601b6f23e5f2b939caaf96e65cc7b7cdf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/hyper_graph_storage.erl: FileTooLong \u2014 623 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 58 functions. The bar is 500 significant lines; this is 123 over it, 1.25\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/hyper_graph_storage.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf371d512ca828d42098b520242ca191f770bbcb848852481ac1f112ec505ac9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/autonomous_goal_planner.erl: FileTooLong \u2014 623 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 158 functions. The bar is 500 significant lines; this is 123 over it, 1.25\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/autonomous_goal_planner.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8de73c989ae9f6b9a3021a408dc81e701eedc77f9bb6280e9aea406f39cbfb7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/meta_server.erl: FileTooLong \u2014 618 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 45 functions. The bar is 500 significant lines; this is 118 over it, 1.24\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_server.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65714fae3cc59cb094bfb37cf0d4e7185b05a6e1bc7858415ceaecc75f0fad1e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/dynamic_knowledge_graph.erl: FileTooLong \u2014 617 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 110 functions. The bar is 500 significant lines; this is 117 over it, 1.23\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_knowledge_graph.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09fdb77c5d1fc5a7681ebd6d6dea79c8e663e3d80325e60ee4b4c2cd889d42b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: model_definition_manager: TooManyFunctions \u2014 37 functions. The bar is 30 functions; this is 7 over it, 1.23\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_definition_manager.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"528028dab6252749e80e62d2f8f7b9c323cfaf87ea25880542f0494a0f797d32"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: CrashMonitorDashboard: ClassTooLong \u2014 491 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 91 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab53857f1060ebdd3da583b3d786ba7eac270217cd6ca950f9c7918525de0abe"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/openapi_graphql_bridge.erl: FileTooLong \u2014 610 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 68 functions. The bar is 500 significant lines; this is 110 over it, 1.22\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_graphql_bridge.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88114183372d48ecdf585fb73cd4637a0f4633f812cc2b79d00f2c51e92e3c5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/advanced_autonomous_agent.erl: FileTooLong \u2014 607 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 132 functions. The bar is 500 significant lines; this is 107 over it, 1.21\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/advanced_autonomous_agent.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ccec89c4ebe99386efb071c7d58bf38006f479b5931696893b50731056d517e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/agent_templates.erl: FileTooLong \u2014 606 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 106 over it, 1.21\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_templates.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eac87ff694bb25d11200710a39269d8f9ea429a5aa144f1d2514a28c52d9043d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: MonitoringPanel.MonitoringPanel: FunctionTooLong \u2014 MonitoringPanel runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MonitoringPanel.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c662c92cf929a8def60a4feb577f92ac54c2c0ee3ba94b1b0b01af2d9afa206"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: CollaborationManager: TooManyMethods \u2014 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/services/CollaborationManager.ts"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0580bee617197aac9b6696575a2c1bdcc22b49a70c1edb6ba7f2d6d20a923c0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: mcp_monitor: TooManyFunctions \u2014 36 functions. The bar is 30 functions; this is 6 over it, 1.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_monitor.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd13329f2cf74f800b700284094fde24c8b22d815462b189651ead815660891d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: mcp_streamable_http_handler: TooManyFunctions \u2014 36 functions. The bar is 30 functions; this is 6 over it, 1.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_streamable_http_handler.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"7efb3517a219487480ff0f0d48a5cf593987b28a4b2af780cbe99e6a0ef97292"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: agent_temporal_awareness: TooManyFunctions \u2014 36 functions. The bar is 30 functions; this is 6 over it, 1.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_temporal_awareness.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f39dc42b2ba6dbb01de5ef59e2bd655ecf67218fd290771ba3f6248529b6f79"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: token_stream_fsm: TooManyFunctions \u2014 36 functions. The bar is 30 functions; this is 6 over it, 1.20\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ecd70dd639e9c68350eb494c55dc1753925f871aa2c2dee898a518b4543e9f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: DiscoveryMeshDashboard: ClassTooLong \u2014 476 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 76 over it, 1.19\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8256887dcc07524ca3b53379f2a9e8f3c42d2219e14d78d63ffe9c8b6871c320"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: UltimatePerformanceDashboard: ClassTooLong \u2014 472 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 72 over it, 1.18\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f351fd0e8ec84db440846517f74f7eef7500c98eb1ae261fc9575af815c36149"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: ResourceSentinelBar.ResourceSentinelBar: FunctionTooLong \u2014 ResourceSentinelBar runs 117 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 17 over it, 1.17\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"13dfe7760d386d347c983eb2fc7d5bd00ac6895d428ae244f8b588b46c090855"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: consciousness_reality_bridge: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_reality_bridge.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"71484638368e604b7b181b609cd32c707afc5db27d666076da8f8dbe2215b90c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: embedding_integration: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fdc7307d5fd6fac75cc1503fb3b215bfa6c1b0829582db77ad7c8da17625cc5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: mcp_advanced_logger: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_logger.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"889cbf75afba385ab5c176ff6b7d24317afd0473793f8ecc34601ccb7e23e7cf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: jina_client: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_client.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d5cf0bb9803a8f41c2fa72077fb20941fa2bc9c03d6ac2f611e17a23f8ff8d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openai_responses: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_responses.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd9d33d7f0be3c5180de77c209891b7b299fbf4e8161cf7969bd164052854f25"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: openapi_codegen: TooManyFunctions \u2014 35 functions. The bar is 30 functions; this is 5 over it, 1.17\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_codegen.erl"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"f13d39e4a83f18a4ae53a77dc0a57c8c58690706f43b32c203c7d87486ea02bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/App.tsx: FileTooLong \u2014 580 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: App (55-750). The bar is 500 significant lines; this is 80 over it, 1.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3b05555282d2cd121784cff04098a7cbea4a5aed77b14e38da45484c3001ce3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/autonomous_error_corrector.erl: FileTooLong \u2014 579 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 82 functions. The bar is 500 significant lines; this is 79 over it, 1.16\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/autonomous_error_corrector.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9767eaab3f366da7fe9c15a5db7d1299e3f884f709b6b501a6d288114f9c7c7c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/neural_swarm_coordinator.erl: FileTooLong \u2014 579 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 46 functions. The bar is 500 significant lines; this is 79 over it, 1.16\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/neural_swarm_coordinator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"011faa4d96764f347d9c9164a27d315b04829c27b8de4dcd51bbfc983d98eca2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/system_introspection.erl: FileTooLong \u2014 578 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 69 functions. The bar is 500 significant lines; this is 78 over it, 1.16\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/system_introspection.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86045a67d0cd76a4338bd5b0a43eccd4086e8dc42f74cb3f7c01f61bd8542f10"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ModelConfiguration: ClassTooLong \u2014 459 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 59 over it, 1.15\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1758799f9b10412ad18b04da69a928bd21d84bfa042e2de7ee90c7c972ec906"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/bio_inspired_self_healing.erl: FileTooLong \u2014 570 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 122 functions. The bar is 500 significant lines; this is 70 over it, 1.14\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/bio_inspired_self_healing.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3664606ed63649d7ea8d4617e2618eb5288c4db5e002cfe1b946cf9c9b79da3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/CrashMonitorDashboard.tsx: FileTooLong \u2014 567 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: CrashMonitorDashboard (86-680). The bar is 500 significant lines; this is 67 over it, 1.13\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"206ce13bbe17fc4ba3708fb01c03de0914b01d0be238929f24da3d0b732b424a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: error_tracking_system: TooManyFunctions \u2014 34 functions. The bar is 30 functions; this is 4 over it, 1.13\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/error_tracking_system.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"900ec2fc6a7a3f6cbab83abbf87f4418a94a35077c4a3cd6769c46bb4130d991"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: universal_tool_registry: TooManyFunctions \u2014 34 functions. The bar is 30 functions; this is 4 over it, 1.13\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/universal_tool_registry.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"68519f8ab8300bf95f1b9497d4c7b6d1e07dab2eaf1dd40e8f18e873fd2bed5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: LogsViewer.LogsViewer: FunctionTooLong \u2014 LogsViewer runs 113 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 13 over it, 1.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/LogsViewer.tsx"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e128232fe627732b04f4b87b46d8b041f4ec81c83a8e5c1bc83ea6d2de6cb63"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/adaptive_architecture_engine.erl: FileTooLong \u2014 564 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 132 functions. The bar is 500 significant lines; this is 64 over it, 1.13\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/adaptive_architecture_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3be42593caeaf1de054baf363259903cf86cc23cebce7e528328b8ecf14c940"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AdvancedStructuredOutputsManager: ClassTooLong \u2014 448 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 48 over it, 1.12\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be5f3881f4e8e8ac4acc6c13412d2f6a67d37e531a074ec71ffba98b94744309"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: QuantumConsciousnessInterface: ClassTooLong \u2014 448 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 48 over it, 1.12\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"73594355304363de0fc85bb9c941bfa426cb770a448b059df22006d229241134"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/workflow_orchestrator.erl: FileTooLong \u2014 559 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 47 functions. The bar is 500 significant lines; this is 59 over it, 1.12\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/workflow_orchestrator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aff437c027827d8206b31d0996e997db63ae198a4924ef20f1fa05495657eedc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/metacognitive_code_analyzer.erl: FileTooLong \u2014 558 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 66 functions. The bar is 500 significant lines; this is 58 over it, 1.12\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/metacognitive_code_analyzer.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca642e0ffca0d81232342fabce991e9056ebb2643430de231fd751f2c19e5d61"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/openapi_time_travel.erl: FileTooLong \u2014 555 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 63 functions. The bar is 500 significant lines; this is 55 over it, 1.11\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_time_travel.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a02423f1d1a8b274a20ecd454dcc39759100f4eeae1bdd4ab7f6039d4cb418"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: DenseDashboard.DenseDashboard: FunctionTooLong \u2014 DenseDashboard runs 111 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 11 over it, 1.11\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseDashboard.tsx"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3cdf092986a8c9d89ba12cebfa7743f775bbf7b7b72f8390b732de42292434"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/autonomous_self_transformation_engine.erl: FileTooLong \u2014 552 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 100 functions. The bar is 500 significant lines; this is 52 over it, 1.10\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/autonomous_self_transformation_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bbecb56688957a402903acf40e1d9b99a1adca7e626a732dc7edc126b64a54b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/environment_modifier.erl: FileTooLong \u2014 552 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 91 functions. The bar is 500 significant lines; this is 52 over it, 1.10\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/environment_modifier.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e3dc1ae8722b8c31f7c99d02024c2a7c8ca3b3db6482c42d652a4c353214428"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/consciousness_integration_demo.erl: FileTooLong \u2014 551 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 61 functions. The bar is 500 significant lines; this is 51 over it, 1.10\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/consciousness_integration_demo.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"363708766b01d1523fb8acf51407c49ba8ecac427064e76ff6c7b3f7a9a2208d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/deep_code_reflection_engine.erl: FileTooLong \u2014 550 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 76 functions. The bar is 500 significant lines; this is 50 over it, 1.10\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/deep_code_reflection_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66ddac7d9c2b20730e9800d986be4ee6e2dc7f3364d0ccfe83a0fce33a8f731b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/deep_reasoning_engine.erl: FileTooLong \u2014 550 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 139 functions. The bar is 500 significant lines; this is 50 over it, 1.10\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/deep_reasoning_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"962d2b4685925a1d315e2596bc9a36dcb2abd0e5e250bee2fdc735f8abba0f38"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: SimpleAdvancedChat.AdvancedMessageContent: FunctionTooLong \u2014 AdvancedMessageContent runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb6002cec2ca787953d0cff8451bb21276ded1f45953a73b00a7f40810a201e1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/autonomous_agency.erl: FileTooLong \u2014 544 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 128 functions. The bar is 500 significant lines; this is 44 over it, 1.09\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/autonomous_agency.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10b872a93ded315791ac8679220b2e391e2d6e4c4ca329bdab8e276492370d58"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/UltimatePerformanceDashboard.tsx: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: UltimatePerformanceDashboard (97-620). The bar is 500 significant lines; this is 43 over it, 1.09\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6b425c24d9e81203f23e4737033526a88033fe25da9e62112a68cfb9e9c7a4c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/goal_oriented_planner.erl: FileTooLong \u2014 537 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 98 functions. The bar is 500 significant lines; this is 37 over it, 1.07\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/goal_oriented_planner.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0b19941a6704797987ee8e62a48b2daa0748b03d404a7204582ebac32bdcff4"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AdaptiveAIInterface: ClassTooLong \u2014 429 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 29 over it, 1.07\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"49c93608d59840fb30e2160db095ae736e0f511cbd71c323d0b2b593457c6eb3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/mcp_orchestration_engine.erl: FileTooLong \u2014 536 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 80 functions. The bar is 500 significant lines; this is 36 over it, 1.07\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_orchestration_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4267afe81749372d8a3b8c9d8b9347552109342c15e800ecf21402da601810"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/smart_reasoning_agent.erl: FileTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 59 functions. The bar is 500 significant lines; this is 33 over it, 1.07\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/smart_reasoning_agent.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a513a9d709f84060259e4aabd9f21fe3ecc87e5bbe0852791770fc68b7a122f4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/quantum_consciousness_engine.erl: FileTooLong \u2014 528 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 53 functions. The bar is 500 significant lines; this is 28 over it, 1.06\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_consciousness_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef8559c0814dd78da119eb0162e72dae9a65071c57f22a71ed44170d644396b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/consciousness_simulation_engine.erl: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 86 functions. The bar is 500 significant lines; this is 27 over it, 1.05\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/consciousness_simulation_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9be3f0bb16d75855917710b7bffb69498239fd3e796eefd1ea9211f6b95fc275"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/self_modifying_agent.erl: FileTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 94 functions. The bar is 500 significant lines; this is 27 over it, 1.05\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_modifying_agent.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e3b16a7b3d13e0ddf0e9997bafa245cc8633d8e57d869ae65b2ed4475c93eb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/self_replicating_supervisor.erl: FileTooLong \u2014 526 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 85 functions. The bar is 500 significant lines; this is 26 over it, 1.05\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_replicating_supervisor.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"830eb2d6f12f74c9b93fd6784ac1858273474887068249859dee62f4ec2d4ff4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/quantum_performance_transcendence.erl: FileTooLong \u2014 523 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 131 functions. The bar is 500 significant lines; this is 23 over it, 1.05\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_performance_transcendence.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e358a4af6f425277e448f1e9da7fa4226337af5eaf3d0911138c247971649b6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/DiscoveryMeshDashboard.tsx: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: DiscoveryMeshDashboard (55-593). The bar is 500 significant lines; this is 22 over it, 1.04\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1d56ff95d84cb282249974fe9318dd3e1c65310377040895e8eb7f5d5d2955d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/ai_timeout_analyzer.erl: FileTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 56 functions. The bar is 500 significant lines; this is 18 over it, 1.04\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_timeout_analyzer.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfe894a5cf795f67557930f1f2175cde303934116420ff7d4b2d776ea44923d4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/workflow_api_handler.erl: FileTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 18 over it, 1.04\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/workflow_api_handler.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"644d58f386c8d4264bfcd897f0decbdf112db54ce2479826221fa7756c22e3e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/cluster_orchestrator.erl: FileTooLong \u2014 517 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 125 functions. The bar is 500 significant lines; this is 17 over it, 1.03\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/cluster_orchestrator.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"174a0e01a50590cdce2fe71a826a19cb99aa524cecfed1250fb69db8fa646b58"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: ai_error_interpreter: TooManyFunctions \u2014 31 functions. The bar is 30 functions; this is 1 over it, 1.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c8e4d6a4bf7a4b61bfe20b5c6566ca2a95f59a44c300d29a15972932787f08"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: error_resilience: TooManyFunctions \u2014 31 functions. The bar is 30 functions; this is 1 over it, 1.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/error_resilience.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7055f2b997b4ea18216ecdbe5e8b2de943bddac76b194b870eaf13d7aff70e5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFunctions: mcp_advanced_client: TooManyFunctions \u2014 31 functions. The bar is 30 functions; this is 1 over it, 1.03\u00D7 the bar. The counted members are a module\u0027s functions \u2014 a module holds no instance state, so there is no shared data to group them by and no type to move them onto. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no single module carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_client.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"506415eed19e76a926e18121610f335a3bd5ff1fabbb611713f8d9081f72dcf1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/ModelConfiguration.tsx: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: ModelConfiguration (65-607). The bar is 500 significant lines; this is 16 over it, 1.03\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"725406368ab4c615890ab25b3b1ddf693e7b1ce5c53b4711311dbb625f2e7775"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/meta_meta_monitor.erl: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 51 functions. The bar is 500 significant lines; this is 16 over it, 1.03\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_meta_monitor.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5105bb85223f79465ba0e17fa20fb6dfd5ef98d6b9e576658834d326d9fdba1d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/model_registry.erl: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 16 over it, 1.03\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/model_registry.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f74aa6f754edc2e09d724b0154fd17afd25dc91a3dffe65bef0b21ad3f3bbdc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/realtime_metrics_engine.erl: FileTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 38 functions. The bar is 500 significant lines; this is 11 over it, 1.02\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/realtime_metrics_engine.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afcdd52d16d15966a357b00e0a1ddc60321e6fe8bcf8786f829313df705d7cd7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/InteractiveWidgets.tsx: FileTooLong \u2014 509 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 9 over it, 1.02\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveWidgets.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"44d4fb05b2e33261b4b264222a3fc281ecd7e240f857c637e788540fb5bc2d29"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/cross_system_intelligence.erl: FileTooLong \u2014 509 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 79 functions. The bar is 500 significant lines; this is 9 over it, 1.02\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/cross_system_intelligence.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab316650e2d7e68f6584f047e717bf13b54efa3fe28bf55b1f26335e607c404d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/super_agent.erl: FileTooLong \u2014 507 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 45 functions. The bar is 500 significant lines; this is 7 over it, 1.01\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/super_agent.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f36617514227023ce95654e8bcc9053a64fa8564f41f73d251e04380140fe405"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/AdvancedStructuredOutputsManager.tsx: FileTooLong \u2014 503 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: AdvancedStructuredOutputsManager (62-593). The bar is 500 significant lines; this is 3 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ac45b9e13ac4d0c62a0d977f30616c531ef5b35604253c182310c8343521285"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Timeline: ClassTooLong \u2014 401 significant lines (blank, comment-only and punctuation-only lines excluded), 1 methods. The bar is 400 significant lines; this is 1 over it, 1.00\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Timeline.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6ac3eb52d5757ca0c411a3922ddf187c34eba2f3b4186354d1500933a358615"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: components/InteractiveReasoningControls.tsx: FileTooLong \u2014 501 significant lines (blank, comment-only and punctuation-only lines excluded), about 70% of them inside a single declaration: InteractiveReasoningControls (53-487). The bar is 500 significant lines; this is 1 over it, 1.00\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5f34cf4196121142737f2dbf59f64ccef1d5e7dd776a72b80d17425e7c5627a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/hot_swappable_ai_models.erl: FileTooLong \u2014 501 significant lines (blank, comment-only and punctuation-only lines excluded), declaring 106 functions. The bar is 500 significant lines; this is 1 over it, 1.00\u00D7 the bar. In this language a module is exactly one source file, so its length cannot be moved into sibling files of the same module. To reduce it, extract each cohesive family of functions into a new module of its own and have this one delegate to it, so no one module has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/hot_swappable_ai_models.erl"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45558f2ce63b0a8720dcddfb6e9535c5002e2fbc7b6968bd06dc564d8211141d"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member family (3 members, 38 shared lines): apps/agent_web/src/mcp_server.erl:285-470 | apps/agents/src/agent_tools.erl:1846-2130 | apps/agents/src/jina_tools.erl:14-299 \u2014 These 3 members are variants of one another: a block of 38 lines reported below appears in every one of them, and the pairwise near-duplicate rows they would otherwise produce are collapsed into this row. Read them as one construct written 3 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"473abb25e416f44c024d5b2563736a81278fc95643a10de7d03a740acd8171c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (73 shared lines): apps/agent_web/src/consciousness_bridge_api_handler.erl:103-245 | apps/agent_web/src/neural_swarm_api_handler.erl:89-226 \u2014 These two members are variants of one another: 73 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"a53301bdc2a0d127eb10e4925c801a907976cce44d6b9c074a6d939237a70831"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (32 shared lines): apps/agent_web/src/pipedream_mcp_client.erl:207-246 | apps/agent_web/src/pipedream_mcp_client.erl:248-284 \u2014 These two members are variants of one another: 32 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb31582a0bba755939f684106020d8a6f71005a164ded3e1453d2832464ab07e"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (26 corresponding lines): apps/agents/src/agent_registry.erl:111-136 | sandbox/myapp/apps/myapp/src/agent_registry.erl:108-133 \u2014 These two members are one piece of code written twice and then edited apart: 26 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_registry.erl"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"299333c5f36c13bdff6e6811e0b7f34c426929820c2fa08372c75a5490c9c48d"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (19 corresponding lines): apps/agent_web/src/mcp_client_v2.erl:389-422 | apps/agent_web/src/mcp_client_v2.erl:500-518 \u2014 These two members are one piece of code written twice and then edited apart: 19 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":389}}}],"partialFingerprints":{"codehealthFindingId/v1":"c42aa25598f0cc361d36501bd229b873f4fb4f510317c5363fc2e9619e4e390c"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (8 members, 50\u002B identical tokens): apps/openai/src/openai_files.erl:271-296 | apps/openai/src/openai_files.erl:298-323 | apps/openai/src/openai_files.erl:325-355 | apps/openai/src/openai_responses.erl:204-250 | apps/openai/src/openai_responses.erl:285-320 | apps/openai/src/openai_responses.erl:322-350 | apps/openai/src/openai_responses.erl:352-380 | apps/openai/src/openai_responses.erl:382-417 \u2014 These 8 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 8 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 8 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":271}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab4d029c425c5653b6e53cb42ca21978807439ca59c835dae5dff4340a30ffd1"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (7 members, 50\u002B identical tokens): apps/agents/src/jina_tools.erl:305-359 | apps/agents/src/jina_tools.erl:361-397 | apps/agents/src/jina_tools.erl:399-434 | apps/agents/src/jina_tools.erl:531-568 | apps/agents/src/jina_tools.erl:570-624 | apps/agents/src/jina_tools.erl:626-657 | apps/agents/src/jina_tools.erl:659-705 \u2014 These 7 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 7 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 7 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"0605ed01d2a78ef97d9293b796e3d5c2888a1b0314560314c8519bd4bd76854d"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (6 members, 50\u002B identical tokens): apps/agent_web/src/ai_error_interpreter.erl:158-188 | apps/agent_web/src/ai_error_interpreter.erl:202-223 | apps/agent_web/src/ai_timeout_analyzer.erl:254-285 | apps/agent_web/src/ai_timeout_analyzer.erl:493-521 | apps/agent_web/src/crash_ai_analyzer.erl:91-119 | apps/agent_web/src/crash_ai_analyzer.erl:161-186 \u2014 These 6 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 6 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 6 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7416992a237e703287f49bb5b8ebe2619e1a423b8d9c52a980ccce5eb249b1c"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): apps/agent_web/src/model_api_handler.erl:150-209 | apps/agent_web/src/model_api_handler.erl:224-287 | apps/agent_web/src/model_api_handler.erl:302-341 | apps/agent_web/src/model_api_handler.erl:450-490 | apps/agent_web/src/model_api_handler.erl:492-535 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"239ab2724035fa6fb8da1e0dfd679956df43baa81962feffeee1f1da9b33bc5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agent_web/src/agent_api_handler.erl:209-264 | apps/agent_web/src/agent_chat_handler.erl:45-127 | apps/agent_web/src/bulk_operations_handler.erl:12-38 | apps/agent_web/src/workflow_api_handler.erl:9-39 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0055c2e0e8b5663315bc22ff9f73f5690abe8b0bc817e5b4b7e7e9d7959ae98"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agent_web/src/mcp_cli.erl:253-266 | apps/agent_web/src/mcp_cli.erl:268-279 | apps/agent_web/src/mcp_cli.erl:309-322 | apps/agent_web/src/mcp_cli.erl:324-335 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"8851cbd1c5f4b8725d771c023ec25dba8f8d105bdeca48a1f91ff0a3231536b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agent_web/src/mcp_management_handler.erl:162-188 | apps/agent_web/src/mcp_management_handler.erl:220-254 | apps/agent_web/src/mcp_management_handler.erl:257-291 | apps/agent_web/src/mcp_management_handler.erl:294-328 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"2df621526c84056e2e3e84018f56a49b204e6b619207d7406e6c0e316d5e38dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agent_web/src/model_api_handler.erl:103-133 | apps/agent_web/src/model_api_handler.erl:224-287 | apps/agent_web/src/model_api_handler.erl:302-341 | apps/agent_web/src/model_api_handler.erl:492-535 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"473716338f670813d0a712379d5e4cafe38541239e58eac78894ec7109bd0920"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agents/src/agent.erl:625-638 | apps/agents/src/simple_agent.erl:133-146 | sandbox/myapp/apps/myapp/src/agent.erl:208-221 | sandbox/myapp/apps/myapp/src/simple_agent.erl:102-115 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf633c3d189d362ee4ce92204e2065aa105574b78fe5de2de673a72553535f44"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agents/src/agent_discovery.erl:383-405 | apps/agents/src/agent_discovery.erl:408-455 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:399-421 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:424-471 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"78654e6d1402b5002cf171ed7186a98382af0141dca6fd54d1810f565abc98d8"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agents/src/agent_discovery.erl:471-517 | apps/agents/src/agent_discovery.erl:520-554 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:487-533 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:536-570 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4042f66e9de3f115ce8f76a2327a1bbf32e62aac3dbc2ff44beb5a8054cce21"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/agents/src/simple_agent.erl:47-65 | apps/agents/src/simple_agent.erl:74-90 | sandbox/myapp/apps/myapp/src/simple_agent.erl:36-54 | sandbox/myapp/apps/myapp/src/simple_agent.erl:63-79 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/simple_agent.erl"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0f5b2db1b324a61612df11f81abaf60134a1c3d8f845c2440e7768e832c36b"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): apps/openapi_scaffold/src/openapi_advanced_codegen.erl:238-253 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:365-380 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:628-643 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:923-939 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_advanced_codegen.erl"},"region":{"startLine":238}}}],"partialFingerprints":{"codehealthFindingId/v1":"661d047d0d473069e3f8a95b4c79129c439e1ba04d101aae81a55acccb948eb3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (138 lines \u00D7 2): apps/agents/src/agent_discovery.erl:133-270 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:139-276 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"da18ff870dfd5c47366f1b207c92b174436748b81ceadb7e4484c93e65bd25b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (54 lines \u00D7 2): apps/agents/src/agent_messenger.erl:83-136 | sandbox/myapp/apps/myapp/src/agent_messenger.erl:83-136 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_messenger.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_messenger.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 97 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_messenger.erl"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6de4a6b5c280b6e0069bbeaf7214afc103c08a0704a4ae0690b8ff82016b8c49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (53 lines \u00D7 2): apps/agents/src/agent_tools.erl:134-186 | sandbox/myapp/apps/myapp/src/agent_tools.erl:92-144 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"d30c3957e869630fd39d16a930fb8a7b69c1cadeafe334df16bb3b359f498d35"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (48 lines \u00D7 2): apps/agents/src/agent.erl:549-596 | sandbox/myapp/apps/myapp/src/agent.erl:132-179 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":549}}}],"partialFingerprints":{"codehealthFindingId/v1":"3911b04bb6509e9e8d252c6bffbc2949b31f5f3c3d415719baa043a7f53840cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (48 lines \u00D7 2): apps/agents/src/agent_discovery.erl:408-455 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:424-471 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"355cebc2f42185c68568027461c19c0891a5a5a11ac07438f8f1c1b7f6800e32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (44 lines \u00D7 2): apps/agents/src/agent_discovery.erl:294-337 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:310-353 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"49aeed4e820c737685a79d1952b0e705ef9b25775bb5efdf85b6b5254ff274d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2): apps/agents/src/agent_tools.erl:1760-1801 | sandbox/myapp/apps/myapp/src/agent_tools.erl:339-380 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1760}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f444728a99e86fe5cbbb2653f75146df453a9dd114b3a48ef4b0d43fc15384"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2): apps/agents/src/agent_discovery.erl:471-504 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:487-520 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"d89183da0c0703cc3b2d04162baf618ac7a0b94dfe1e967ec2f6c230692b638f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): apps/agent_web/src/mcp_client_v2.erl:129-158 | apps/agent_web/src/mcp_client_v2.erl:165-194 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fcb49cc45dd451c5c58fc58196e861ce3f4cc0157f9eadf13f6718e97184aa6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): apps/agents/src/agent_messenger.erl:153-182 | sandbox/myapp/apps/myapp/src/agent_messenger.erl:153-182 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_messenger.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_messenger.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 97 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_messenger.erl"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"adc3c977c7dc3f7ca9dda4243ea9b3ceadadad6d18a5257f09bf933f47f56636"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2): apps/agents/src/agent_protocol.erl:213-242 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:220-249 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"0623c2af9716325f760128b1175b12cbcf2b5082d93975fa87d97587fef41834"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (29 lines \u00D7 2): apps/agents/src/timeline_event_store.erl:280-308 | apps/agents/src/timeline_event_store.erl:315-343 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/timeline_event_store.erl"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f181b8e17f7c78e57424492059f0eccff957d63082f37f8622202e960794d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): apps/agents/src/hello_world.erl:18-44 | sandbox/myapp/apps/myapp/src/hello_world.erl:18-44 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/hello_world.erl"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"70077234029b6a5ce92978943f6cddbf417bb565b9aa9a79448f8414479b1a4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201326 lines \u00D7 4): apps/agents/src/agent_discovery.erl:492-517 | apps/agents/src/agent_discovery.erl:532-554 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:508-533 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:548-570 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e32eb0e83affb5aae133c33f74fd9cc8ab804f068f57217a72ded9eda417604"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2): apps/openai/src/openai_chat.erl:66-91 | apps/openai/src/openai_responses.erl:103-128 \u2014 before extracting anything, compare \u0060apps/openai/src/openai_chat.erl\u0060 and \u0060apps/openai/src/openai_responses.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"318a08626a7582de8f6ffd0927df8d0ffd756e3a03a70956229493c7aecbe767"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 2): apps/agents/src/agent_tools.erl:105-128 | sandbox/myapp/apps/myapp/src/agent_tools.erl:65-89 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"1244787bd33f9d242dc1a1ded126b5828fb9396469cb4bd2fae707e3cf27c4ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (25 lines \u00D7 2): apps/agents/src/agent_tools.erl:378-402 | sandbox/myapp/apps/myapp/src/agent_tools.erl:237-261 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0ba042f8108fa98622e5d7aacfb3d8dee581ddc9277df396715795f7df3151"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24\u201325 lines \u00D7 2): apps/agents/src/agent_tools.erl:1927-1950 | apps/agents/src/jina_tools.erl:86-110 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1927}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a207520db3a57cd58ea286f631e141c7e1a4e09fa2c46f33ac88fbfc9f7d3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23\u201324 lines \u00D7 2): apps/agents/src/agent_tools.erl:2103-2125 | apps/agents/src/jina_tools.erl:227-250 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":2103}}}],"partialFingerprints":{"codehealthFindingId/v1":"928a612bb2e4c0292d81e884a763c1a8ab40bdc0ce77f39b9b0759d726736ae2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): apps/agents/src/agent.erl:150-172 | sandbox/myapp/apps/myapp/src/agent.erl:73-95 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"1edad96b757dcedc980e43203d9da1270fb9acde90f83e307848e1fe4f84dadd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22\u201323 lines \u00D7 2): apps/agents/src/agent_tools.erl:2043-2064 | apps/agents/src/jina_tools.erl:171-193 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":2043}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee5dec46ea8368bd527ed9dd3673f8e0d70b10b63d7e443f86891bc8fda1a14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20\u201321 lines \u00D7 2): apps/agents/src/agent_tools.erl:2074-2093 | apps/agents/src/jina_tools.erl:200-220 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":2074}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2a5b72030f060d674b784b4f7206ed5146531d80e2dd75e674e9c747ee2791c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:95-115 | apps/openai/src/openai_client_template.erl:91-111 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"b195441dff88443ec1d16af515777190d074a9062fd8e499af1192cda190d231"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): apps/openai/src/openai_completions.erl:45-65 | apps/openai/src/openai_embeddings.erl:45-65 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_completions.erl"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"21816d27e6b2d5ec195c4ee5d4371dc143b4325fef65682aee63df9264636459"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): apps/agent_web/src/mcp_oauth_integration.erl:210-229 | apps/agent_web/src/mcp_oauth_integration.erl:430-449 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_integration.erl"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a5e64ad62758c8d3cad0af9d9727b3cda7ac0fbc312a284a334d2d3e797eb10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): apps/agent_web/src/pipedream_api_handler.erl:81-100 | apps/agent_web/src/pipedream_api_handler.erl:110-129 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_api_handler.erl"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd31e82b9353fdfba92d8bc6006bc0f0066d03573ac7986bbc5d657d32ffe01b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): apps/agents/src/streaming_function_handler.erl:436-455 | apps/openai/src/openai_streaming.erl:176-195 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/streaming_function_handler.erl"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"641e1349b2972a24228d84c338688faa11f327dfdbe3f748d0852a863885271c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 4): apps/agent_web/src/mcp_client_v2.erl:132-150 | apps/agent_web/src/mcp_client_v2.erl:168-186 | apps/agent_web/src/mcp_client_v2.erl:331-349 | apps/agent_web/src/mcp_client_v2.erl:920-938 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a793ffc698bab33799266a668cd89071e6d53ce19b59ed22cbaf3223fcbe0fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): apps/agents/src/agent_instance.erl:1511-1529 | apps/agents/src/agent_instance.erl:1546-1564 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":1511}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ebfce578a6c5c00cdbe24e6e8eb5ef2785f4ad19fec22acb66eb771925154ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): apps/agents/src/agent_quorum.erl:110-127 | apps/agents/src/agent_quorum.erl:186-204 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_quorum.erl"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"2513ff75256f7ba06b88dc650b2c998fa82f6dbd4425ae8b14e541385a9b9253"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): apps/agents/src/simple_agent.erl:47-65 | sandbox/myapp/apps/myapp/src/simple_agent.erl:36-54 \u2014 before extracting anything, compare \u0060apps/agents/src/simple_agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/simple_agent.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/simple_agent.erl"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5671305c61afd640d2e93a7ecb5a5b0a2c29f0eb6d6140ae145b6b07d8be35"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): apps/openai/src/token_stream_fsm.erl:268-286 | apps/openai/src/token_stream_fsm.erl:291-309 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"a25a6f561ea8af210e8337d98f0fcf5839fa34348e7ba85e9920b76366a35508"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 8): apps/openai/src/openai_files.erl:280-296 | apps/openai/src/openai_files.erl:307-323 | apps/openai/src/openai_files.erl:339-355 | apps/openai/src/openai_responses.erl:233-250 | apps/openai/src/openai_responses.erl:304-320 | apps/openai/src/openai_responses.erl:334-350 | apps/openai/src/openai_responses.erl:364-380 | apps/openai/src/openai_responses.erl:401-417 \u2014 there are 8 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 8 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f5e13664082c8fae82b2190b1294889b9d7027d88001779327130946d86ba2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): apps/openai/src/token_stream_fsm.erl:583-600 | apps/openai/src/token_stream_handler.erl:411-428 | apps/openai/src/token_stream_integration.erl:403-420 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf62590a1354c458eabcb1d7dd2eb883ef2f9537d9bea007f57867f62264b85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): apps/agents/src/agent_discovery.erl:275-292 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:291-308 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec513b47f79bf6177a1e441a076a0750dd5aa6e55545d9dca23c8585e2be30aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): apps/agents/src/agent_discovery.erl:363-380 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:379-396 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad0eb780575a281af0946d1f1b1a6b01a6640351c81f1c7f6152b5d2186c8e0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): apps/agents/src/agent_tools.erl:1852-1868 | apps/agents/src/jina_tools.erl:19-36 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1852}}}],"partialFingerprints":{"codehealthFindingId/v1":"387bddcb8a4e2fdca93b2635613680d59ce696f0e323eac3101652c902dace52"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 2): apps/agents/src/agent_tools.erl:1892-1908 | apps/agents/src/jina_tools.erl:55-72 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1892}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb047bfabcb48c3a0500c186b83a1dad4e431ec178949452be78bd58b972624"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201318 lines \u00D7 2): apps/agents/src/self_replicating_supervisor.erl:304-321 | apps/agents/src/self_replicating_supervisor.erl:414-427 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/self_replicating_supervisor.erl"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dd9cf094bb1edff79e64ae13d9000a40fdc27b5676003b3420f6e9cda902c0c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:167-183 | apps/agent_web/src/agent_scheduling_handler.erl:207-222 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc80c0700617ccf4cff43ae068053e1063234a1f6b56487e928210f9396ce526"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): apps/agent_web/src/mcp_client_v2.erl:399-414 | apps/agent_web/src/mcp_client_v2.erl:502-518 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"450a95f8ef914ec8ffb92ea8a93dbe3dd069de3134ad5908b3f0419aed7c68dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): apps/agent_web/src/model_api_handler.erl:178-194 | apps/agent_web/src/model_api_handler.erl:256-272 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f976e6d08c9d6c205a2861b139c3abcea1439322b14e6ce943f0b28c353db51"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): apps/agents/src/agent.erl:673-689 | sandbox/myapp/apps/myapp/src/agent.erl:256-272 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"315f6246bcc9224c053efea661920e295d3e7cfbbe17f096095d4e537f56fb89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): apps/agents/src/simple_agent.erl:74-90 | sandbox/myapp/apps/myapp/src/simple_agent.erl:63-79 \u2014 before extracting anything, compare \u0060apps/agents/src/simple_agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/simple_agent.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/simple_agent.erl"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"a601db43f3e2eee280404009068ff44d388f519145b891e8aca6f1a396cca766"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): apps/openai/src/openai_responses.erl:216-231 | apps/openai/src/openai_responses.erl:261-277 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_responses.erl"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa2b9abf18113c7b9c35873527a89cfa90140bf45b56d55e1e99fe8f3c1edf1f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201316 lines \u00D7 4): apps/agents/src/agent_discovery.erl:390-405 | apps/agents/src/agent_discovery.erl:428-441 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:406-421 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:444-457 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"50ed5d5816061e82f20ae77aa871ef131d450904ac220afae2bff1cf492009d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): apps/agent_web/src/crash_report_api_handler.erl:249-264 | apps/agent_web/src/crash_report_ws_handler.erl:217-232 \u2014 before extracting anything, compare \u0060apps/agent_web/src/crash_report_api_handler.erl\u0060 and \u0060apps/agent_web/src/crash_report_ws_handler.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 51 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"b798367b230cd89f699e723bf002d84750e02eb0c1d8e379244639e216c0b7c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): apps/agent_web/src/mcp_transport.erl:167-182 | apps/agent_web/src/mcp_transport.erl:226-241 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_transport.erl"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e37b11b85d3b76e62466f815c2be0f8df7ff7c2462fbf71e9eb99446817df3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): apps/agents/src/agent.erl:650-665 | sandbox/myapp/apps/myapp/src/agent.erl:233-248 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":650}}}],"partialFingerprints":{"codehealthFindingId/v1":"05745f26f0de4aade5d431ad99df18c6a5d5beea08f002a38ba406e9e4630638"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): apps/agents/src/agent.erl:692-707 | sandbox/myapp/apps/myapp/src/agent.erl:275-290 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":692}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb9543b6e8841a9a27315b3e76198d42d934857c6ba331c575838e62e4389bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201316 lines \u00D7 2): apps/agents/src/agent_tools.erl:1861-1875 | apps/agents/src/agent_tools.erl:1901-1916 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1861}}}],"partialFingerprints":{"codehealthFindingId/v1":"79d09084d1d82751a85d779ea6784ea8e0ffb63234648690ff7ce0785243fc09"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:157-172 | apps/openai/src/openai_client_template.erl:151-166 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4dd692d6b3084df086043936f3d3c33517873e0397bc89e2930310a1c81f1e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 4): apps/agent_web/src/mcp_oauth_handler.erl:30-43 | apps/agent_web/src/mcp_oauth_handler.erl:101-114 | apps/agent_web/src/mcp_oauth_handler.erl:149-163 | apps/agent_web/src/mcp_oauth_handler.erl:183-196 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_handler.erl"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1614110de427916a66994e7dd230e550d0ccd5b931977b26c0a290c3f5a24ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): apps/agent_web/src/mcp_server.erl:298-312 | apps/agents/src/agent_tools.erl:1852-1865 | apps/agents/src/jina_tools.erl:19-32 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_server.erl\u0060 and \u0060apps/agents/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"93adf42381debe29ca1bc2dd4dce35ce8365085077671099f82565bd722415fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201315 lines \u00D7 3): apps/agent_web/src/mcp_server.erl:406-420 | apps/agents/src/agent_tools.erl:2074-2087 | apps/agents/src/jina_tools.erl:200-213 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_server.erl\u0060 and \u0060apps/agents/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8fe86a81d429c720345bc2b775c4a773e976f35a31f4eccc5533a0120157c16"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): apps/agent_web/src/bulk_operations_handler.erl:12-26 | apps/agent_web/src/workflow_api_handler.erl:9-23 \u2014 before extracting anything, compare \u0060apps/agent_web/src/bulk_operations_handler.erl\u0060 and \u0060apps/agent_web/src/workflow_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecb11ab29233dcc54e8710103beeb2b277064474c84032095cc06dbfba99a99e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): apps/agent_web/src/pipedream_mcp_client.erl:208-222 | apps/agent_web/src/pipedream_mcp_client.erl:249-263 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab617521e9ec8e1ab1a38c385967e84db8755d41124016bf1e3b30ece9ed6778"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): apps/agents/src/agent_protocol.erl:107-121 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:114-128 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"1497e24036a39cdcca12745ea75930be7809927fe12d527e4326d5d8d94e4bd9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): apps/openai/src/openai_responses.erl:289-303 | apps/openai/src/openai_responses.erl:386-400 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_responses.erl"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c7ee9eb51c565b6b0a47a9bafacac7bd0478ff0e08f1997252a64f35f14964f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): apps/openai/src/token_stream_integration.erl:211-225 | apps/openai/src/token_stream_integration.erl:229-243 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_integration.erl"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"71f3b461eb09ab2be47d2002d77d887847207c0f1c046e05f6237672f05ea0e2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 4): apps/agents/src/agent.erl:625-638 | apps/agents/src/simple_agent.erl:133-146 | sandbox/myapp/apps/myapp/src/agent.erl:208-221 | sandbox/myapp/apps/myapp/src/simple_agent.erl:102-115 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":625}}}],"partialFingerprints":{"codehealthFindingId/v1":"7dd2aba5919e91f6ae4fd39a15043b4dc569f122d13d507068aaac88d62be988"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 3): apps/agent_web/src/mcp_client_v2.erl:409-422 | apps/agent_web/src/mcp_transport.erl:168-180 | apps/agent_web/src/mcp_transport.erl:227-239 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_client_v2.erl\u0060 and \u0060apps/agent_web/src/mcp_transport.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed44a9edf414b318bf6e5ee0fe2de644c01c781ee683f58bb5a13ba56bc7bbd7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): apps/agent_web/src/model_api_handler.erl:188-201 | apps/agent_web/src/model_api_handler.erl:266-279 | apps/agent_web/src/model_api_handler.erl:469-482 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0ae628ffd4e52cb3eeb54043e7c66cdb65fd358b9d6f92d5548585dca243d08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:103-116 | apps/agent_web/src/agent_scheduling_handler.erl:177-190 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e1fe545693f7372097362dc21db2ab5dac8e9d68e8de4effba7d429757ee02d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/agents/src/agent.erl:609-622 | sandbox/myapp/apps/myapp/src/agent.erl:192-205 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"5504f5edd522cf30fea81e317c769083d503df71b22599d940c1c1a0192785e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): apps/agents/src/agent_tools.erl:362-374 | sandbox/myapp/apps/myapp/src/agent_tools.erl:203-216 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"609ef160e0e8ca8279c43f553d8dc6a70776e3f4a32d22947724eb6d6b07ba72"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): apps/agents/src/jina_tools.erl:28-40 | apps/agents/src/jina_tools.erl:64-77 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b4db0205e5694976450d327786a0d3f7f3b9af47c0e654c4c9ea11411a26bec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/agents/src/timeline_event_store.erl:411-424 | apps/agents/src/timeline_event_store.erl:444-457 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/timeline_event_store.erl"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0fc48e71d8b0229e17e03f5550ba50b130de9bf0531253c32ca586e1c98a0f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/openai/src/openai_chat.erl:158-171 | apps/openai/src/openai_chat.erl:286-299 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da11d4a02e2e00fbeaedbfa4e93a3e9e79e429ae103431fb12fb313bac28094"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/openai/src/token_stream_fsm.erl:198-211 | apps/openai/src/token_stream_fsm.erl:216-229 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_fsm.erl"},"region":{"startLine":198}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e61c84820c2cc96ac533210dc5c5e7fe11020d001a62bcd38e65669e42a4e46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 7): apps/agents/src/jina_tools.erl:343-355 | apps/agents/src/jina_tools.erl:381-393 | apps/agents/src/jina_tools.erl:418-430 | apps/agents/src/jina_tools.erl:551-563 | apps/agents/src/jina_tools.erl:607-619 | apps/agents/src/jina_tools.erl:641-653 | apps/agents/src/jina_tools.erl:689-701 \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc1ecf4556e6e196c7a95babe801455f4f661e5110409b97f3ae7f59409cec15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agent_web/src/agent_api_handler.erl:211-223 | apps/agent_web/src/agent_chat_handler.erl:49-61 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"0628d305ba4f0268f8ca05169d8d36d568a5a2f0018ff6a640ae24dbe925aa7c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:23-35 | apps/agent_web/src/neural_swarm_api_handler.erl:23-35 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e94bf52045f0f7ea23101d85d78d5519fd0dfc836813f7a42c5d57a1b62638"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agents/src/agent_dynamic_system.erl:167-179 | apps/agents/src/dynamic_supervisor_manager.erl:139-151 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_dynamic_system.erl"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"e378f10095be0c3ea6d1b3568dc980301dc9e7ad23b68d65d133bbdfc81d33e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agents/src/agent_messenger.erl:185-197 | sandbox/myapp/apps/myapp/src/agent_messenger.erl:185-197 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_messenger.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_messenger.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 97 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_messenger.erl"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d40ec9c1afa0916d32a0cc217c75c3f4f0d8073b56f3ccd053e96dea966735"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201313 lines \u00D7 2): apps/agents/src/agent_tools.erl:348-358 | sandbox/myapp/apps/myapp/src/agent_tools.erl:189-201 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7edb5c00cab15b94d2e00b9b5faa1e08d91fa26a099a914c6b7c96e98976982"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agents/src/deep_code_reflection_engine.erl:139-151 | apps/agents/src/metacognitive_code_analyzer.erl:232-244 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/deep_code_reflection_engine.erl"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"214809ef296f51880636f86fe70d6453400ed9cb18be2b2ad6338ef00d1c6036"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/agents/src/jina_tools.erl:466-478 | apps/agents/src/jina_tools.erl:504-516 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6212a3b6784369686386bfc7729881539fb3794327be6d9d59543b5152bddb4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): apps/openai/src/openai_chat.erl:187-198 | apps/openai/src/openai_chat.erl:310-322 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"112bd3d668093f629c036f7b90e64e7cba17c6086721fe9bafa8aa8949cfc981"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4): apps/agent_web/src/fleet_management_handler.erl:22-33 | apps/agent_web/src/fleet_management_handler.erl:41-52 | apps/agent_web/src/fleet_management_handler.erl:60-71 | apps/agent_web/src/fleet_management_handler.erl:87-98 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/fleet_management_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"32fd59fe3bc298b983b3118c9808ee12cbc6d4f7ab8e3f06120cdc56cf2a2478"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agent_web/src/agent_communication_handler.erl:29-40 | apps/agent_web/src/agent_quorum_handler.erl:26-37 \u2014 before extracting anything, compare \u0060apps/agent_web/src/agent_communication_handler.erl\u0060 and \u0060apps/agent_web/src/agent_quorum_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_communication_handler.erl"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e818e2bea5fa5ab637b0401a6bcdae9e0b7feea1e1c5a02efeba1212f1c19cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:133-144 | apps/agent_web/src/agent_scheduling_handler.erl:233-244 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f7304dd1694f03ff3949f09bc96d28bd2d15d18dbdc03a55aa1f05fff0ac7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agent_web/src/colored_logger.erl:308-319 | apps/agent_web/src/colored_logger.erl:346-357 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/colored_logger.erl"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a9e46c847b2f9e8558b890e84b90a336f8f54cd566784036982a5635e2c5fe5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agent_web/src/endpoint_registry.erl:118-129 | apps/agent_web/src/endpoint_registry.erl:148-159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/endpoint_registry.erl"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0b7aa2cfe59c228eff14222704ded90b999586dc4af6541468800325026ae7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agent_web/src/mcp_cli.erl:341-352 | apps/agent_web/src/mcp_cli.erl:362-373 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"538ba8c4f2b13f78763b5b20fb27736f6c289d20a346d6c9e6f4c5229dd919f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201312 lines \u00D7 2): apps/agent_web/src/mcp_server.erl:452-463 | apps/agents/src/jina_tools.erl:257-267 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_server.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"27acd429acaea0f3c7bcc8c7b9e70ffda642401b34330e564d96f204cac57f7b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agents/src/agent_quorum.erl:97-108 | apps/agents/src/agent_quorum.erl:173-184 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_quorum.erl"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe2b7cb61e9a2c93ff51fd9136e278a57ac8d21d509d019a2280263478206fcc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agents/src/agent_tools.erl:259-270 | apps/agents/src/agent_tools.erl:292-303 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"85088dfd9940dfaa0cfa81282fdecd3e980656440f3dfc0dd31ea7c0e426fa9b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agents/src/agent_tools.erl:330-341 | sandbox/myapp/apps/myapp/src/agent_tools.erl:174-185 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"def35725e07e8d7f08868c7d640c768a734c3c26481da69128e8cb89d6017a23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agents/src/agent_tools.erl:1804-1815 | sandbox/myapp/apps/myapp/src/agent_tools.erl:383-394 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1804}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec72428515c1d1ef6b0e9d717264b51fa76fd0c0a96b7b0263250bea995085a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/agents/src/jina_tools.erl:480-491 | apps/agents/src/jina_tools.erl:518-529 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d0ac0c54053bf2fac6631444656d19f04abb9b9eb2bcc03ce1e33a0fad6364"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:29-40 | apps/openai/src/openai_client_template.erl:27-38 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"80086a6fd6a16a648fdb05f8de83fa2c0ba9dab245f3d43a3c7726faf21df7b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/openai/src/openai_streaming.erl:90-101 | apps/openai/src/openai_streaming.erl:107-118 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_streaming.erl"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a9793f3b2639a37cf49eeffafe1944668cc118512031bee1a23be7842c5ace8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/openapi_scaffold/src/openapi_router.erl:51-62 | apps/openapi_scaffold/src/openapi_router.erl:67-78 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_router.erl"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"21a8f54597478412d16d4b867dc981c89977a0b247b40620614936a7c5fe312d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4): apps/agent_web/src/mcp_orchestration_handler.erl:82-92 | apps/agent_web/src/mcp_orchestration_handler.erl:102-112 | apps/agent_web/src/mcp_orchestration_handler.erl:126-136 | apps/agent_web/src/mcp_orchestration_handler.erl:149-159 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_orchestration_handler.erl"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"98b6507e4729b838a2fc2c11e4de7073468fac184d9e2cf28982fe4993d62610"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): apps/agent_web/src/mcp_server.erl:706-716 | apps/agent_web/src/mcp_server.erl:776-786 | apps/agent_web/src/mcp_server.erl:839-849 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac6e61e758a033d6344707d6ae103d5bb9eb146f67dee888a368b247dcda6c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/agent_api_handler.erl:197-207 | apps/agent_web/src/agent_api_handler.erl:276-286 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2ddf49973154d1475b50c3abb06074a1ea20579b86fbbdb56dcead6f5595b88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/agent_communication_handler.erl:54-64 | apps/agent_web/src/agent_quorum_handler.erl:51-61 \u2014 before extracting anything, compare \u0060apps/agent_web/src/agent_communication_handler.erl\u0060 and \u0060apps/agent_web/src/agent_quorum_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_communication_handler.erl"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb4cad86e3a1cfe5d4cbf8020b24f2d0e7ab5ee27489a35e019d9bad30f19de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/agent_execute_handler.erl:32-42 | apps/agent_web/src/agent_templates_handler.erl:28-38 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_execute_handler.erl"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ac95a42ae5794fcf8e1a3f3197b2472f95cfe9996076e5c9e8c788b8e3b234b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:343-353 | apps/agent_web/src/timeline_ws_handler.erl:339-351 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c9bbabf02563197627e950b1ebeda1166c17237c8159f034d5913dac52e6ffa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/distributed_consensus_tracker.erl:447-457 | apps/agent_web/src/distributed_consensus_tracker.erl:720-730 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/distributed_consensus_tracker.erl"},"region":{"startLine":447}}}],"partialFingerprints":{"codehealthFindingId/v1":"5904d9acaf6b24cbb8191b2547d9a896e12d5979631f236438bf058668686496"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/mcp_api_handler.erl:31-41 | apps/agent_web/src/mcp_api_handler.erl:113-123 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4787886835ea6cfdf739ef40f8e8f852e44ed111da769b3166e4ceb3879c90a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/pdf_processing_integration.erl:347-357 | apps/agent_web/src/pdf_processing_integration.erl:363-373 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pdf_processing_integration.erl"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"d634246bd7efa2fc1c9fc9ffa34a4c1e48edde6710ac5d9277e19f7063f9e71d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/pipedream_mcp_client.erl:236-246 | apps/agent_web/src/pipedream_mcp_client.erl:274-284 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea928d080ead18a26294bdbae9c6df37b525318950cb1e767e9884f01ee224b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/ssl_cert_handler.erl:34-44 | apps/agent_web/src/system_health_handler.erl:32-42 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ssl_cert_handler.erl"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce53d639ae699b77d073dab486081674061424631e71f994ce882e08a6e9ff2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/workflow_api_handler.erl:128-138 | apps/agent_web/src/workflow_api_handler.erl:174-184 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/workflow_api_handler.erl"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff5df1fa55db19ac366d382bb8ee9599902f58483daca5846db5e7d46937cfc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agents/src/agent_registry.erl:126-136 | sandbox/myapp/apps/myapp/src/agent_registry.erl:123-133 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_registry.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_registry.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_registry.erl"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a49c481ecc6e6feb8f22d6b6f396c74570e074e6c0ca0705b9c973d90a69b6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agents/src/agent_uuid.erl:13-23 | sandbox/myapp/apps/myapp/src/uuid.erl:12-22 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_uuid.erl"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aea42fc0a36cf70981bd39bbb8c15588d3318a8b323a79be8c3e2f09858d61c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 7): apps/agent_web/src/workflow_api_handler.erl:112-121 | apps/agent_web/src/workflow_api_handler.erl:157-166 | apps/agent_web/src/workflow_api_handler.erl:193-202 | apps/agent_web/src/workflow_api_handler.erl:240-249 | apps/agent_web/src/workflow_api_handler.erl:296-305 | apps/agent_web/src/workflow_api_handler.erl:351-360 | apps/agent_web/src/workflow_api_handler.erl:375-384 \u2014 all 7 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/workflow_api_handler.erl"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"8156b7e0e47553a7b250df77bbff3e48746764f30b4898ebc12692a9f2f921e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 4): apps/agent_web/src/agent_api_handler.erl:210-217 | apps/agent_web/src/agent_chat_handler.erl:47-55 | apps/agent_web/src/bulk_operations_handler.erl:14-23 | apps/agent_web/src/workflow_api_handler.erl:11-20 \u2014 before extracting anything, compare \u0060apps/agent_web/src/bulk_operations_handler.erl\u0060 and \u0060apps/agent_web/src/workflow_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"04ee8343b43aa8cc342e4f3d3899d6c07bd31e49fc91379d284ca55efe1d23a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): apps/agent_web/src/examples_handler.erl:13-21 | apps/agent_web/src/knowledge_base_handler.erl:122-131 | apps/agent_web/src/knowledge_base_handler.erl:144-153 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/examples_handler.erl"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e5ba78e7125e0d79bb86ca84594ed3353fab40c7e74f7c3606a0adb4af0628c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): apps/agent_web/src/mcp_server.erl:381-390 | apps/agents/src/agent_tools.erl:2043-2052 | apps/agents/src/jina_tools.erl:171-180 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_server.erl\u0060 and \u0060apps/agents/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 40 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":381}}}],"partialFingerprints":{"codehealthFindingId/v1":"51b6032baf80b5c13c8d4657f6a9b5dbedb93ce362abded794b935374a302ffb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 3): apps/agent_web/src/mcp_sse_handler.erl:167-175 | apps/agent_web/src/mcp_sse_handler.erl:185-194 | apps/agent_web/src/mcp_sse_handler.erl:204-213 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_sse_handler.erl"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"1db9e163e60852e39a6200da747ce91f84c200bdcc1e0f57db43ff130b515b12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): apps/agents/src/agent_tools.erl:164-173 | apps/agents/src/agent_tools.erl:221-230 | sandbox/myapp/apps/myapp/src/agent_tools.erl:122-131 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c6df3c40dae82bd8ff2b548d6eb68348c75b53f018729ebcf6c75d486ad8650"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/mcp_management_handler.erl:60-69 | apps/agent_web/src/mcp_management_handler.erl:95-104 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c7c426d4cc36f961925ec5aed68bff76edec6185844e3d93597069767b6de48"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): apps/agent_web/src/mcp_server.erl:360-369 | apps/agents/src/jina_tools.erl:131-139 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_server.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 62 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"1da6385eebe085fcd0d68b79b42530d4d798fdf36a32f8fc8cf1dcafeee3c4b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/mcp_streamable_http_handler.erl:142-151 | apps/agent_web/src/mcp_streamable_http_handler.erl:240-249 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_streamable_http_handler.erl"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"88003e0f4cf74da57dbc198e84218efe0c608f4f1a1c21a22c8199f17e76042b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): apps/agent_web/src/pdf_processing_integration.erl:82-91 | apps/agent_web/src/pdf_processing_integration.erl:107-115 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pdf_processing_integration.erl"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa2ac1381dca139f65bc5dcc00686761ae177b81a225e1e4628aae4f28a22fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): apps/agent_web/src/stats_control_handler.erl:11-19 | apps/agent_web/src/stats_control_handler.erl:46-55 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/stats_control_handler.erl"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3a2cce4a4841d74a56ba23caeb6c7637e87d1b808e60e82bd21b7e9fe3c9969"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/super_agent_handler.erl:56-65 | apps/agent_web/src/super_agent_handler.erl:89-98 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/super_agent_handler.erl"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"82eb82159fddc1d0b8580cca2abcf1507ab72a69f67376a8529b8fd4c1debbee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/training_data_generator.erl:156-165 | apps/agents/src/agent_tools.erl:2986-2995 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/training_data_generator.erl"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"56524ce0373c5bb0706fe6277c7c0fa8bfc8e60849b85364a66bed206ca13c47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agents/src/agent_registry.erl:115-124 | sandbox/myapp/apps/myapp/src/agent_registry.erl:112-121 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_registry.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_registry.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_registry.erl"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"95be03396afe57285200a99c8f1c7673711fbf8df43701e3080eae637d0e837e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agents/src/agent_tools.erl:971-980 | sandbox/myapp/apps/myapp/src/agent_tools.erl:218-227 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":971}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be4ab86ad63ed9d766ff2615d4adc2dc6dee007d7ae09ef8745adbc112a6584"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): apps/agents/src/agent_tools.erl:2838-2845 | apps/agents/src/agent_tools.erl:2925-2934 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":2838}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0cf96d2406b4b8b19d5d897d4b8a756138a592c7df1fbf8a206bbb3956cbd05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u201310 lines \u00D7 2): apps/agents/src/quantum_consciousness_engine.erl:537-544 | apps/agents/src/quantum_consciousness_engine.erl:548-557 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_consciousness_engine.erl"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"776e8e17a77d9c203b0eac08108ec514cb463569bdb875fffa9783498a480d2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/openai/src/openai_chat.erl:173-182 | apps/openai/src/openai_chat.erl:301-310 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b761e20198f1e55d555778b89eea94d401067d731f76195c5f59029480d6213"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/openai/src/openai_clients_sup.erl:23-32 | apps/openai/src/openai_sup.erl:25-34 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_clients_sup.erl"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"6927b28fff7b6575e69244c5d381565d1a7aaaf3f11c0d8396a7bed212f55e22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/openai/src/token_stream_integration.erl:290-299 | apps/openai/src/token_stream_integration.erl:316-325 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_integration.erl"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1233a88881d6d84d72c7f9ba5db06525d28f2ee2e699710f0cf42d08a6b0a81"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 8): apps/agent_web/src/agent_api_handler.erl:239-247 | apps/agent_web/src/workflow_api_handler.erl:112-120 | apps/agent_web/src/workflow_api_handler.erl:157-165 | apps/agent_web/src/workflow_api_handler.erl:193-201 | apps/agent_web/src/workflow_api_handler.erl:240-248 | apps/agent_web/src/workflow_api_handler.erl:296-304 | apps/agent_web/src/workflow_api_handler.erl:351-359 | apps/agent_web/src/workflow_api_handler.erl:375-383 \u2014 there are 8 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 8 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73530204481dffbcfa22d566d1a26ef4d78dde5ed45d21268ecf0a6db9f13a0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 4): apps/agent_web/src/mcp_sse_handler.erl:150-157 | apps/agent_web/src/mcp_sse_handler.erl:167-175 | apps/agent_web/src/mcp_sse_handler.erl:185-193 | apps/agent_web/src/mcp_sse_handler.erl:204-212 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_sse_handler.erl"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"240a78126471648160d695937400a02dec29632095f36e35d4dfd0c52967bb4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): apps/agents/src/simple_agent.erl:49-57 | apps/agents/src/simple_agent.erl:76-84 | sandbox/myapp/apps/myapp/src/simple_agent.erl:38-46 | sandbox/myapp/apps/myapp/src/simple_agent.erl:65-73 \u2014 before extracting anything, compare \u0060apps/agents/src/simple_agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/simple_agent.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 59 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/simple_agent.erl"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"74a646878ccffe1fff84c84493cecffcd532a84764d756084ca1a907c9452974"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:234-242 | apps/agent_web/src/neural_swarm_api_handler.erl:215-223 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c197561399b957cbb4ebbeeffc425773161c86f2c81d8a506b682399a55471"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/embedding_integration.erl:530-538 | apps/agent_web/src/hyper_graph_storage.erl:685-693 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"29c2a7a118a1819e136ad772ca5b079e4eb351e7bcce8569e09eb9a5f6847782"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/endpoint_registry.erl:296-304 | apps/agent_web/src/endpoint_registry.erl:308-316 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/endpoint_registry.erl"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f79eeedb632a12bdf89538e90ba1bd8bbcfa8819ca34aef7958c76ec837353"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/mcp_agent_integration.erl:68-76 | apps/agent_web/src/mcp_agent_integration.erl:82-90 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_agent_integration.erl"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"9864c4aa8802da7b036d6371249287732c653efe5637f30ee32ed8b3d2e8a0f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): apps/agent_web/src/mcp_client_v2.erl:393-400 | apps/agent_web/src/mcp_transport.erl:213-221 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_client_v2.erl\u0060 and \u0060apps/agent_web/src/mcp_transport.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a539c276dc08edbd7ed9ca896a4a399bfbe86e1960f44c9bdd89e761c8bc05b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/mcp_streamable_http_handler.erl:245-253 | apps/agent_web/src/mcp_transport_streamable_http.erl:369-377 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_streamable_http_handler.erl"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2d8705bd1a3508d1d563306e9aefd23ae2b99e776c811bd0cea13bee0146e7b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/model_api_handler.erl:240-248 | apps/agent_web/src/model_api_handler.erl:311-319 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"a310f2596d5ef5170bbd7619d59d8271f27d46db4ccbd7b1273225b241a4bb98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/pipedream_mcp_client.erl:146-154 | apps/agent_web/src/pipedream_mcp_client.erl:185-193 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"737a4135e363e0e8d5d953be506fa4fbbeceb62d8d7573a300ab17f12345e8cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agents/src/agent_registry.erl:101-109 | sandbox/myapp/apps/myapp/src/agent_registry.erl:98-106 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_registry.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_registry.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_registry.erl"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7fd06d7c83c63801a712411580b85d4466f81be79077e5e9bd01a865a873900"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agents/src/agent_tools.erl:1851-1859 | apps/agents/src/agent_tools.erl:1891-1899 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1851}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe87f174b5428a8bfd5eb8d82fed8d8138608f1ff24eba1ef1b697471178641"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agents/src/jina_tools.erl:18-26 | apps/agents/src/jina_tools.erl:54-62 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0158e01b9b62c6c99fb5cde0744f9f2a4061d7cc627ab6192f873dbe10385ca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agents/src/streaming_function_handler.erl:561-569 | apps/openai/src/json_serializer.erl:74-82 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/streaming_function_handler.erl"},"region":{"startLine":561}}}],"partialFingerprints":{"codehealthFindingId/v1":"62179aa4695a016957808a3ec84d03461ce82af3d1ad9eae12769a44390289de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/openai/src/openai_chat.erl:360-368 | apps/openai/src/openai_responses.erl:547-555 \u2014 before extracting anything, compare \u0060apps/openai/src/openai_chat.erl\u0060 and \u0060apps/openai/src/openai_responses.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c9318900c4eebebdc76eba065692a02988bbf7a2120b2125d33abd2fb511c6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/openapi_scaffold/src/openapi_graphql_bridge.erl:235-243 | apps/openapi_scaffold/src/openapi_graphql_bridge.erl:463-471 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_graphql_bridge.erl"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1585f296c04def7f6085cee5f95f26c2b53163bd20108ce1effe45b696d7ea2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/openapi_scaffold/src/openapi_graphql_bridge.erl:513-521 | apps/openapi_scaffold/src/openapi_graphql_bridge.erl:531-539 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_graphql_bridge.erl"},"region":{"startLine":513}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce854ddb1452cc2ef2c7000627bc9492f85bd28a9f10f1ba19f683c077f0630"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 7): apps/agent_web/src/consciousness_bridge_api_handler.erl:124-131 | apps/agent_web/src/consciousness_bridge_api_handler.erl:175-182 | apps/agent_web/src/consciousness_bridge_api_handler.erl:202-209 | apps/agent_web/src/consciousness_bridge_api_handler.erl:231-238 | apps/agent_web/src/neural_swarm_api_handler.erl:112-119 | apps/agent_web/src/neural_swarm_api_handler.erl:163-170 | apps/agent_web/src/neural_swarm_api_handler.erl:212-219 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cbfbe495923de342ae6cb28498b659774df8a8d5d8746cd2def6ceaf2dce1ec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 5): apps/agent_web/src/agent_monitoring_handler.erl:40-47 | apps/agent_web/src/knowledge_base_handler.erl:16-23 | apps/agent_web/src/knowledge_base_handler.erl:69-76 | apps/agent_web/src/knowledge_base_handler.erl:161-168 | apps/agent_web/src/knowledge_base_handler.erl:179-186 \u2014 there are 5 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 5 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_monitoring_handler.erl"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f45cde26ac807798fbcead6dcd42150ffd011e6a2cb73e82daaccdee3d29b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): apps/agent_web/src/agent_communication_handler.erl:28-35 | apps/agent_web/src/agent_communication_handler.erl:53-60 | apps/agent_web/src/agent_quorum_handler.erl:25-32 | apps/agent_web/src/agent_quorum_handler.erl:50-57 \u2014 before extracting anything, compare \u0060apps/agent_web/src/agent_communication_handler.erl\u0060 and \u0060apps/agent_web/src/agent_quorum_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_communication_handler.erl"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac5cdf655c4e770f6a9db2a1ebb8d8688237b4cd5b29b241341f6e5c8e15885"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): apps/agent_web/src/model_api_handler.erl:119-126 | apps/agent_web/src/model_api_handler.erl:244-251 | apps/agent_web/src/model_api_handler.erl:315-322 | apps/agent_web/src/model_api_handler.erl:509-516 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"adc16708373871f7fdcd144c721e09f35504ced44bb0fa9d71ee1efbf7d96754"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): apps/agents/src/agent_tools.erl:1852-1859 | apps/agents/src/agent_tools.erl:1892-1899 | apps/agents/src/jina_tools.erl:19-26 | apps/agents/src/jina_tools.erl:55-62 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1852}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec13d511e2cae30926de1a7ce4070a4fc55908f17dbbb4cc4a97484d54d29f2b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): apps/agent_web/src/mcp_orchestration_handler.erl:19-26 | apps/agent_web/src/mcp_orchestration_handler.erl:32-39 | apps/agent_web/src/mcp_orchestration_handler.erl:173-180 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_orchestration_handler.erl"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c35f3d8efa800cfd55f4dcdc33f4843984acc0b62cdbcbe46acccaa38e70af0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): apps/agent_web/src/pipedream_api_handler.erl:47-54 | apps/agent_web/src/pipedream_api_handler.erl:90-97 | apps/agent_web/src/pipedream_api_handler.erl:119-126 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_api_handler.erl"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"80cce4cb3a681b5dc65ad49d8cd4011b7e84ef5fed99c313b974f4857fcf9059"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/colored_logger_handler.erl:156-163 | apps/agent_web/src/simple_logger.erl:56-63 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/colored_logger_handler.erl"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c915199d5c35e2a50f0a152d5421cc4f4306bed5868aeef8ae73078cfe0d4a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:38-45 | apps/agent_web/src/neural_swarm_api_handler.erl:38-45 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":38}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ec08ca71b05052123df6e0c8108cf85e871266736206b56ceec8862e7aab7f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/conversation_handler.erl:144-151 | apps/agent_web/src/conversation_handler.erl:204-211 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a42cb73a11953424c4fde509dc0979d8baffb0e9845644508d47340a47f10aa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/mcp_cli.erl:287-294 | apps/agent_web/src/mcp_cli.erl:300-307 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ce94f31a95950fb05fffadbdf8d00f74758405262447d0d4a95e43e0bca0d83"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/mcp_oauth_handler.erl:73-80 | apps/agent_web/src/mcp_oauth_handler.erl:148-155 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_handler.erl"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbdf19e6c0e5e14744e7166cd0e732a210c4782805f1c9564965d31da14db7d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/ssl_cert_handler.erl:25-32 | apps/agent_web/src/system_health_handler.erl:15-22 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ssl_cert_handler.erl"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d98e3cb4117cb7d90f974d9573a62171610cc60b4a7545f446f665ce9dad3e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_discovery.erl:353-360 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:369-376 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"3088da44eac4929351fe4432e59c09b77911ea1d4c3d44a6e18f3f7a28de714d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_tools.erl:1976-1983 | apps/agents/src/jina_tools.erl:131-138 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1976}}}],"partialFingerprints":{"codehealthFindingId/v1":"939e056a8227188e520e075b51e947d825cd29d51084b7ccb8e4aa03b2ff6c84"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_tools.erl:1997-2004 | apps/agents/src/jina_tools.erl:257-264 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1997}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dae0c1d2eae74707d46df749883b05e779a317cade90b728840c1ed7f4abfd9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_tools.erl:2022-2029 | apps/agents/src/jina_tools.erl:151-158 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060apps/agents/src/jina_tools.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 201 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":2022}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6cafe2b185fe82fc4286fbbc93cf98c4ce33420fbee4a7bffdb643cbd6ae95"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 11): apps/agent_web/src/examples_handler.erl:88-94 | apps/agent_web/src/examples_handler.erl:99-105 | apps/agent_web/src/examples_handler.erl:110-116 | apps/agent_web/src/examples_handler.erl:121-127 | apps/agent_web/src/examples_handler.erl:132-138 | apps/agent_web/src/examples_handler.erl:143-149 | apps/agent_web/src/examples_handler.erl:154-160 | apps/agent_web/src/examples_handler.erl:165-171 | apps/agent_web/src/examples_handler.erl:176-182 | apps/agent_web/src/examples_handler.erl:187-193 | apps/agent_web/src/examples_handler.erl:198-204 \u2014 all 11 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/examples_handler.erl"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f276f03f9f4e2f40213e66e3855e537a5b775fa0d6945241e0b1652d35a336e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 6): apps/agent_web/src/agent_monitoring_handler.erl:39-45 | apps/agent_web/src/knowledge_base_handler.erl:15-21 | apps/agent_web/src/knowledge_base_handler.erl:44-50 | apps/agent_web/src/knowledge_base_handler.erl:68-74 | apps/agent_web/src/knowledge_base_handler.erl:160-166 | apps/agent_web/src/knowledge_base_handler.erl:178-184 \u2014 there are 6 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_monitoring_handler.erl"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddafca86cf1a2ff92f5ae66e6149f0b154b11f2958bf45842a859529261e00e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5): apps/agent_web/src/model_api_handler.erl:203-209 | apps/agent_web/src/model_api_handler.erl:281-287 | apps/agent_web/src/model_api_handler.erl:335-341 | apps/agent_web/src/model_api_handler.erl:484-490 | apps/agent_web/src/model_api_handler.erl:529-535 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f2529973a89d20f3d5864b0d9c6d329cf1673d6eb18e182b3c3fc95f9d0919c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): apps/agent_web/src/ai_error_interpreter.erl:419-425 | apps/agent_web/src/crash_report_api_handler.erl:232-238 | apps/agent_web/src/crash_report_ws_handler.erl:206-212 \u2014 before extracting anything, compare \u0060apps/agent_web/src/crash_report_api_handler.erl\u0060 and \u0060apps/agent_web/src/crash_report_ws_handler.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 51 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"e258ee6b683d249322295d9b2eaa2b40d4d4ec89ef04e5ef9164b5643281730c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): apps/agent_web/src/consciousness_bridge_api_handler.erl:151-157 | apps/agent_web/src/neural_swarm_api_handler.erl:138-144 | apps/agent_web/src/neural_swarm_api_handler.erl:189-195 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbd75a2d31fea61fc8eef147ac313158c9ed9867b5916fc300ae4f9a6f7ba94f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:49-55 | apps/agent_web/src/agent_scheduling_handler.erl:259-265 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6ce4605b44aec5ddb72728e62bb0147f1768956e8c699429b665466149d6b5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/ai_error_interpreter.erl:139-145 | apps/agent_web/src/crash_report_processor.erl:171-177 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d3e8646b587fd072855baace7629faec811fc4cd88264c220ee4743cd145ef7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/bulk_operations_handler.erl:226-234 | apps/agent_web/src/bulk_operations_handler.erl:278-284 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"3181cd0e035c0d8e15e1f9d48209a5250759d5b1da950d44c0f4d937925ed32b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/crash_report_api_handler.erl:188-194 | apps/agent_web/src/crash_report_ws_handler.erl:162-168 \u2014 before extracting anything, compare \u0060apps/agent_web/src/crash_report_api_handler.erl\u0060 and \u0060apps/agent_web/src/crash_report_ws_handler.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 51 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"606ebfa9333bcca1730242d0838765057ec8bbb1ab980839cd0e4504f1de6aa5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): apps/agent_web/src/mcp_advanced_config.erl:89-94 | apps/agent_web/src/mcp_advanced_config.erl:106-112 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_config.erl"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf99de7eb832a75c33a827636fb6691d9188d272e4372a570cb27c62a0c3e7b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/mcp_cli.erl:260-266 | apps/agent_web/src/mcp_cli.erl:273-279 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"67d48ff4e25bebc0880a8fb9e5e2d7084fd6462a143e2bfe7b895171c1011c4d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/mcp_cli.erl:316-322 | apps/agent_web/src/mcp_cli.erl:329-335 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eeaf5b4c52986e31b0b3318403a39cca4922ceb56db9026ca3dc3017f2dff44"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/super_agent_handler.erl:66-72 | apps/agent_web/src/super_agent_handler.erl:93-99 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/super_agent_handler.erl"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"8734ab222946aac9deba19ce79ffec14d0fc5701748e5c3f0d6b3e8db427b924"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agents/src/agent_tools.erl:1343-1349 | sandbox/myapp/apps/myapp/src/agent_tools.erl:284-290 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_tools.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_tools.erl\u0060 as WHOLE FILES: this scan already matched 11 separate duplicated blocks between them, totalling at least 223 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1343}}}],"partialFingerprints":{"codehealthFindingId/v1":"831b207e3b0f76cb54acc2de65c3dc35f4aefff7f9ad31e627d1fa16c105a97e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/openai/src/openai_chat.erl:352-358 | apps/openai/src/openai_responses.erl:277-283 \u2014 before extracting anything, compare \u0060apps/openai/src/openai_chat.erl\u0060 and \u0060apps/openai/src/openai_responses.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"51383fc4e50aea910e4211eeb3980b2918b2b9a41c2ad30dedafa6aedc8e7429"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/openai/src/openai_chat.erl:398-404 | apps/openai/src/openai_responses.erl:589-595 \u2014 before extracting anything, compare \u0060apps/openai/src/openai_chat.erl\u0060 and \u0060apps/openai/src/openai_responses.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"d75754e42fc87c08a8fffda2a3d953e2767affe75133ae7055899825d6b6adb7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/openai/src/openai_files.erl:190-196 | apps/openai/src/openai_responses.erl:181-187 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f81e8cb930f2e5bd3da95974367bfaa25f717b92a8817624826593e110e4485"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/openapi_scaffold/src/openapi_proxy.erl:246-252 | apps/openapi_scaffold/src/openapi_validator.erl:446-452 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_proxy.erl"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c3a4d3b2a413fafd97a375d9be4bbf0cedcbcb7e2f7ff2b5058c5c33ddf3132"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5\u20136 lines \u00D7 5): apps/agent_web/src/mcp_api_handler.erl:31-35 | apps/agent_web/src/mcp_api_handler.erl:64-69 | apps/agent_web/src/mcp_api_handler.erl:80-84 | apps/agent_web/src/mcp_api_handler.erl:113-117 | apps/agent_web/src/mcp_api_handler.erl:167-171 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"91ce7e1129cf29d0223c978b014f7743db2ed7c612e9fd7613c138afaafca05b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): apps/agent_web/src/agent_communication_handler.erl:22-27 | apps/agent_web/src/agent_communication_handler.erl:47-52 | apps/agent_web/src/agent_quorum_handler.erl:19-24 | apps/agent_web/src/agent_quorum_handler.erl:44-49 \u2014 before extracting anything, compare \u0060apps/agent_web/src/agent_communication_handler.erl\u0060 and \u0060apps/agent_web/src/agent_quorum_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 37 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_communication_handler.erl"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"0516196e9fac58a44c25e2fcfd24557bc5cc17baa8fbc1841d7f4ca7db48a6eb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): apps/agent_web/src/mcp_cli.erl:259-264 | apps/agent_web/src/mcp_cli.erl:272-277 | apps/agent_web/src/mcp_cli.erl:315-320 | apps/agent_web/src/mcp_cli.erl:328-333 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_cli.erl"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"f514ba7c6cf54361843d3ccaaf06eb5598a32ea6d197bb662a4c95d09835ead6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): apps/agent_web/src/agent_scheduling_handler.erl:404-409 | apps/agents/src/agent_scheduler_engine.erl:352-357 | apps/agents/src/agent_temporal_awareness.erl:514-519 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e4152fa8cdf20d9e6e1a88639bb3beb8ec51248cef7878330a40c2456a08ed3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/claude_config_handler.erl:23-28 | apps/agent_web/src/oauth_handler.erl:169-174 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/claude_config_handler.erl"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b00f0432bceaaf66524a60b5514d686a9c00ac34b2cb864b5520d8df2073879"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:80-85 | apps/agent_web/src/neural_swarm_api_handler.erl:66-71 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c9bbff382f44fa89d95e5d242dc758d1558cda6474bbe3c7ba383be52ddfbf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/hot_code_reloader.erl:176-181 | apps/agent_web/src/hot_code_reloader.erl:195-200 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/hot_code_reloader.erl"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"60da5c53f3b1bb71930a40deafef1f96aa7973a0a7c4f9cf219c115dfd35e24f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/mcp_advanced_config.erl:58-63 | apps/agent_web/src/mcp_advanced_config.erl:86-91 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_config.erl"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbe5ba7d8c1dfff3088e6063fe77425f2c9ae08efcc409ee4a1daed0ca5a4fd3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/mcp_api_handler.erl:52-57 | apps/agent_web/src/mcp_api_handler.erl:131-136 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fababa3b3a1887354cb506b53006f76a86e3a0e985ea3660af158549b106e4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/mcp_api_handler.erl:218-223 | apps/agent_web/src/mcp_api_handler.erl:232-237 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"a15b34a01679da62b236ed0c6db71c388f3be403e212b62aa3e0f9ddb27357d5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/pipedream_mcp_client.erl:228-233 | apps/agent_web/src/pipedream_mcp_client.erl:266-271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"1041a12349380710c14a96f1f15078e68274ea64a05da382f4c7474b4031afa4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5\u20136 lines \u00D7 2): apps/agent_web/src/quantum_performance_analyzer.erl:170-174 | apps/agent_web/src/quantum_performance_analyzer.erl:354-359 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/quantum_performance_analyzer.erl"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f9869027a69d9bac6dc86ee62d95d118dac428ce542efeefe8c7081716c5eb5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent.erl:641-646 | sandbox/myapp/apps/myapp/src/agent.erl:224-229 \u2014 before extracting anything, compare \u0060apps/agents/src/agent.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent.erl\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 154 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc319bdf9b8572a68d0be3f9fd10b8a75571f948faa753d333bb3bbd56dc53c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent_collaboration.erl:218-223 | apps/agents/src/agent_collaboration.erl:239-244 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_collaboration.erl"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef0261ae916bbc1b17c063048a1753cb20f556da39ae90bb866515de34f24735"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent_registry.erl:78-83 | sandbox/myapp/apps/myapp/src/agent_registry.erl:71-76 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_registry.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_registry.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 36 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_registry.erl"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b5d69d3b8234980761b439ec42825e66b555fe9091c8af00b93a67aef1918a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent_tool_registry.erl:124-129 | apps/agents/src/agent_tool_registry.erl:154-159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tool_registry.erl"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"489fe8e83d03539bea74905e74185b5a31a5d64e05ce622a5d763546b3de894d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/specialized_agent_factory.erl:664-669 | apps/agents/src/specialized_agent_templates.erl:856-861 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/specialized_agent_factory.erl"},"region":{"startLine":664}}}],"partialFingerprints":{"codehealthFindingId/v1":"0beaaa82aed344c562ba75f36ac286dcf44b8d6a21179cf84e7dfcb4b35b88c1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:118-123 | apps/openai/src/openai_client_template.erl:114-119 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c63a69abaa1b4032cdc04ca4c15399de1bea8548fa5a668c72a38e3b7e2bab4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/openai/src/openai_files.erl:301-306 | apps/openai/src/openai_files.erl:333-338 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0d0746a3ee00cc31586fa5e7f19a226e71cd0b1cc23f693f3a34caafe1e4622"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): apps/openapi_scaffold/src/openapi_advanced_codegen.erl:239-243 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:366-370 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:629-633 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:924-928 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_advanced_codegen.erl"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5717946de32a42034a4a20bfc6970866af0b3b37de0988513abfa4a39aa2750"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): apps/agent_web/src/conversation_handler.erl:114-118 | apps/agent_web/src/conversation_handler.erl:150-154 | apps/agent_web/src/conversation_handler.erl:210-214 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"419dea398f4839ce52b1dc6753101e07f1dcd98ae310133da58e4cfe84b6685a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (3\u20135 lines \u00D7 3): apps/agent_web/src/ai_error_interpreter.erl:101-105 | apps/agent_web/src/ai_timeout_analyzer.erl:143-147 | apps/agent_web/src/crash_report_processor.erl:120-122 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 3 call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e8f2fcb73f3cd4c63557c68c409bdd2520d49d9a8461cb7f462640253571d10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:60-64 | apps/agent_web/src/consciousness_bridge_api_handler.erl:74-78 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"69f27c3027cbddb768baaf4356ca746801300b0667637a0e86fdade6783588de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:65-69 | apps/agent_web/src/consciousness_bridge_api_handler.erl:79-83 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"c11300251a0335575d0763c31002ed4256776f3132d3d88b15ffe5ebad5d0553"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/conversation_handler.erl:324-328 | apps/agent_web/src/conversation_initializer.erl:91-95 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"26725c3fa8b4a9d3ae6bed4af97113a4845cbd4f42147dedde2ad5f4daf629e1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/embedding_integration.erl:155-159 | apps/agent_web/src/embedding_integration.erl:290-294 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"55600b077f382297a5678c0a8b841f138c31266200b68fa16c2e5067a4c562c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/endpoint_registry.erl:237-241 | apps/agent_web/src/endpoint_registry_ets.erl:174-178 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/endpoint_registry.erl"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1372f7e8cc5019a31aa9d621db17e73b37bebc87477a1f43bdde7e6339126b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/mcp_oauth_client.erl:267-271 | apps/agent_web/src/mcp_oauth_client.erl:298-302 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8545bf03292b50c623d2b959ed31137ca9b17144241c25f6c516dc985960e66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/model_definition_manager.erl:213-217 | apps/agent_web/src/model_definition_manager.erl:352-356 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_definition_manager.erl"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"70c2a3389d429e203e20e1ea9826eb46128ed49842cea687ff4bc5d6d901ae7a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/model_definition_manager.erl:218-222 | apps/agent_web/src/model_definition_manager.erl:357-361 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_definition_manager.erl"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"df33bf6bdcc64cbe199e60227dd92b9d52d355994a5b36ffcace5813177d76af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/pipedream_auth_handler.erl:101-106 | apps/agent_web/src/pipedream_auth_handler.erl:187-191 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_auth_handler.erl"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dbaf36385202409e4bad2bb279e0dfc6219a86192545fecb717f9b22a03407c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/quantum_performance_analyzer.erl:365-369 | apps/agent_web/src/quantum_performance_analyzer.erl:562-566 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/quantum_performance_analyzer.erl"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"7011aa6113a8f32b47bb83b21a1435f6692f6087da24151ac6b3b0be91a77931"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/training_data_generator.erl:151-155 | apps/agents/src/agent_tools.erl:2981-2985 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/training_data_generator.erl"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a3769f6dcd6bef10b995c2880343ac56ae26eec00fb501e99a1c020ad81d356"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_instance.erl:1285-1289 | apps/agents/src/agent_instance.erl:1478-1482 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":1285}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40a27303ee30bf9e63f37d1010ea209089772e8dc22a1a18f389db4e9a28286"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_instance.erl:1764-1768 | apps/agents/src/agent_instance.erl:1773-1777 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":1764}}}],"partialFingerprints":{"codehealthFindingId/v1":"9abe65fd653484bfa79fed98a2a660061d01a7457ea24ce80cb3cdb4ae32d4a8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/bulk_agent_creator.erl:224-228 | apps/agents/src/specialized_agent_templates.erl:1189-1193 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/bulk_agent_creator.erl"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a25aa2e81ebc301b14f3a17def406a418f565c6eb812ce91defa07939f3efb7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/subgoal_decomposition_engine.erl:264-268 | apps/agents/src/subgoal_decomposition_engine.erl:310-314 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/subgoal_decomposition_engine.erl"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d8fd5f3859747d3b5a80bcc87637072f7d2281df61c0a05f0ab14c31fb34291"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2): apps/agents/src/quantum_consciousness_engine.erl:176-210 | apps/agents/src/temporal_meta_analyzer.erl:180-214 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/quantum_consciousness_engine.erl"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e290777fe1f716b6d260ddab364d4d5a2211f45331103b91e34c37805f4dcca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/agent_api_handler.erl:420-424 | apps/agent_web/src/agent_initializer.erl:18-22 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":420}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5efa4660e175da9f19b7feaa5a5bf3623cf1970ad6668996cf936056e933a6f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/conversation_handler.erl:334-339 | apps/agent_web/src/conversation_initializer.erl:101-106 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"9234587dc0decef412f4bcbd5a655e24d4df12fdb5b150aa487415153b77de19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/crash_report_api_handler.erl:348-352 | apps/agent_web/src/error_interpretation_api_handler.erl:123-127 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee1008460a6efdb1ed4b567dc5defd6218f9545887358ec3712fb2904b372098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agents/src/agent_discovery.erl:123-131 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:129-137 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8d8fe53ef64f12cd729d7c78a0b4a6f19e223a0e0a9ac9c36e010637f792750"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agents/src/agent_discovery.erl:339-345 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:355-361 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b4621461c91a66571455563cf86faaa6bd929891ec8cb2c843002dc11997d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agents/src/agent_discovery.erl:458-468 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:474-484 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":458}}}],"partialFingerprints":{"codehealthFindingId/v1":"5529db4a51e467fc3aa52c63e9c2d12e33c20966e050bb160cafe7c50a944a0f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_protocol.erl:49-56 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:56-63 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a2cdb6053109640bcbfdbb020a8fe041941ad036bf5cd6dbda23f5f31672ad8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_protocol.erl:76-80 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:83-87 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"415e2da7bc426ea3cbc5d2341675ce38489bdb08cefdbe532f4fbbb143006ffa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_protocol.erl:96-100 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:103-107 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"77feb67d785696bb223b957a21fa045d771b84b23fd61551e57fa6abe7fa5018"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agents/src/agent_protocol.erl:203-210 | sandbox/myapp/apps/myapp/src/agent_protocol.erl:210-217 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_protocol.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_protocol.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 71 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_protocol.erl"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"b41ec0a28029020be2da4ea3066e92849924069b60e9861c45048e445575db74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/openapi_scaffold/src/openapi_dynamic_handler.erl:239-244 | apps/openapi_scaffold/src/openapi_introspection_handler.erl:74-79 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_dynamic_handler.erl"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"f258e732b71b8323309182fbe37ce282f59e243eb397f14fc4c7cb09c1844b51"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/openapi_scaffold/src/openapi_scaffold_sup.erl:10-17 | sandbox/myapp/apps/myapp/src/agent.erl:116-127 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_scaffold_sup.erl"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"b037251f3844f0dc8a96c2c25e2c8c757c71464ea4c439d0ffc0fe052c47fa12"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/ai_error_processor.erl:215-220 | apps/agents/src/super_agent.erl:546-551 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_processor.erl"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fad0108cedfb082e63fd6a7c19835c4618b290af875eec50fefa6fde1e7fbe3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/conversation_handler.erl:346-354 | apps/agent_web/src/timeline_handler.erl:284-292 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"7805b6dfa64346052618e26303ab189727cc8ce4b0de43209551a8ae564fb9d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/crash_report_api_handler.erl:209-218 | apps/agent_web/src/crash_report_ws_handler.erl:183-192 \u2014 before extracting anything, compare \u0060apps/agent_web/src/crash_report_api_handler.erl\u0060 and \u0060apps/agent_web/src/crash_report_ws_handler.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 51 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"9252bdb9db342e84ab2fc6a86434b6a305e8e9516c6db47e5fc3df26bea4c05e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/crash_report_api_handler.erl:220-230 | apps/agent_web/src/crash_report_ws_handler.erl:194-204 \u2014 before extracting anything, compare \u0060apps/agent_web/src/crash_report_api_handler.erl\u0060 and \u0060apps/agent_web/src/crash_report_ws_handler.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 51 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7421244ca51a85c9396e02c9a19964c05247a3c3e1921eddec1d851e4f775af"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): apps/agent_web/src/mcp_streamable_http_handler.erl:400-409 | apps/agent_web/src/mcp_transport_streamable_http.erl:230-239 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_streamable_http_handler.erl"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4aba9e18f659562f123380211f1c745f7d975402b2d648b35632c16110277e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/mcp_streamable_http_handler.erl:590-594 | apps/agent_web/src/mcp_transport_streamable_http.erl:575-579 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_streamable_http_handler.erl"},"region":{"startLine":590}}}],"partialFingerprints":{"codehealthFindingId/v1":"123a8d71f812638aa4a420509cc837258d0fd2adb0334f97a7a2473e63386029"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/pagination_utils.erl:159-166 | apps/agents/src/agent_quorum.erl:276-283 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pagination_utils.erl"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bcb3046c0c8d9d90a11d32a3653f94d46709f88bcf5debc286f332d5617101"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_communication_api.erl:190-195 | apps/agents/src/agent_tool_registry.erl:417-421 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_communication_api.erl"},"region":{"startLine":190}}}],"partialFingerprints":{"codehealthFindingId/v1":"596233567107fed8b1e695cab2de6a18c4f32b997e09101703d4a2eb8637bcf8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/distributed_consciousness_engine.erl:644-649 | apps/agents/src/emergent_swarm_intelligence.erl:1170-1175 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/distributed_consciousness_engine.erl"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"6835c801a3b8e82e4c6b00cab83e828a5817fbdfa45db7b87974c2daa6744731"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:44-61 | apps/openai/src/openai_client_template.erl:42-59 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eef9f79fc0bdc81e10f7c9228d4a516cd552fd0d3e5444c859bca7f678ec552"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): apps/agent_web/src/mcp_health_handler.erl:93-106 | apps/agent_web/src/mcp_health_handler.erl:161-174 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_health_handler.erl"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"504e94e8593663e218965a138715281c5efd6d017d3e93f6f56d26d2ae3cf8d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): apps/openapi_scaffold/src/openapi_validator.erl:131-143 | apps/openapi_scaffold/src/openapi_validator.erl:178-190 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_validator.erl"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"bef986e2e0f4dc0f1a19260960a2cbc358c3cd7b2cd472a242647087021531bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): apps/openai/src/token_stream_integration.erl:65-76 | apps/openai/src/token_stream_integration.erl:130-141 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_integration.erl"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f63b855cdb5d5aa1bebc9f3eecb44db815587c53c603b292a63878bf1a426720"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/openai/src/anthropic_client_template.erl:16-26 | apps/openai/src/openai_client_template.erl:14-24 \u2014 before extracting anything, compare \u0060apps/openai/src/anthropic_client_template.erl\u0060 and \u0060apps/openai/src/openai_client_template.erl\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 84 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/anthropic_client_template.erl"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"cba2e521cf4a1aaef573a00c214582867f6c70f6fd25ad7385ee13c817836837"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/agent_web/src/mcp_management_handler.erl:335-345 | apps/agent_web/src/mcp_management_handler.erl:351-361 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"18009ca14b70834342b5ab498abaade43f20eb563d92e2ffee777442c7ccd3f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): apps/openapi_scaffold/src/openapi_validator.erl:149-159 | apps/openapi_scaffold/src/openapi_validator.erl:196-206 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_validator.erl"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d922b3a8987eca2769e46f229d5968713768599f8b2dbaeb713d945135424513"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): apps/agent_web/src/ai_error_interpreter.erl:169-178 | apps/agent_web/src/ai_error_interpreter.erl:207-216 | apps/agent_web/src/ai_timeout_analyzer.erl:266-275 | apps/agent_web/src/ai_timeout_analyzer.erl:502-511 | apps/agent_web/src/crash_ai_analyzer.erl:98-107 | apps/agent_web/src/crash_ai_analyzer.erl:167-176 \u2014 there are 6 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"68265750c84a95fb02b7f3e26ebd724b2da5030d8568143f98005ad66125bb0f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): apps/agent_web/src/mcp_management_handler.erl:64-73 | apps/agent_web/src/mcp_management_handler.erl:99-108 | apps/agent_web/src/mcp_management_handler.erl:146-155 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f003fed391c2813339f6ef778cbf43c2ab158ea400a6d3c853f9f9b4e403473"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): apps/agent_web/src/mcp_server.erl:696-705 | apps/agent_web/src/mcp_server.erl:766-775 | apps/agent_web/src/mcp_server.erl:829-838 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server.erl"},"region":{"startLine":696}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcb4adb7fe80c77190ecd1c2c37e000767e516e484ba395b9050eb60deba12a3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): apps/agent_web/src/mcp_management_handler.erl:176-185 | apps/agent_web/src/mcp_management_handler.erl:242-251 | apps/agent_web/src/mcp_management_handler.erl:279-288 | apps/agent_web/src/mcp_management_handler.erl:316-325 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"8baa6da61c2733796f59dff142d5439ceb4b5f299bf18d5eaa01903e64dead00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/super_agent_handler.erl:254-262 | apps/agent_web/src/super_agent_handler.erl:272-280 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/super_agent_handler.erl"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"259ef2afde76f0cf0b66e5e832851edda2adce7f6e084b95e473c3e0c2de1ce3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): apps/agent_web/src/workflow_api_handler.erl:116-124 | apps/agent_web/src/workflow_api_handler.erl:309-317 | apps/agent_web/src/workflow_api_handler.erl:379-387 | apps/agent_web/src/workflow_api_handler.erl:411-419 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/workflow_api_handler.erl"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ffaec837c732e1aea31b0791c0d93a5d25c25bbc46024fbe7843c99e1b0d8bf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4): apps/agent_web/src/agent_scheduling_handler.erl:136-144 | apps/agent_web/src/agent_scheduling_handler.erl:215-223 | apps/agent_web/src/agent_scheduling_handler.erl:236-244 | apps/agent_web/src/agent_scheduling_handler.erl:278-286 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a58e20f43ed72181e1aed94f74847e31aa186b4c117e220d9935d9c7b9ac28c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/agent_scheduling_handler.erl:47-55 | apps/agent_web/src/agent_scheduling_handler.erl:65-73 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_scheduling_handler.erl"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"78978ded31d1886f39b1fffdf2cbc78f6946ef2b85213638f361ec3dd9a30cce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 6): apps/agent_web/src/consciousness_bridge_api_handler.erl:156-164 | apps/agent_web/src/consciousness_bridge_api_handler.erl:183-191 | apps/agent_web/src/consciousness_bridge_api_handler.erl:210-218 | apps/agent_web/src/neural_swarm_api_handler.erl:143-151 | apps/agent_web/src/neural_swarm_api_handler.erl:171-179 | apps/agent_web/src/neural_swarm_api_handler.erl:194-202 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9fa5b787a792fa064fa1f6cacc4b51ab513b39762e367c22d177fec3ffeb55"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/bulk_operations_handler.erl:30-38 | apps/agent_web/src/workflow_api_handler.erl:31-39 \u2014 before extracting anything, compare \u0060apps/agent_web/src/bulk_operations_handler.erl\u0060 and \u0060apps/agent_web/src/workflow_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e690fccbd435ad80f035896c77cd70ebbf861de7e6afb31e35739cd9b3d43f4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/embedding_integration.erl:272-280 | apps/agent_web/src/embedding_integration.erl:296-304 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ee6933f62f86ce9215eb5b1034f449be5a819af94003aa6aa68bbe66cd36195"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/agent_web/src/logs_api_handler.erl:73-81 | apps/agent_web/src/logs_api_handler.erl:101-109 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/logs_api_handler.erl"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a96544cdb65204438de94eae986dd376bd2fbe3ea5c1d011254550a54398c14"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): apps/openai/src/token_stream_integration.erl:87-95 | apps/openai/src/token_stream_integration.erl:101-109 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/token_stream_integration.erl"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a7cdfea821d9cb0d825944d2f216d710daeb65d62d34bb3171062a1c443e02"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:132-139 | apps/agent_web/src/neural_swarm_api_handler.erl:120-127 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a457c5a09d3716685f5105b7c55012a244b57c9a1e50727f7727d9a41eb79fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/model_api_handler.erl:327-334 | apps/agent_web/src/model_api_handler.erl:521-528 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d0431e58be2795aab3b6bd1bbe6f4d40463b30645affa9efa730ec05cf4ef0b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/model_definition_manager.erl:92-99 | apps/agent_web/src/model_definition_manager.erl:120-127 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_definition_manager.erl"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"015381f5c7f30a488073a0fc08b40a3ee8b98545c074e300d0653c73bc38fcf4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/mcp_client_v2.erl:392-399 | apps/agent_web/src/mcp_transport.erl:154-161 \u2014 before extracting anything, compare \u0060apps/agent_web/src/mcp_client_v2.erl\u0060 and \u0060apps/agent_web/src/mcp_transport.erl\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 31 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be62a58a716d3a270b0e6bd543b1add7c64ab35088c0c1ad51cb1e0f1f70ef8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/mcp_server_handler.erl:149-156 | apps/agent_web/src/mcp_server_handler.erl:227-234 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server_handler.erl"},"region":{"startLine":149}}}],"partialFingerprints":{"codehealthFindingId/v1":"285786be899dae648a39812d0f8752eea99677b86250420fe1bf19cb47d047e9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): apps/agent_web/src/ssl_cert_handler.erl:108-115 | apps/agent_web/src/ssl_cert_handler.erl:135-142 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ssl_cert_handler.erl"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"6979e95d59103b3437d8677fba858104575bc76ae2e8ad95dd6a7c925c5aa960"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/agent_execute_handler.erl:44-50 | apps/agent_web/src/agent_execute_handler.erl:57-63 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_execute_handler.erl"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5767d552189f34b5c7355a5916f7c7662b585ad117953d77fb71754ae02cdf8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/bulk_operations_handler.erl:60-66 | apps/agent_web/src/workflow_api_handler.erl:61-67 \u2014 before extracting anything, compare \u0060apps/agent_web/src/bulk_operations_handler.erl\u0060 and \u0060apps/agent_web/src/workflow_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 41 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"770c79441b4c0dbb07197537acf17ef7f515f78f953c894746187d8ae0f77de2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/openapi_scaffold/src/openapi_validator.erl:124-130 | apps/openapi_scaffold/src/openapi_validator.erl:171-177 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_validator.erl"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"02bf7bcfa1c7a21fc0f300a814f98839fe566725b9876e3493d4be7866545f94"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3): apps/agent_web/src/mcp_server_handler.erl:118-124 | apps/agent_web/src/mcp_server_handler.erl:141-147 | apps/agent_web/src/mcp_server_handler.erl:186-192 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_server_handler.erl"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a8bc917241d43ec887154f3ac9cf761192a00b4695f83f75572a8d3399e8d8f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): apps/agent_web/src/agent_monitoring_handler.erl:62-68 | apps/agent_web/src/examples_handler.erl:15-21 | apps/agent_web/src/knowledge_base_handler.erl:125-131 | apps/agent_web/src/knowledge_base_handler.erl:147-153 \u2014 there are 4 copies across 3 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_monitoring_handler.erl"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cf66a2f9906ccf9f2782f3076cb8035ab48f92fef8ad4702a966f64de7aa4e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/agent_execute_handler.erl:31-37 | apps/agent_web/src/knowledge_base_handler.erl:104-110 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_execute_handler.erl"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f319fc8498f7521acb569b046eec9a2a34d181e3bd76e32cb138da78aeb6488"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/mcp_management_handler.erl:226-232 | apps/agent_web/src/mcp_management_handler.erl:300-306 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ccf925250f0845c0167b73486b913e56b96633fca1b78d729a6a508ab303975"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/fleet_management_handler.erl:14-20 | apps/agent_web/src/fleet_management_handler.erl:79-85 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/fleet_management_handler.erl"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddfd4015dbeda73675e58141952f3f8782f8fce6d678e1772ebca56ccd12bea2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent_instance.erl:930-935 | apps/agents/src/agent_instance.erl:1009-1015 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":930}}}],"partialFingerprints":{"codehealthFindingId/v1":"35ad2c305747678bffb1923cf0b61bf2bc61476bb8c4cae19e8979f1e5f4032b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/model_api_handler.erl:95-101 | apps/agent_web/src/model_api_handler.erl:127-133 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"8386b493f81604656f9d4c7801ee419bda951188f942cdedc176a8cb593b0547"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): apps/agent_web/src/mcp_transport_streamable_http.erl:169-175 | apps/agent_web/src/mcp_transport_streamable_http.erl:188-194 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_transport_streamable_http.erl"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"f456b66b2bebfb88ca020cac2c6f53ff3b1e9beb8852e9c71935ed5f3d830664"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/openai/src/openai_chat.erl:107-112 | apps/openai/src/openai_responses.erl:139-144 \u2014 before extracting anything, compare \u0060apps/openai/src/openai_chat.erl\u0060 and \u0060apps/openai/src/openai_responses.erl\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6b6a19853c463337d7bb8c46869f341173b96d60abfffeedd9a0df0d541c497"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 4): apps/agent_web/src/model_api_handler.erl:69-74 | apps/agent_web/src/model_api_handler.erl:141-146 | apps/agent_web/src/model_api_handler.erl:215-220 | apps/agent_web/src/model_api_handler.erl:293-298 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b61d2f6df9cdd6464b9bf5f3657f92199c7e6e1787f2823db6dc96a71232fb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): apps/agent_web/src/bulk_operations_handler.erl:79-84 | apps/agent_web/src/bulk_operations_handler.erl:226-231 | apps/agent_web/src/bulk_operations_handler.erl:278-282 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/bulk_operations_handler.erl"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca19199c47d6735597921e7ed42e7a15cc593c603c64e0db7f4d93aa249e9797"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agents/src/agent_instance.erl:647-652 | apps/agents/src/agent_instance.erl:731-736 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":647}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15600e1ff3df4a01462039622928646f3622cf7bb5d9f6ed9e22baa93d5dd85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/openapi_scaffold/src/openapi_advanced_codegen.erl:393-398 | apps/openapi_scaffold/src/openapi_advanced_codegen.erl:949-954 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_advanced_codegen.erl"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"6534ee7150f3eec6cdebfc80146687442fe8ddadb1db47d4db68571a6d1b448c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/consciousness_bridge_api_handler.erl:94-98 | apps/agent_web/src/neural_swarm_api_handler.erl:80-84 \u2014 before extracting anything, compare \u0060apps/agent_web/src/consciousness_bridge_api_handler.erl\u0060 and \u0060apps/agent_web/src/neural_swarm_api_handler.erl\u0060 as WHOLE FILES: this scan already matched 9 separate duplicated blocks between them, totalling at least 73 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/consciousness_bridge_api_handler.erl"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"942aa9431a7cb66deb9aa53b2aa0d05c3934c97b8b9fb3f4a608ab94f7094acb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/model_api_handler.erl:35-39 | apps/agent_web/src/model_api_handler.erl:40-44 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/model_api_handler.erl"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ba1d33f8e36801977eae898b6706e23f428190f8cf83a2af039e344e5061956"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/openapi_scaffold/src/openapi_introspection_handler.erl:56-60 | apps/openapi_scaffold/src/openapi_introspection_handler.erl:66-70 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_introspection_handler.erl"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"eff90943e56f403dee316dc45679ad2f75499d6969da58b51f45db48ba1023fe"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/jina_tools.erl:461-465 | apps/agents/src/jina_tools.erl:499-503 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"22aeef37539f065d07b3cf411cd1f8947c8170e986a4050fd075b7879cfc0996"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/mcp_api_handler.erl:106-110 | apps/agent_web/src/mcp_api_handler.erl:128-132 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_api_handler.erl"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7f8d9a20902d99d24710ac91824ed83953c38e8308987ee5930cb92577bfc05"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/mcp_advanced_logger.erl:40-44 | apps/agent_web/src/mcp_registry.erl:38-42 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_advanced_logger.erl"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa6bccd36d64a37c64bee1177427fb8dce53e3462fa00814491a593d09408f59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/ai_error_interpreter.erl:301-305 | apps/agent_web/src/ai_error_interpreter.erl:327-331 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/ai_error_interpreter.erl"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"738b09e30c9bcd94b98964e6a845360cabcef3b1b0df30c897e473ea90eb7801"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/mcp_management_handler.erl:221-225 | apps/agent_web/src/mcp_management_handler.erl:295-299 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_management_handler.erl"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"6033502bce3035326b5efa78ec325a249f08be8d7b1053e051ba2e5b57b75a75"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/jina_tools.erl:726-730 | apps/agents/src/jina_tools.erl:733-737 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"07814a951bd68c1440cb3a1b9676ca5ba07de52fafa006954aa0e51a2a0745e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 4): apps/agent_web/src/conversation_handler.erl:114-118 | apps/agent_web/src/conversation_handler.erl:123-127 | apps/agent_web/src/conversation_handler.erl:150-154 | apps/agent_web/src/conversation_handler.erl:210-214 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/conversation_handler.erl"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a6c56321d93c1fc07a24be477bf888ea8e928a792fdc5d74eeaa6a30ee4c36c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/embedding_integration.erl:432-437 | apps/agent_web/src/embedding_integration.erl:442-447 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"e68e89351c4f7488e0a2847dd7db0029b0269ed6926a1052e3f518eab1b9d482"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): apps/agent_web/src/embedding_integration.erl:473-478 | apps/agent_web/src/hyper_graph_storage.erl:562-567 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":473}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f473644b07817f32eeca5a8434f6aa449b12101b6acae77a6a0cbca83ebdca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agent_web/src/error_log_monitor.erl:113-117 | apps/agent_web/src/realtime_error_handler.erl:91-95 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/error_log_monitor.erl"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"247b5fcd2f86211e54012c7104c6cd31e089748b7dc59969a1ecc276bf1f45b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/agent_discovery.erl:527-531 | sandbox/myapp/apps/myapp/src/agent_discovery.erl:543-547 \u2014 before extracting anything, compare \u0060apps/agents/src/agent_discovery.erl\u0060 and \u0060sandbox/myapp/apps/myapp/src/agent_discovery.erl\u0060 as WHOLE FILES: this scan already matched 13 separate duplicated blocks between them, totalling at least 382 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. The two sit in different directories, so one cannot simply be deleted in favour of the other while both are reached separately: hoist the shared part into a location both already depend on and have each file call it, and retire whichever file turns out to have no caller of its own left. Extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_discovery.erl"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"786570e94f84d078f9e13581e3ccaae6e68cc1a5bff1427f3425df0ac764ec66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/agents/src/jina_tools.erl:306-310 | apps/agents/src/jina_tools.erl:362-366 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/jina_tools.erl"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b32702de5462dac7d2a35c313d3612e81424f471a351bf848a411c99888fe64"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/openapi_scaffold/src/openapi_advanced_codegen.erl:578-582 | apps/openapi_scaffold/src/openapi_test_generator.erl:159-163 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_advanced_codegen.erl"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d962d4ea2f8d8ba365297b5daff8ce5cd3fb5d57949c207ea777473cd27fceb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): apps/openapi_scaffold/src/openapi_graphql_bridge.erl:736-740 | apps/openapi_scaffold/src/openapi_playground.erl:631-635 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_graphql_bridge.erl"},"region":{"startLine":736}}}],"partialFingerprints":{"codehealthFindingId/v1":"f296b6329e4464414aa8be2c55882f786e1002c4538e181db5d71d5ec1bc814d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): examples/advanced_distributed_agents.erl:316-332 | examples/advanced_tool_composition.erl:424-440 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/advanced_distributed_agents.erl"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"67b8b3a9856b18b3dfb636ddc6558d2abd72b93d843f6ff757e096d6775ca984"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: openai: openai: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 2 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8367b3eccc1bdcdc28f4812e4e80b3952057689bd34a16bbecce949d56e11d55"}},{"ruleId":"D12","level":"warning","message":{"text":"Floating source dependency: jesse: Runtime dependency \u0060jesse\u0060 is fetched from source in rebar.config and tracks branch \u0060master\u0060 \u2014 the declaration pins no immutable revision, so \u0060rebar3 upgrade\u0060 moves this dependency to code nobody reviewed. Pin it with \u0060{tag, \u0022v1.2.3\u0022}\u0060 or \u0060{ref, \u0022\u003Cfull commit SHA\u003E\u0022}\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"419114efa39910606e47b9f19dfaf480ade681e6f345ac64c1c4a7d8333dc341"}},{"ruleId":"D12","level":"warning","message":{"text":"Dependency not covered by the lockfile: jsx: \u0060jsx\u0060 is declared in sandbox/myapp/rebar.config but has no entry in the committed \u0060rebar.lock\u0060, so its version is resolved rather than pinned. Run \u0060rebar3 compile\u0060 and commit the updated lockfile."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"161b78d098e70e5ea552b59c225df72d41c178481c4a70aba1a7f7bd75ea6254"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: // TODO: Implement agent details view \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MonitoringPanel.tsx"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"919286e37be8c5c4ddb186082f803b19a2f1bec96a3ef1a348f128714654018c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement unsubscribe from timeline_event_store \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/timeline_ws_handler.erl"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5bfeead3e46689d0dfa629032dd9ff3949771b5aefa1283efe5f49f13b592c"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement cleanup for timeline_event_store \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/timeline_ws_handler.erl"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cd3de222e72c44abe7eaee87b3e904d292bc0d56b9fa3b1cf053a8c93dace28"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: % TODO: Implement refresh token logic \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_handler.erl"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"654cfb20f115f6028fec296cf5e78a1ec0c5c6cc74274a24ea9206fe5fd1c4f0"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement filtered subscriptions \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_ws_handler.erl"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"baafcb0ed46b6589975db53267609cb97807aff243bb8413275882a4cf23b3fc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement automated fix application \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a1fa548cb2d4e772e7a9138822a2fb6c4e5905340ef024adb02110c77049cc2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement crash report deletion \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/crash_report_api_handler.erl"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80c98eecdd8d423a851d8bee816db9b4ad66c3c2a1516f3fc92ede1da8bb2e2"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement actual MCP capability discovery \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/mcp_server_config.erl"},"region":{"startLine":679}}}],"partialFingerprints":{"codehealthFindingId/v1":"98fa708f0120f7b81df9eb547b51ce15bc0fe214a76f64e14048c87a018b1171"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: % TODO: Implement path affinity logic \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_agent_router.erl"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"7febeb9a4214b2d641fc33ab15e12fa816fb762c4655905c587c893f4d776bcc"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: % TODO: Implement conversation history affinity \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/dynamic_agent_router.erl"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"695e312169a4dda2f948c76ba1c7f116ebd72fd1d94b550e0e936767b272efe4"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: % TODO: Implement proper multi-turn function calling for Responses API \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_instance.erl"},"region":{"startLine":1269}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bf2f2da9c751ddedbf9f7923c3fc70e42a6d1b2cc82d2f68a96470c5c8f857d"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement type validation based on spec \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_self_scaffold.erl"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"f224957f5aa9c80451cfdb086e4cfdf29e8e55d0e2be1c7d379797bec6f98224"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement response validation \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_validator.erl"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6363d1596940e3d1ac785dc005e4a13f8a48863243f27ee03e32028c97a88b8"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: %% TODO: Implement $ref resolution \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060% REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_parser.erl"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7fcd92ec4bf5c6a495593e776369c4b6fd8faca8c65f758935ea526a7c3cf8"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The distribution strategy document begins with a list of primary goals (\u0027Advance AI Consciousness Research\u0027, \u0027Open Source Innovation\u0027) but does not state what the project is or what it does beyond its own name. Add an overview paragraph explaining that this is a consciousness-engineering framework for sharing breakthrough technology, enabling collaborative research and ethical development."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/DISTRIBUTION_STRATEGY.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ff58a1e81b8556982a74998a18d85e2608d645346496b937fbe1c2da03bdf9"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 1 project(s) overshoot their size bounds, lowering Project Cohesion to 0.0/10. The most over is \u0060(repository root)\u0060 (137833 LoC, 1115 public types across 7 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e0844685b5d509a68cfd4458676dd56f6c59152891d04e3f0d536cb8aeb0a994"},"properties":{"commitSha":"4fb5e9308299c2aa78b880c9f84a0152d8fc4669"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b7a441f8407c44a3248ba6aed716414af4d834a73d70a2ae20dd6c1e1f7881b4"},"properties":{"commitSha":"4fb5e9308299c2aa78b880c9f84a0152d8fc4669"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"fb338c7f1c47a3ed0db689ab7569b84d3f67dd59177c03870e0136a60660df1f"},"taxa":[{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"05aea4b607053aeedd9fe34456ab13afc6f00b0c3b4282fe720279721d1ad1c5"},"properties":{"dependency":{"package":"minimatch","version":"9.0.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e5b529135047265472a5f7ca5d4c9234a621ea926fa0734305cd7b3dc06c5d06"},"properties":{"dependency":{"package":"nanoid","version":"3.3.11","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"433f7f76cc565abdbc58cb4340443097275d106a4bb162cbeb2c9d848109699e"},"properties":{"dependency":{"package":"brace-expansion","version":"2.0.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"08debc2599cbb7b73e5dd39bb6e581148530694e747e86f386c851659ed8501d"},"properties":{"dependency":{"package":"glob","version":"10.4.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2e308c49960008b52eaae791e629dd8d6e48b8bfdfceb632ec7b73fa346872bb"},"properties":{"dependency":{"package":"postcss","version":"8.5.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"test-or-tooling","file":"apps/agent_web/frontend/package.json"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a613f945f8b83dedb03ccb5e3bda74ede848798a8404c307e6522ba6aac99958"},"properties":{"dependency":{"package":"browserslist","version":"4.24.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"78e7f704018f3e36de3138275e670aee723da5959ec61498ff89855503b17701"},"properties":{"dependency":{"package":"picomatch","version":"2.3.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"454f1127efa4b315c5eaf00d5ce9bfe31d73375ee5b5985deb20bed8e2476bcb"},"properties":{"dependency":{"package":"vite","version":"5.4.19","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"test-or-tooling","file":"apps/agent_web/frontend/vite.config.ts","line":1}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"21a1a67aece801a4b393b6d9d5127cfe764043a60a010591042a3a75d344de8c"},"properties":{"dependency":{"package":"rollup","version":"4.41.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42ac90dca1c25fd7bdd18773ceb9beb8e6050f2d502ba6316e98e7cf833383c7"},"properties":{"dependency":{"package":"lodash","version":"4.17.21","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b6c342036f57c9eed7962b9af349712c8798e53221f2cf2dd24516e962a0663"},"properties":{"dependency":{"package":"gun","version":"2.0.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"f08f839e9efa15ab6ae49efa55f0ddf14878887eb78c293fc4d01a5c0254634d"},"properties":{"dependency":{"package":"cowlib","version":"2.12.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a9e4b689384b6f8bcfac83dad0238182def3cdb7d6c8e5e23915756d30f52343"},"properties":{"dependency":{"package":"hackney","version":"1.18.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"291e64308acd5c6388e38c40d8c77140cd46e44a8b300ce13c7220cc827d78fd"},"properties":{"dependency":{"package":"cowboy","version":"2.10.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","EEF-[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"2a3658cbee9bdf9d11aa92c1fd6a623fa0e464844ae50a788ec8a7ff455b4a13"},"properties":{"dependency":{"package":"yaml","version":"2.8.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1ca7bf995e4ace822da0b64954dd6eae49c2a7a154c5dc0996dbbe489244736b"},"properties":{"dependency":{"package":"mdast-util-to-hast","version":"13.2.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6608b5bac1e5f4ae86c53cf6b7c473de463b9f85de2636cb3794cbc9b7ba06ae"},"properties":{"dependency":{"package":"esbuild","version":"0.21.5","advisory":"[GHSA redacted]","reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"79fa3a651f29a54b4478e55bd2151d10c9533e9645319302c5c3f6709c612ac6"},"properties":{"dependency":{"package":"@babel/core","version":"7.27.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"53535b1c3c15236d93f6ccdb4c2cd2e39a21ed43dfeac71ae338a41a3e5f3fe0"},"properties":{"dependency":{"package":"postcss-selector-parser","version":"6.1.2","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"40c4c648f010d40f4994b45aee5c5e35fa9d19c8a480fd32e4811ab522ce9d5f"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":371}}}],"partialFingerprints":{"codehealthFindingId/v1":"6619ba3dcc0804fdd42dbdd9a29f2a69468a57f6094847700281664f8b3b9200"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"414f309d1da94646e31a632123867b0810503e86b14a7b9cd9abe0684ea313be"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"47450fb138171a3cecf34e10cf8686f2ae83577efedc7c689018a45d798f88c3"}},{"ruleId":"AC1","level":"warning","message":{"text":"\u003Ccanvas\u003E without a text alternative: A \u003Ccanvas\u003E with no aria-label/title and no inner fallback content can\u0027t be described by assistive tech. Add a name or fallback content."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"e022d5a97d686b24dd50112e61600f222a01951af990ea6c0a5cabbaa9fd5da7"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":555}}}],"partialFingerprints":{"codehealthFindingId/v1":"34b137c270dce9578e1c336ae9838d9b8e1602a4d2f8ffb8dc34be872eb801ee"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1018}}}],"partialFingerprints":{"codehealthFindingId/v1":"52577ef216bd1da25d292690f8a54a55fb7cb8e4329c536e6b13406c6d9a2c7c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1030}}}],"partialFingerprints":{"codehealthFindingId/v1":"b50de1e68fe71744cc25a5cff039410c2e67da525ffa59a61e5227bfb56bd6ff"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1062}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c9f345209019a97726992195e5900702768694ffb562a97f9e7cd4e8b17ab3d"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"f314aad09640f15c8f463d38c4007c8ed001e4ae912a144917921dfa688bbabc"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"6353920df1f91002013951a29d011d44a3e89f8d07c63bd83378b5391ae2d78e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"d497fe98b74bc6c0eaa04399ebbc937c9b1ada2c861641d9becfe8f192fa2946"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"29cd8ad7a80e71ea3a4484ac2a18a92f6a5656e90bc3de38c25fde31969f050e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"51c953fba0837cee6c3d5de85173b920e546ee358a0ef8b138fc07fd6c04129e"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"1060b0e2106f955f191df3d2d6e570539efce5498e75909681b857deff598de4"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5bbd7d63f4093041b47f6e8ad962d422c3445bed26568e00cb6a178cdb6a52a"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31b368f5ac7cad9d3bc73f48190661b2e375f8a398d919d2dd7059d6cf327c1"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cbutton\u003E with no accessible text: A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyNotification.tsx"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c656638e00763d3f5f78d69f68f9f4513e600c40341303ad3c301dc6a71080f"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff0cf0ac0bd2c64c5492452a5f419be0231d9cc2e916fd58895cb75b02d0c085"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Ccanvas\u003E: This \u003Ccanvas\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b6b1d514bb189c181ba20fe829dbb5b218acae78ccf52c1a55bec6bd94b888d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b2d29ea398ea3e9332725adf4e97daf4fee34733c6fd5d2de00ab7c3e15d96"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel htmlFor\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ContextMenu.tsx"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"a236fdd966484c7cc457272d0f0caa5aac16a62180c61c85fc8b16a572bfe524"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"8df26c51b31142cb09571178d19e6433366cf570486b83c2971c33349daedbde"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"81384ca43247fb18cc448dd96186884839c1fb619a7e978ea5d60e34d45322ae"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CreateAgentDialog.tsx"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"b58f7570af595ac9cb5df131630370cc145295cf4d5e11eb4242ffe49fa21796"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f01aa7493ddd4e3927d644bf1626c3fd0f95ea6429ea651120d22b30dc69c48"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca6567deb7190de6c1e1e4490579c0bc238520d4de1d78b1290db7126defbb3"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe01a5bcda7be76dc989cd146c8edd2b7311cfa1dc47b09e0fc654b9a3587d2e"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc8a521813a776601c80629462a618a7b49b688b3b4c14b73606f97c02e7675a"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CSelect\u003E field component without a label: This UI-library field component has no label / aria-label / aria-labelledby / id / name, and nothing it renders carries one either. The text inside it does not stand in for one: these compound APIs render a trigger with role=\u0022combobox\u0022 (or role=\u0022button\u0022), and those roles take their name from the AUTHOR, not from their content \u2014 so the words on screen never reach the accessibility tree as a name. Name it whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"cafe7c6b9062acb0bd3ae0f33c63134e153ea06d3cb83e6919f460c640658461"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e98d0c580e0ac1b863816ff6f83c5d1c289b4b2e8715996cd3dfdd289907cdd"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a1e07186a196d5556e22814ca03664c0ac7d128ab9b217653e2e2ff28802c08"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"c354b44e79a3a3ae2da78b2384ac718d76655848ecf076ad7501caea5b237a37"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"444f3113cc4cc5901753b0cc80c4c234b4d82101ac756ae5dd7453a102f2cae3"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1e0b462aa61df84277fda915e468e252e6b58503b1dac3e2359f296b2730805"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8c1ddc67081d5834c407ac227c805ff99ccbb3a69f8b8f6895a82554ede0ca1"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9bdf583b96ab8eb4a7664801b196c7de6a162ef15e2cfd3aa8779a66853c390"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"b266b3c4ad9e2e8e79d57df0555cf2a8565d3e5a6e9d38421a10cd59d6888b07"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"12e550ca2638ece34a67724c55a1730a2d0ffea49eb350b9d8444ebc3bc404a7"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003CTextarea\u003E field component without a label: This UI-library field component is named only by a placeholder \u2014 a placeholder is not a label (it vanishes as soon as the user types, and many assistive technologies ignore it). Give it a real name whichever way this library supports: a label prop, an aria-label, or an id on the rendered control with a \u003Clabel htmlFor\u003E pointing at it. For a group of controls, name the group itself (aria-label, or a fieldset with a legend) \u2014 labelling each item leaves the set unnamed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"e90b107b41751b91dcf0cd4d79c1dd1c20d22dd6ca253eec9d0426bc86b05336"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a9f113aa956fdc50020cf748cea154a0627a0e52dd5bd085a3503c6394980b"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel htmlFor\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"68787816e99dfe20da9122fd30e76649902d0a46dd70fb275412b049d4d0c05c"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"8961b9f091f9c832bf205c241281a8167bcc76daebde86e998ef79fbc8f4d34d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7914218f3c9289420f2e525365dee3f2e94fd6577247aef5b993a01a06befda"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no htmlFor and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label htmlFor=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d128d815698ee5220391729feb2cb7d7213053728862894041a68919164de4"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1421}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fae6f8594956afb2e632481d0640ea05376195d0ef4777159c87d6022106e5e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h3: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"65e7680bf60caebfa217cb0d6dfcf256ab0fa02c3994ac6e663526d14df811e1"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5d97d2d21ea7c3fdf842c21cbae999da7d540006cb04e468edbdeacc55e3436"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h3: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MainLayoutWithSidebar.tsx"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c841741fc835848cc8dbbe5068db10d459c20ca40861ef9c07907945329303e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h3: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ToolRegistry.tsx"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"112e40f42f65e5ab1e26c0f70c4e5bd8b7c6982c657a8787d59035ad92c2fb00"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":780}}}],"partialFingerprints":{"codehealthFindingId/v1":"8797e6a6f4503384069a6292b1fb3267976e83c4bd02328930e6e36337fab29a"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bcbc1f747f720f8d3df6364c2aeea2552cb3ca5131b98eb4fd5ed85dbfd57e2"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentList.tsx"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"a275aa1bd2f78c7808c8bbcc2bb305cdd003382023671b4a08e914f113c41589"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentPillXL.tsx"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f7838b39d03b061fadc09ab0f53aeb058702bfdc16808dcc070fb1cfc60ca3c"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentPillXL.tsx"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e8b6a57d4c556a734584a9246ccdbc177fb86b96ed761faa6a8e79e7744a65c"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyManager.tsx"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"291547e69a3dccfaddb6f0480d23dc9d477c1670ef4e5cb3d202517c32eb30de"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Ccanvas\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"33bbd9df8749cd0350c654a1c3865ed4e3d7f11c4587b13db77fead5db2aae65"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0069e0b2738c5e7899ec1e151802aefa28c6f8314fe81a41fe243f32c967a0d"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":421}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc8201da69499de3ed221a0f37c811057388ea1636d833c75b3fcbf1f248ae5"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7bdadb8f59ba17c6903246fabfca606e5de29863745ffb17a0202fa8d2a1720"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"77b8e99d080297273f688ec0d4125858d4441bdc350c03e898608d60810cd295"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FlameGraph.tsx"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b192c82a1cbe79f013721783f9f7aa89fa69434ee4a6cc1f779c777991a9ed9"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a5553b6c753a54572ebfc2f3430783310d179b2770eb4d39f4cbdd34804d8dc"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Ccircle\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveWidgets.tsx"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"220f7e4c9808c8480c6d92c1880e958eb9809299d1015def8b43754737dc10c5"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cpath\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveWidgets.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3d5b93ec540b8cc0b1301f1fe3e60dd965bbbc7ea3341651513288b2d45ee1"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce321176b84fd26bbc5504c433456f3c58e7d0ee1cf9ee107adac92482d87f84"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/NetworkTopology.tsx"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c735809fed31364e490b12100371bb6a72e6395a48d793d21930d64323d20f8"}},{"ruleId":"AC4","level":"error","message":{"text":"Hover-only interaction on \u003Cdiv\u003E: This \u003Cdiv\u003E binds mouse-enter and mouse-leave and nothing else \u2014 no click, no key handler, no focus handler, and no tabIndex={0}, so it cannot even take focus. A keyboard user cannot hover, so whatever the pair reveals or highlights is reachable with a mouse only. Bind the same state to focus/blur as well, and add tabIndex={0}=\u00220\u0022 so the element can receive that focus."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/OpStackBar.tsx"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"48c12b99087ca7991951043d2819e0a316a3204e7d19801a86774a5990c52f51"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0}."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":1054}}}],"partialFingerprints":{"codehealthFindingId/v1":"74a98e33b97c465e4c62e9ef872a476f74c2775de3ddafc101364d38ec562148"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabIndex={0} \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/TokenHeatmap.tsx"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"70dad4477cadd77f5b43823183826bf78087c2af4e7fd0f00643ec010098450f"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .agent-item with \u0060cursor: pointer\u0060, so this \u003Cli\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6358b5e352e0836d17489dff1e230f41c9d4c18d5b8a7ef295d6f803b82098b"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cli\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"885a383c499f237e550360b6eb3aba4f3b96151a0e6d0c81429564e6556fd236"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .node with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1331}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1b3c4527867ed84b1a2d4981725c1492f0bf67e3d11669634de8212b2fb7523"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .node with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1332}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2770def0160b9c9f47230b2d5d565f89cf0fd6cdc9ed0d574c9c50465ce46b7"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .node with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1333}}}],"partialFingerprints":{"codehealthFindingId/v1":"679e7909227337bd444cf9a9caac71d797e78c8bf370cc97f560184941914dfd"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .node with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1334}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb4a6c78f03846dcf3b58cc86e4d923eb828bbbc8b140286f2b1e6d360f5822"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .node with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1335}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca60506cf843d912c21810d0a089a3919c16dc0cb6e717eca6e9f5dced31e8a"}},{"ruleId":"AC6","level":"warning","message":{"text":"Animation without a prefers-reduced-motion guard: This stylesheet animates but never checks prefers-reduced-motion, so motion-sensitive users can\u0027t opt out. Wrap motion in @media (prefers-reduced-motion: no-preference)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/priv/static/playground.html"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"21eb04e6452223a04d023549af7119d67d8f0ab81803b6319905685e15df2a82"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no a11y linter (eslint-plugin-jsx-a11y) and no axe/pa11y/Lighthouse in tests or CI. Start with the linter to catch issues at author time. What was searched, so you can tell an absence from a miss: the 78 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"AX9","level":"error","message":{"text":"Query handler writes persistent state on the read path: openapi_ai_transform: \u0060openapi_ai_transform\u0060 has a \u0060handle_call\u0060 query clause that reads a store and, on the not-found (cache-miss) branch, WRITES it \u2014 a get-or-create that mutates as a side effect of a read. A query must stay side-effect-free so reads are safe to retry, cache, and route to a read replica; move the lazy-init write into a command."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_ai_transform.erl"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"081c45e16e66f66f3cdbf470da93e912c89c33d0f4b2e8f1bff866ede337c277"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: distributed_error_coordinator clause \u0060handle_call/3#90\u0060: \u0060distributed_error_coordinator\u0060 clause \u0060handle_call/3#90\u0060 blocks on a hand-rolled \u0060Pid ! Req, receive Resp\u0060 rendezvous awaiting a peer\u0027s reply while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, reply asynchronously (send-and-continue), or run the round-trip in a throwaway spawned process."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/distributed_error_coordinator.erl"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"76596eb2ce50810285e740429525106cd5b6630ca197babadda803ee5936dc2c"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: embedding_integration clause \u0060handle_call/3#86\u0060: \u0060embedding_integration\u0060 clause \u0060handle_call/3#86\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d6fca29e0ad695e74b7632d412ca6ebd60000e503bfb0625d70ca431c8919d6"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: embedding_integration clause \u0060handle_call/3#117\u0060: \u0060embedding_integration\u0060 clause \u0060handle_call/3#117\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"95570068d26bbdb14d374adf8ed7bd5813f7fcddb01accd76a20f1452057e721"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: embedding_integration clause \u0060handle_call/3#254\u0060: \u0060embedding_integration\u0060 clause \u0060handle_call/3#254\u0060 makes a synchronous \u0060gen_server\u0060/\u0060gen_statem:call\u0060 round-trip to a peer process while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, react by casting a follow-up message (fire-and-forget), or resolve the needed state locally."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd04ffd737bd6e0f3bb3b230d94838d50522485757fa06865002a332c73c2a9d"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_call/3#105\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_call/3#105\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"717ad0c1c4dc63c6a8d433acfe8a15d33283cd435a296c1d038fa48f8a087522"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_call/3#105\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_call/3#105\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ddee8df2ddfbd6c428bf5638e2738d90d677b1c75edc64e0e97c583cc50fd1"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_call/3#208\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_call/3#208\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"87b0b050f8c51368680b352df5f57b7c2a6080d740823dfdcea8b824e705952f"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_cast/2#225\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_cast/2#225\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"516c13e75c0560e96f493b4380339a48e379419db108c89c6e955037b3c0adb9"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_info/2#236\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_info/2#236\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"4363fbf9c9fd1f67e7a2a93d7666794ec2497f2665a0abe5c78accfe2b34cf8a"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_info/2#240\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_info/2#240\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"563a0a3e68c9cff48a58d294423d7c229e14a6544d4298f4551c6150569552b5"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_info/2#244\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_info/2#244\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bee29989f2c5e52debe4fca448daa6b8bd8468f7eadc7eef1da4b8ad0ff7ab8"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_info/2#276\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_info/2#276\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"a098e54c5d25d0f36cfb51512a8c34edad14819bbbe5f142f65983b9fbc97036"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_websocket_message/2#520\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_websocket_message/2#520\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"67ac5060edfea4b32ccb051b100da9c64a9b99ac37b6d981df76b0675963a79a"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_sse_data/2#530\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_sse_data/2#530\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"41f288fe61d593634ce221c73d0d2da7c0a2a74dc1fc4f3a0738faab5b849566"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_client_v2 clause \u0060handle_response/3#622\u0060: \u0060mcp_client_v2\u0060 clause \u0060handle_response/3#622\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_client_v2.erl"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8492a80d51fa42e7c74292f55517615ecd05285ff9566553048df8f2dd697c6"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_github_registry_updater clause \u0060handle_info/2#94\u0060: \u0060mcp_github_registry_updater\u0060 clause \u0060handle_info/2#94\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_github_registry_updater.erl"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ce4c5084ba9d16529112b354923c0088b522f0739650e2d371861fad604654"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_oauth_client clause \u0060handle_cast/2#126\u0060: \u0060mcp_oauth_client\u0060 clause \u0060handle_cast/2#126\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddfa59ddcf7bcdb225aff85c502c48a61dd1f4d5f41682679b7284f87ff67a98"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_oauth_client clause \u0060handle_call/3#60\u0060: \u0060mcp_oauth_client\u0060 clause \u0060handle_call/3#60\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"99c5a648e5b6a05403e71d469109e55ac02ca24730c3b060699d2d0c9d71bcab"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_oauth_client clause \u0060handle_call/3#89\u0060: \u0060mcp_oauth_client\u0060 clause \u0060handle_call/3#89\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"19ecdd655218af9fe218b0441823b5dbf7771221cbef0ed1b36e0ed14ca59887"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_oauth_client clause \u0060handle_token_refresh/3#206\u0060: \u0060mcp_oauth_client\u0060 clause \u0060handle_token_refresh/3#206\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"467c5485489909a98127e65ce561a6c96a996c3d0b03a5ddf21251af9ae1200f"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: mcp_oauth_integration clause \u0060handle_oauth_popup_callback/3#153\u0060: \u0060mcp_oauth_integration\u0060 clause \u0060handle_oauth_popup_callback/3#153\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_integration.erl"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"47c6f178b370c9b54a079b200521b5b0761fd8f951860f41057443b3ea0c6d1e"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: oauth_handler clause \u0060handle_request/4#86\u0060: \u0060oauth_handler\u0060 clause \u0060handle_request/4#86\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_handler.erl"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"6536820d4f43c6da18ed3cc746ddb905bc5c55e99151a47ee9aed87233c0d56b"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: oauth_handler clause \u0060handle_oauth_callback/3#135\u0060: \u0060oauth_handler\u0060 clause \u0060handle_oauth_callback/3#135\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_handler.erl"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"1934d993bb6750cd6dc5beadcc36c708fcfd1cc98c3458426939fb7e07d501e1"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: oauth_manager clause \u0060handle_call/3#197\u0060: \u0060oauth_manager\u0060 clause \u0060handle_call/3#197\u0060 makes a synchronous \u0060gen_server\u0060/\u0060gen_statem:call\u0060 round-trip to a peer process while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, react by casting a follow-up message (fire-and-forget), or resolve the needed state locally."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_manager.erl"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a7d18965c44a8ca9d526850ef5ae94af65a77bf9501efa882dd914f3d707363"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: openapi_fetcher clause \u0060handle_call/3#70\u0060: \u0060openapi_fetcher\u0060 clause \u0060handle_call/3#70\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/openapi_fetcher.erl"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0abeace9ebcf97f8a3bf3328542a263a6f87c267b6f850af32b9dfe39fcbb65"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: pipedream_mcp_client clause \u0060handle_call/3#83\u0060: \u0060pipedream_mcp_client\u0060 clause \u0060handle_call/3#83\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"9afb405cfa0ab09ebad1e04085567c5cbb032daf13698f41fd8ed5260508550b"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: pipedream_mcp_client clause \u0060handle_call/3#91\u0060: \u0060pipedream_mcp_client\u0060 clause \u0060handle_call/3#91\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a1c8979a6d92ca38e6718b7152dc77e1dee576b5a866bfbd1eea5cd9fb5c70"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: pipedream_mcp_client clause \u0060handle_call/3#95\u0060: \u0060pipedream_mcp_client\u0060 clause \u0060handle_call/3#95\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"2660954a7a3ef2a8b98265a8773f514ac4d22b4b63e93170cf0f7b6cfaf1726f"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: pipedream_mcp_client clause \u0060handle_call/3#99\u0060: \u0060pipedream_mcp_client\u0060 clause \u0060handle_call/3#99\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"1034ca3fbdc2e63308f7176bb1afae3b272c99fa0806647d3be7557f04d99d6a"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: pipedream_mcp_client clause \u0060handle_call/3#103\u0060: \u0060pipedream_mcp_client\u0060 clause \u0060handle_call/3#103\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"31dd8fdeb3fd04c76849fefca3c4d792cac17efe4f608f2dd9330c29b82b0f18"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: agent clause \u0060handle_follow_up/3#692\u0060: \u0060agent\u0060 clause \u0060handle_follow_up/3#692\u0060 makes a synchronous \u0060gen_server\u0060/\u0060gen_statem:call\u0060 round-trip to a peer process while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, react by casting a follow-up message (fire-and-forget), or resolve the needed state locally."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent.erl"},"region":{"startLine":694}}}],"partialFingerprints":{"codehealthFindingId/v1":"1632ecf16dfc23209506a4dc9d43a5bf4a5c6716b4e954a520db80b777bd1bbc"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: agent_messenger clause \u0060handle_call/3#93\u0060: \u0060agent_messenger\u0060 clause \u0060handle_call/3#93\u0060 blocks on a hand-rolled \u0060Pid ! Req, receive Resp\u0060 rendezvous awaiting a peer\u0027s reply while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, reply asynchronously (send-and-continue), or run the round-trip in a throwaway spawned process."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_messenger.erl"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce24030f98bd1e22e8bd5db16236549da59e5541e234b68dff23b16bf3a9c89a"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: enhanced_agent_tools clause \u0060handle_call/3#112\u0060: \u0060enhanced_agent_tools\u0060 clause \u0060handle_call/3#112\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/enhanced_agent_tools.erl"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"9988fb50157371617a0194681843548619c77d9501b399f623fbb7f64b7e1f54"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: meta_server clause \u0060handle_connection/1#295\u0060: \u0060meta_server\u0060 clause \u0060handle_connection/1#295\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_server.erl"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"965f4cea137827fdc292a33e8ece160e8fe78962a99cea8302519a0ae143a5f7"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: meta_server clause \u0060handle_connection/1#295\u0060: \u0060meta_server\u0060 clause \u0060handle_connection/1#295\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_server.erl"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"36b30648baf17e504c07f36a7f24672bdf2e07a60a485e5e184c3a76a181d3e7"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: meta_server clause \u0060handle_connection/1#295\u0060: \u0060meta_server\u0060 clause \u0060handle_connection/1#295\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/meta_server.erl"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"cce9f3d18177f58d65c38552e85a0b4464af8a21ee513072f1df7b041ec9a63e"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: openai_chat clause \u0060handle_call/3#93\u0060: \u0060openai_chat\u0060 clause \u0060handle_call/3#93\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_chat.erl"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e2f7c7c544720b9ae69b30fce81bb08fe96b1fa6f01c7eeadf2970b6ac97ab3"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: openai_files clause \u0060handle_call/3#154\u0060: \u0060openai_files\u0060 clause \u0060handle_call/3#154\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":243}}}],"partialFingerprints":{"codehealthFindingId/v1":"30f8901c80a5f12c52d5e447fd1a23db77785e40ac88b27ef0d33fbb2b50731a"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: openai_files clause \u0060handle_call/3#171\u0060: \u0060openai_files\u0060 clause \u0060handle_call/3#171\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c1f14c1f244a1b164cdf2b8dfddd71c52ca991cd249b30182bf332d022076f7"}},{"ruleId":"ED1","level":"warning","message":{"text":"Handler temporal coupling: openai_files clause \u0060handle_call/3#180\u0060: \u0060openai_files\u0060 clause \u0060handle_call/3#180\u0060 blocks the process on a synchronous outbound I/O client call (a remote HTTP request, a socket receive, or a blocking pool checkout) awaited inline while handling a message \u2014 the process is blocked (holding its mailbox) until a peer replies or the sleep elapses. That couples this handler in real time to another process being up and fast, and a mutual call can DEADLOCK. To decouple, issue the request off the hot path \u2014 reply asynchronously and do the I/O in a throwaway spawned worker (or use the async client API), so the process keeps serving its mailbox."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openai/src/openai_files.erl"},"region":{"startLine":305}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6db4178a89e6afe76f0798c2f7c01b3f05f49f733864683a42aeea413acbd1d"}},{"ruleId":"ED2","level":"warning","message":{"text":"Command with competing owners: create_swarm: \u0060create_swarm\u0060 is shaped like a command (one imperative intent) but is handled synchronously by more than one module \u2014 a command should have exactly one owning handler. Split the responsibilities, or raise an EVENT after the command and let the others subscribe."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/cluster_orchestrator.erl"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"fba324b22c6edc05eca767736c8dfd07a6afa23a4b2f6b9d5a6bcfcfb29788bd"}},{"ruleId":"ED2","level":"warning","message":{"text":"Command with competing owners: create_swarm: \u0060create_swarm\u0060 is shaped like a command (one imperative intent) but is handled synchronously by more than one module \u2014 a command should have exactly one owning handler. Split the responsibilities, or raise an EVENT after the command and let the others subscribe."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/emergent_swarm_intelligence.erl"},"region":{"startLine":237}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef89fade75455ee5dd8c610f6875c2953d5345249c5e8edca5b526fb926d30c8"}},{"ruleId":"ED2","level":"warning","message":{"text":"Command with competing owners: create_swarm: \u0060create_swarm\u0060 is shaped like a command (one imperative intent) but is handled synchronously by more than one module \u2014 a command should have exactly one owning handler. Split the responsibilities, or raise an EVENT after the command and let the others subscribe."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/swarm_intelligence_engine.erl"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"774c16cb4cf52a43fd2f7dd4f53d83edde1514f93a271c1ebea6008044a03f62"}},{"ruleId":"ES1","level":"error","message":{"text":"Nondeterministic fold: agent_api_handler: \u0060agent_api_handler\u0060\u0027s event-replay reducer reads a wall clock / randomness / a peer process / persistence while reconstructing aggregate state \u2014 replaying the same events would rebuild DIFFERENT state each run. A fold must be a pure function of (state, event); stamp the timestamp/id into the event at raise-time and read it back in the fold."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/agent_api_handler.erl"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"1589555b059fb95a7a4e7f7f1c5db99b344f4b2c73188a5e772d782f01738741"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P1","level":"warning","message":{"text":"No CI pipeline: No CI workflow found (.github/workflows, azure-pipelines.yml, .gitlab-ci.yml, \u2026) \u2014 changes aren\u0027t gated by an automated build/test."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"44f01af96e50474fba2df84d95ddf4f7e1d34c29c307830b9efc9057daa6b670"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/3 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060.\u0060, \u0060sandbox/myapp\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add dialyzer or elvis \u2014 this repository has no CI pipeline yet, so run it locally to clear the existing findings, then make it a step of the first workflow you add so a regression fails the build. What was searched, so you can tell an absence from a miss: the 0 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout. 11 of the 20 files that make outbound calls are unbounded; the first 10 are listed."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/embedding_integration.erl"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f5ddd1612eed201fbac0b9759456319da12c3fa4151726d499251520ac0fe90"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_client.erl"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9046406795b52ced29bb18f2848dbbeb2f006171bf68a8eee2c9a856abbbd7a"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/mcp_oauth_integration.erl"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d364066c94f414ef61c55d15f701119f6f08db90a54b7ed630111eb8c3c6438"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/oauth_handler.erl"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8bb213317ebb3f45048976c0b81fedda1567899c4d6f96c93d918ccf7eff985"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/openapi_fetcher.erl"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6e3b6396feb560ba049527e133deb66016702efa4adbf9ec378cd3050a94432"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/src/pipedream_mcp_client.erl"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc418c5d5c22dce0a09967866ab36c0705837359f6f725fb57c6e4377740a03c"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/agent_tools.erl"},"region":{"startLine":1793}}}],"partialFingerprints":{"codehealthFindingId/v1":"1120d0f730a6d4c7ea330b74ffbf8895461c94f797a54a729715f68f14e5111a"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060httpc:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/src/enhanced_agent_tools.erl"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"f094f04f202c734f4611c4cf95efe534d15e56f21fbb4b60c6afd336fd5c2252"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060hackney:get(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_graphql_bridge.erl"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e03309f46274ffd4afb70022154b193f10e2d56cdc938f716451f925294ea70"}},{"ruleId":"P7","level":"warning","message":{"text":"Outbound HTTP without resilience: \u0060hackney:request(\u0060 makes an outbound HTTP call, and nothing bounds it: no timeout, deadline, retry or circuit breaker is set for it here, and the client has no process-wide default. A slow or failing dependency will hold this service\u0027s request, thread or connection until the call gives up on its own \u2014 or never, for a client with no default timeout."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/src/openapi_playground.erl"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"6246bb11cf853ab41cd5b9de19087de717960e7e941381621c4483bb99b8c9d0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (35 matched lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:642 \u00B7 apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:1499 \u2014 the two spans are one implementation copied and then locally edited \u2014 157 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"f04994f009feea84b6c6514e39983a76b955286e9d8d7848349ca61125abe209"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (33 matched lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx:171 \u00B7 apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx:232 \u2014 the two spans are one implementation copied and then locally edited \u2014 194 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c302832fc0e0d11bd58dd9be7fb99a1a3ee767df4c88b2614d8ec9bf097bea"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (31 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx:310 \u00B7 apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx:417 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"68be023dd4408c9d957bf666f5f14dfa79ee68b775cb92f4008b531bf366d79d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (30 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:453 \u00B7 apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:541 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c8fbff3ed40fa9f19ec252194fa67f435b3d169f73f274c47bb070f86058c9d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (28 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:500 \u00B7 apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:601 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"cad3143b4f8e749a9928c97806a77364e58b9401b2c40d9965b94dcd3fb0770b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/VirtualizedAgentList.tsx:98 \u00B7 apps/agent_web/frontend/src/components/VirtualizedAgentList.tsx:146 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/VirtualizedAgentList.tsx"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"245bdd3e1b134a6fcb8ca9955dda71872eb4ca7fd7bc7adf46903ec708d65398"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:367 \u00B7 apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx:376 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"371a2a69df5bcea67380c0d663860cb902badbc84b457e045e84def257f2e352"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx:319 \u00B7 apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx:230 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"12c34309523d8e73110a10a96f64343dff44f3cd5acb6ba3fe8e7064054c6696"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:763 \u00B7 apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:833 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":763}}}],"partialFingerprints":{"codehealthFindingId/v1":"77a806794b0be03bee5544a8e4483e863eec9461a173165cdc8339f6525731f1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx:414 \u00B7 apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx:319 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"29733c1d83da1060a4c38aa18fbbe07a92f55a3184929ed720196371b9472b11"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx:392 \u00B7 apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx:453 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd667cc841218be1000f1395219263fc975f45a739552155aeb64029c74350ac"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx:432 \u00B7 apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx:468 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx"},"region":{"startLine":432}}}],"partialFingerprints":{"codehealthFindingId/v1":"55b0b0408abf1dbf8ae7edd269ffde1155316c5bf35bb1cefc94698b275b1a45"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3 locations): apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx:621 \u00B7 apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx:645 \u00B7 apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx:669 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c3a85651f8d4d16904d7b29f623d8e7a034123d481affe7c65f5453e98e20a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx:442 \u00B7 apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx:352 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"d53d962ca03c1581e66cc6135dce3cf87cb49a2c3fea1fe1a370126abddfca61"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (17 matched lines \u00D7 2 locations): apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx:220 \u00B7 apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx:373 \u2014 the two spans are one implementation copied and then locally edited \u2014 72 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"1175169586367a48268af2641d4c236410d1cb3509bcf165e6344b8feb31e02a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/MCPOAuthManager.tsx:148 \u00B7 apps/agent_web/frontend/src/components/MCPOAuthManager.tsx:170 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOAuthManager.tsx"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"63cd1f4a925d5b4d5a1416e0c9d3cd5c0ac643d877e0e6bc4b9f32f83e9a1e9c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/MultiAgentChat.tsx:483 \u00B7 apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx:1009 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"4198826efefccbd57267923440c59d1b512560828fe943babfa2b74c17a03c58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/MCPServerManager.tsx:143 \u00B7 apps/agent_web/frontend/src/components/MCPServerManager.tsx:173 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPServerManager.tsx"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"60160f15ce8e596c062b1be286990297fc1c2cca18b821807f794677ff991a29"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx:100 \u00B7 apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx:119 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ResourceSentinelBar.tsx"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"527f6f612fe20f66c3d11fc084bc28e1daa1c44de01dffca882e9cdc7c656f92"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ui/select.tsx:33 \u00B7 apps/agent_web/frontend/src/components/ui/select.tsx:50 \u2014 all 2 copies are in the same file, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ui/select.tsx"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f9d1b866a497515f54a9b41b1c1582cb02af34949927722b0aba5f3aceda497"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): apps/agent_web/priv/static/js/app.js:1787 \u00B7 apps/agent_web/priv/static/js/app.js:1869 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/priv/static/js/app.js"},"region":{"startLine":1787}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbc6ca4bf03bde95c2f9f0fb726bcdd1e900b70c167ae4b298029d7b402090d5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (15 matched lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:392 \u00B7 apps/agent_web/frontend/src/components/MCPServerManager.tsx:69 \u2014 the two spans are one implementation copied and then locally edited \u2014 69 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"c80e9e8810cbae04e06ebe81c2f8824175e46c57a7f04dfeb60235ccff7a1dce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 4 locations): apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx:320 \u00B7 apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx:425 \u00B7 apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx:493 \u00B7 apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx:565 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedStructuredOutputsManager.tsx"},"region":{"startLine":320}}}],"partialFingerprints":{"codehealthFindingId/v1":"08e43099cd8006c2bb160ad24021ed7ce3d5d9fad2bd11162f1f5541171f2919"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx:587 \u00B7 apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx:604 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"066781895b5740c7f1e1854cbb937ee81ada31c6a50e0a042cc11547c366f9d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx:83 \u00B7 apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx:99 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"4280a5325a2441443f161537ebcae40d2e994872d31603a33357f71a67a6e16e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx:128 \u00B7 apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx:152 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fb8afa067d381c04d6de3ea63a1367683c4b57f3f80caee016a2b79a95bab8d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ApiKeyManager.tsx:333 \u00B7 apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx:391 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ApiKeyManager.tsx"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"0709bb5573ea86fc1344c3bacc072262dbe453bfc9e5a41b5869a37e3af67de7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/CommandPalette.tsx:124 \u00B7 apps/agent_web/frontend/src/components/CommandPalette.tsx:187 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CommandPalette.tsx"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"64b5d4872111ef673e2ded6a77d5c95d4c318f504dee58dad0369eac76e0baaf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/Dashboard.tsx:84 \u00B7 apps/agent_web/frontend/src/components/InternalsPanel.tsx:178 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Dashboard.tsx"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"7370229a7c2d4db57c3b54bd335dce0982a1735fef37b220c14e1b59baa82916"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ExamplesPanel.tsx:11 \u00B7 apps/agent_web/priv/static/js/app.js:711 \u2014 the two spans are one implementation copied and then locally edited \u2014 82 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ExamplesPanel.tsx"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"368c3133d9f0cf83907053063462d13e01957532290eba478115129793234350"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3 locations): apps/agent_web/frontend/src/components/ModelConfiguration.tsx:311 \u00B7 apps/agent_web/frontend/src/components/ModelConfiguration.tsx:325 \u00B7 apps/agent_web/frontend/src/components/ModelConfiguration.tsx:340 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelConfiguration.tsx"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"16fe932f587497ca3ddc6d3699ebfb222f6351fbc374fb14efd1bb971888820a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/RightDrawerInspector.tsx:192 \u00B7 apps/agent_web/frontend/src/components/RightDrawerInspector.tsx:230 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/RightDrawerInspector.tsx"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"8938bb9c2b5e8957efa6d4b5e85837a0eb050422723c957c72211c3d26211ba9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 9 locations): apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:407 \u00B7 apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:452 \u00B7 apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:497 \u00B7 apps/agent_web/frontend/src/components/ApiKeyManager.tsx:336 \u00B7 \u002B5 more site(s) not listed \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"02717fecf586987075f61f72cba8859c86a7d068ddd5fbfc51e9515b46c8c3f0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:466 \u00B7 apps/agent_web/frontend/src/components/OAuthManager.tsx:299 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc67568848625fd24c7e9c880f37a73ecd01f1be910d30b88b24f962e4762b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:877 \u00B7 apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx:891 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":877}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfe70a06c30bcd33ad934ca26d48b201695672586cdd7254ef6f021bbdd0f309"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 4 locations): apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx:396 \u00B7 apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx:466 \u00B7 apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx:509 \u00B7 apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx:568 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"2137f9dfa65a102d4205623469759b822b0146b83647e3825721b8df4ad1620c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx:974 \u00B7 apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx:990 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":974}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79556fd8979a645b26dcdc2fdb7b933a8f88947537b8d5dfb6f54d9ccdb6bd8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:467 \u00B7 apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx:480 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdaptiveAIInterface.tsx"},"region":{"startLine":467}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf9cade960a35e3fc006cc60a50cd39a3696add1e829445ebbca60f870755311"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4 locations): apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:938 \u00B7 apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:951 \u00B7 apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:965 \u00B7 apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx:979 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":938}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce5b0a0d9e96295747c0023e8177edb5ae828079ab73e5e1574ca86a9af013f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx:225 \u00B7 apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx:259 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"44ef739e9dd62bec48ee6bb2f503077164590eef0bdb08ad734598905f9e7872"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function SystemMonitoringDashboard (cyclomatic 25, cognitive 23): SystemMonitoringDashboard has cyclomatic complexity 25 and cognitive complexity 23; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SystemMonitoringDashboard.tsx"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"26279545e7e042722bbff0ce399b16745527baa38d182d7ee4ea153a4bed126c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ContentAnalysisBadge (cyclomatic 20, cognitive 13): ContentAnalysisBadge has cyclomatic complexity 20 and cognitive complexity 13; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"3af0ceb90a86ccdc78c98a832013bcd4a13ffb92dbb2200ca3a5c47e55c7e682"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function DiscoveryMeshDashboard (cyclomatic 18, cognitive 17): DiscoveryMeshDashboard has cyclomatic complexity 18 and cognitive complexity 17; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DiscoveryMeshDashboard.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b9415489d5fc756725b642372435e8d6893bd3881f4c1caedf561e427707e8"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function analyzeContent (cyclomatic 18, cognitive 15): analyzeContent has cyclomatic complexity 18 and cognitive complexity 15; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c63dd25e0f5cd7486ff54f4b0ac0fae4bd2ff55fe6fabb020c9fb7714ea9507"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ErrorInterpretationPanel (cyclomatic 18, cognitive 15): ErrorInterpretationPanel has cyclomatic complexity 18 and cognitive complexity 15; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ErrorInterpretationPanel.tsx"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6eb5e3f6464d98586e8c35985bd9fd4f17a0d931dcc5c5eeef7415e0af829dc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function Dashboard (cyclomatic 18, cognitive 14): Dashboard has cyclomatic complexity 18 and cognitive complexity 14; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Dashboard.tsx"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a92e335d6c465321aa345655e5799049c414b3bb5bc4c6a0a697dabc47cc087"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handleGlobalClick (cyclomatic 18, cognitive 6): handleGlobalClick has cyclomatic complexity 18 and cognitive complexity 6; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc165075e1ec7b20c73807fd054691699a59050544c4215b9ba0b0fce12d8c06"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function SimpleAdvancedChat (cyclomatic 17, cognitive 15): SimpleAdvancedChat has cyclomatic complexity 17 and cognitive complexity 15; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a5386d6afbbb6df3eae036a65619447ebcdebdb7f78dd859c49780d59e9f621"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function CrashMonitorDashboard (cyclomatic 15, cognitive 14): CrashMonitorDashboard has cyclomatic complexity 15 and cognitive complexity 14; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/CrashMonitorDashboard.tsx"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"3decfe7f88b6add4e4523cf83ff46fd34ba3119440d103ed2ffac6fffa8d0e9b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function sendMessage (cyclomatic 15, cognitive 14): sendMessage has cyclomatic complexity 15 and cognitive complexity 14; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":792}}}],"partialFingerprints":{"codehealthFindingId/v1":"79a143af8d539942bd9bc1c34b816748206499496243504db25d35ff62737e34"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handleExecuteAction (cyclomatic 15, cognitive 6): handleExecuteAction has cyclomatic complexity 15 and cognitive complexity 6; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/App.tsx"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"de16bda304977af013688c2f6eb770a0b3214b86fc4e58f5a9ce2ebc5516fc19"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handleWebSocketEvent (cyclomatic 14, cognitive 8): handleWebSocketEvent has cyclomatic complexity 14 and cognitive complexity 8; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/Timeline.tsx"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f1ed6aee8e3f9f5788531b0b5c4ba78b8627ddcb675a028f31bd9290ee631c0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function DenseLayout (cyclomatic 13, cognitive 11): DenseLayout has cyclomatic complexity 13 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseLayout.tsx"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca8ac9c62622e9233a473a63d7b3119d36c59fc148a58d6a43c837f5bdc94e54"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function InteractiveReasoningControls (cyclomatic 13, cognitive 11): InteractiveReasoningControls has cyclomatic complexity 13 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveReasoningControls.tsx"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbd2af320c761c43b6298051983b934f8c1ff7dee7c8e229535b05386729221b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ServerDetailPanel (cyclomatic 12, cognitive 11): ServerDetailPanel has cyclomatic complexity 12 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx"},"region":{"startLine":1222}}}],"partialFingerprints":{"codehealthFindingId/v1":"725e71d6df60c8b7d5623026937dd38d90f5c8d3adcbe08f7bfb1d937b3dbd1c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function MCPServerManager (cyclomatic 12, cognitive 11): MCPServerManager has cyclomatic complexity 12 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPServerManager.tsx"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05155f72d1d7b1815c5647185b2020c9bb9313313d9d91b13070300bc24bfb2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function MultiAgentChat (cyclomatic 12, cognitive 11): MultiAgentChat has cyclomatic complexity 12 and cognitive complexity 11; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MultiAgentChat.tsx"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"d888ac90c51d00a7f84935ee3a98469fd96873b9bee4165e03e0fd57062bb219"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function ChainOfThoughtVisualization (cyclomatic 12, cognitive 10): ChainOfThoughtVisualization has cyclomatic complexity 12 and cognitive complexity 10; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ChainOfThoughtVisualization.tsx"},"region":{"startLine":52}}}],"partialFingerprints":{"codehealthFindingId/v1":"6043272b567322f861f7a5340b94a8f16e5e3bc3bead9acf7d49964425e401e0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function handleWebSocketMessage (cyclomatic 12, cognitive 9): handleWebSocketMessage has cyclomatic complexity 12 and cognitive complexity 9; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7620e9ec02028c1db0ae48446b84dfc65b61251b525565b92bf618823afdd5"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 31 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: apps/agent_web/priv/static/js/app.js (1830), apps/agent_web/frontend/src/components/AdvancedMCPDashboard.tsx (1440), apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx (1125), apps/agent_web/frontend/src/components/MCPOrchestrationEngine.tsx (1003), apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx (992), apps/agent_web/frontend/src/components/ModelTypeEditor.tsx (850) (\u002B25 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"Test Coverage: 0% of 83 production file(s) reachable from 0 test file(s) via the import graph \u2014 \u0027production\u0027 here is the RESIDUE: every source file left once tests, tooling, generated output, config, declarations and declaration-only modules, fixture corpora, type fixtures, behaviour-free data modules, re-export barrels, registration/constant data modules and service workers are set aside, so the percentage is taken over a smaller denominator than the workspace\u0027s file count"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"64e0e3511eb969fb4720b196e7d3799e1714077217351c3c56a27b50e3e21220"}},{"ruleId":"R5","level":"warning","message":{"text":"Dependency Freshness: 34 outdated package(s); JS/npm CVEs scored in D30"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"7de98450603a813bc7a991bc6e60f440c1deac6f9c9bfd4d0da057afed869bcf"}},{"ruleId":"R6","level":"warning","message":{"text":"No lint script: test \u2713 \u00B7 lint \u2717 \u00B7 typecheck \u2713 \u2014 read from this repository\u0027s package.json scripts and corroborated against its CI workflows. A script counts when its name or command matches the step: \u0060test\u0060 for the suite, \u0060lint\u0060 or \u0060prettier\u0060 for linting, \u0060typecheck\u0060/\u0060type-check\u0060/\u0060tsc\u0060 for type checking. \u2717 therefore means no script or CI step under those names was found, NOT that the step is absent from your pipeline \u2014 a task invoked by a runner this check does not read, or named something else entirely, is not seen and is worth confirming before acting on a cross. A \u2713 means the wiring is DECLARED \u2014 a script or CI step under those names exists. It is not a statement that the step passes, or that it runs at all: nothing here installs a dependency or executes a suite."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bc8e67e81453cf5399dd04786d18b232180426b135169175fee670bdd83ccb03"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~1069 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70a09f5fdaa6443aeb7741cc870aa5260d10831eb4a0291b99da02c7d3a1a6af"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~923 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltraAdvancedDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"518490a36bc3d39aaaac65ef1530ceaa559d640a5489f67a2574db686ef0d853"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~896 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ModelTypeEditor.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f0e71999886e281e04d773fbcf3d8bed1ee0babc26a0844c847c39743bb313"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~755 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/services/CollaborationManager.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bacb0ebf44eaa1eab36f87600dce0056765a5f6fe3cff2e94debeca6f21d510"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~624 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/QuantumConsciousnessInterface.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"636369b2308c5e589a900f07b6c569ff4238413bbc015511a190dba1838ca79c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~623 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/InteractiveWidgets.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80e119ade90762055412477e7e2235c7d40578b2bc8e5e425e261f0e901d52ec"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~622 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/UltimatePerformanceDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f7d1058cbcfe67c8922090e0806d35df125238a18b2be3a0f7b298bf3042356"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~571 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/DynamicUIManager.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/services/ContextualRetrieval.ts"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5c202e880588ff54e07c17ee04954d0102d12726020740a83a2b111f0cb4243"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~562 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DynamicUIManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6153d8b71574777ad470ba096cea2aa38064b1cb11308c291d98a2d45dcee649"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~555 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ToolRegistry.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9794c032a8290fda810276857479e7fea348bd945c184edbed2444fcd372bd21"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~504 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/OAuthManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c75e551088013e96e584341c4519996ff9ac40cc344963c793f57a5887191c"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~481 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/FleetManagementDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"05edf1c61781c9dfae65b099fc1f20f2193557a848feea195715144a357af708"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~477 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/DynamicUIManager.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AdvancedMessageRenderer.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0300c8cfc6c687812f26527db63b203b4f2bba5984adbb986526f061c0937ee7"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~459 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/PipedreamConnectionManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a834520c4ad38f50f4bbe72c2e89e4e9e0ab7acf6a7116eaa88dd5deef8bcb5"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~404 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/MainLayoutWithSidebar.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/ClaudeCLI.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fe3a890323b5cf5c4471789d14239c6496fbc3297703b7f59e5e762827cf5fe"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~329 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/DenseApp.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentQuorumPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3179c160f14c25ee1c7aa579a10506eefffd424f1e1316ee60587f6d5e54322"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~311 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseApp.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"088b8d92b730804731fb08f905e8a6ae0f8cf3bb560c4133b868f39651ab881a"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~301 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/DenseApp.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/AgentCommunicationPanel.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a16988da4ff75cfe45c5e75ecd73814374139ec58763907c20603f244694a50"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~299 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), but 1 in-repo import(s) from 1 other file(s) do name it (apps/agent_web/frontend/src/components/ComprehensiveMCPManager.tsx) \u2014 every one of those referrers is itself unreachable, so this file is dead only as a member of that cluster: if any referrer is in fact alive, this row falls with it"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPOAuthManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e848ab438bba2658ece496fd48157548a76003b9b8299403fb035fa4a5bf11f2"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~298 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MainLayoutWithSidebar.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bc3ee49799e734cdd4c5405ab2a2f7b077ded89a9dac09aa6de338f78f6e9e5"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~294 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/MCPServerManager.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6a9239be314b911986108f7b6c6b13c78f5d5379f4b634ae7c1cb842951ffdb"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~155 LoC): no import path from any entry point (3 application, 3 tooling, 0 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/DenseDashboard.tsx"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66741771be73ecb3d36a31f59fb4b476bc6d165f7ad5e5a577cf145a41e72368"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027sanitizeCss\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/utils/sanitize.ts"},"region":{"startLine":90}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a24a775546f8efee5664cf3252df8891f65662fae5600707c38f5ebdc9c3f1"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027escapeHtml\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/utils/sanitize.ts"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba5c1dcbc50de8a058c0545a9611da2436e3d45b9ab200b5400a3156f82d01d"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027highlight.js\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6192ea0eba19d9d9c8e0bfdd168c63c8a0dda8cb55af772482d201c79f2115"}},{"ruleId":"R8","level":"error","message":{"text":"Unlisted import \u0027katex\u0027: Imported but not declared in any reachable package.json \u2014 installs work only by hoisting accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agent_web/frontend/src/components/SimpleAdvancedChat.tsx"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e95b6f6e1e33991aaa579ddb3997fc9ea17e91cf5233e21e567bd9162053ff"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@headlessui/react\u0027: Declared in apps/agent_web/frontend/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"23989d5cc9b3ae548cb4ea92561647b222c9d6ccc1b35e7c7b18f5d213b32f3c"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@radix-ui/react-alert-dialog\u0027: Declared in apps/agent_web/frontend/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"214456e00dd316aeadb3d12116fd687b53e75fc71391ede990a2f3cc70a86a40"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027@radix-ui/react-dropdown-menu\u0027: Declared in apps/agent_web/frontend/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4253a26c1070d1deb9a81e2ff1e3c7a7b254c6b53d16008cff16d6daedc56196"}},{"ruleId":"S1","level":"warning","message":{"text":"Third-party script without Subresource Integrity: \u0060https://unpkg.com/react@18/umd/react.production.min.js\u0060 is executed by this page with no Subresource Integrity. Whoever can answer that request \u2014 the CDN, anyone who compromises it, anyone on the network path \u2014 runs arbitrary script in this page\u0027s origin, with its session. 6 such include(s) across the repository\u0027s markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/openapi_scaffold/priv/static/playground.html"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"562b0a5e628ed5d5ce52102e38080dafffe531229ff82af45c13b0c2330222f6"}},{"ruleId":"X31","level":"note","message":{"text":"Test-only surface in a production module: \u0060test_basic_agent:test_basic_functionality/0\u0060 is exported unconditionally and its name carries a test marker at a name-segment boundary, so the shipped module publishes a function named for the test tree. No other module in this repository calls it at any arity. Erlang has no visibility below \u0060-export\u0060, so this is part of the module\u0027s public contract: it cannot be changed without a compatibility argument. Nothing tells the next maintainer that its only caller is a test. Wrapping the attribute in \u0060-ifdef(TEST). \u2026 -endif.\u0060 keeps the test\u0027s access and removes it from the shipped module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"apps/agents/test_basic_agent.erl"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f3342054bf56aefa38eedddb1104d83a1b79193c58d4159a6359e1ad78ae35"}},{"ruleId":"X31","level":"note","message":{"text":"Test-only surface in a production module: \u0060simple_test:test/0\u0060 is exported unconditionally and its name IS the test marker, so the shipped module publishes a function named for the test tree. No other module in this repository calls it at any arity. Erlang has no visibility below \u0060-export\u0060, so this is part of the module\u0027s public contract: it cannot be changed without a compatibility argument. Nothing tells the next maintainer that its only caller is a test. Wrapping the attribute in \u0060-ifdef(TEST). \u2026 -endif.\u0060 keeps the test\u0027s access and removes it from the shipped module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"simple_test.erl"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cd299be4b65ea4bfe73c84cb0d90e633f79ed80be997fc2d0e2675236fbfca2"}},{"ruleId":"X31","level":"note","message":{"text":"Test-only surface in a production module: \u0060simple_weather_test:test/0\u0060 is exported unconditionally and its name IS the test marker, so the shipped module publishes a function named for the test tree. No other module in this repository calls it at any arity. Erlang has no visibility below \u0060-export\u0060, so this is part of the module\u0027s public contract: it cannot be changed without a compatibility argument. Nothing tells the next maintainer that its only caller is a test. Wrapping the attribute in \u0060-ifdef(TEST). \u2026 -endif.\u0060 keeps the test\u0027s access and removes it from the shipped module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"simple_weather_test.erl"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7960e1deba05fd5a72321ca8a073060faac3a62a32d5d7e7c94d36e7162c6bd"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"CWE-506","shortDescription":{"text":"CWE-506"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":23,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}