{"$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":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D7","name":"Architectural Integrity","shortDescription":{"text":"Architectural Integrity"},"helpUri":"https://codehealth.canine.dev/dimensions/D7"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"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":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"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":"D22","name":"Internal API Consistency","shortDescription":{"text":"Internal API Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D22"},{"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":"D31","name":"IaC \u0026 Container Security","shortDescription":{"text":"IaC \u0026 Container Security"},"helpUri":"https://codehealth.canine.dev/dimensions/D31","relationships":[{"target":{"id":"CWE-1032","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-732","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-16","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1032","CWE-732","CWE-16"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D36","name":"Supply-chain Provenance \u0026 Signing","shortDescription":{"text":"Supply-chain Provenance \u0026 Signing"},"helpUri":"https://codehealth.canine.dev/dimensions/D36","relationships":[{"target":{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1357","CWE-494"]}},{"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":"D44","name":"Platform End-of-Life","shortDescription":{"text":"Platform End-of-Life"},"helpUri":"https://codehealth.canine.dev/dimensions/D44"},{"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":"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":"AX5","name":"Architecture \u0026 structure","shortDescription":{"text":"Architecture \u0026 structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AX5"},{"id":"AX7","name":"Slice cohesion","shortDescription":{"text":"Slice cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/AX7"},{"id":"AX8","name":"Test isolation","shortDescription":{"text":"Test isolation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX8"},{"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":"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":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"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":"P4","name":"Deployment \u0026 Rollback","shortDescription":{"text":"Deployment \u0026 Rollback"},"helpUri":"https://codehealth.canine.dev/dimensions/P4"},{"id":"P5","name":"DR \u0026 Backup","shortDescription":{"text":"DR \u0026 Backup"},"helpUri":"https://codehealth.canine.dev/dimensions/P5"},{"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":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"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":"robotd::control_loop (cyclomatic 185): robotd::control_loop has cyclomatic complexity 185 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 38 functions over the threshold \u2014 including the worst \u2014 and 217 of the 624 points over it (35%), 2.9\u00D7 the next-largest file (duckctl/src/main.rs at 75). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"7150e960272ca6f47923bb4b665f0b155a4c0b462b005fdb529cc487dc25e18c"}},{"ruleId":"D1","level":"warning","message":{"text":"padd::main (cyclomatic 86): padd::main has cyclomatic complexity 86 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"padd/src/main.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ffcf60dd0280da04a15fe65030c3c2c2316ee7c40a3068e289b876da81cb0d"}},{"ruleId":"D1","level":"warning","message":{"text":"duckctl::run (cyclomatic 61): duckctl::run has cyclomatic complexity 61 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duckctl/src/main.rs"},"region":{"startLine":1362}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c9fc0b5e2462cb539f985b1f7fcf91171c7a80155b42ecf0685ed675d2ade4d"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::configure::run (cyclomatic 55): robotctl::configure::run has cyclomatic complexity 55 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/configure.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4bce6f223ab1be138a37a6e94fb91fa4efb5f0e24c43870081bea1b2faa0ed"}},{"ruleId":"D1","level":"warning","message":{"text":"robotd::dispatch (cyclomatic 51): robotd::dispatch has cyclomatic complexity 51 (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 file is where this pass\u0027s cyclomatic complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 38 functions over the threshold \u2014 including the worst \u2014 and 217 of the 624 points over it (35%), 2.9\u00D7 the next-largest file (duckctl/src/main.rs at 75). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":4298}}}],"partialFingerprints":{"codehealthFindingId/v1":"22f08b578a02fe9a89d186198e1d49341d0d08ae86772e21a77c66571372491b"}},{"ruleId":"D1","level":"warning","message":{"text":"duckctl::request_line (cyclomatic 44): duckctl::request_line has cyclomatic complexity 44 (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":"duckctl/src/main.rs"},"region":{"startLine":2107}}}],"partialFingerprints":{"codehealthFindingId/v1":"08718d603cf9afd7dc16ebca6527d051cf77eeab0e88084cff48863a1bd1438e"}},{"ruleId":"D1","level":"warning","message":{"text":"Server::dispatch (cyclomatic 43): Server::dispatch has cyclomatic complexity 43 (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":"updater/src/ipc.rs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"5030b45b55d2253908eda8bf68150d363e8148b4618d88605428e9638d1de0f1"}},{"ruleId":"D1","level":"warning","message":{"text":"Controller::step (cyclomatic 39): Controller::step has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/control.rs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c1b12b5090477e88515656ef98c21fa8d1f34e9d485b8a8b9aeabb2132aeed"}},{"ruleId":"D1","level":"warning","message":{"text":"mediad::main (cyclomatic 34): mediad::main has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/main.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3fc1b120b5aff9b80a8b7a9431a6fbd36d3c05cf7ca94d9795d61576fbeba50"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::run (cyclomatic 30): robotctl::run has cyclomatic complexity 30 (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":"robotctl/src/main.rs"},"region":{"startLine":4925}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fef62d8f3dc4c48eab688b185d7f7392027a9cf067fcef0362cfac2c0c5a3ce"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::render_health (cyclomatic 29): robotctl::render_health has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":1751}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e4b7e943afb92d5fbd006419a425ad81443e36b547d894bd4be02cde3042121"}},{"ruleId":"D1","level":"warning","message":{"text":"sounds::chorale::midi::parse (cyclomatic 29): sounds::chorale::midi::parse has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sounds/src/chorale/midi.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"0beb4747b0f5574ea1b73e5d9ddf8d5a21cb8cd8f80428bd83bec10ee0a620e2"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::run_policy (cyclomatic 27): robotctl::run_policy has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":3472}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a2e974c63493730069ec170b1b34b8a895b2ce70687b2f6fa6e981b6a414485"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::configure::draw (cyclomatic 26): robotctl::configure::draw has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/configure.rs"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf506865dd2e3f30c38e09e6e3022e10a259d95280b60a318c4422bf24f57e71"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::monitor::live (cyclomatic 26): robotctl::monitor::live 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":"robotctl/src/monitor.rs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"204e6ec00f79a53b487e85b67d13570de63c8ad52ee6a91294331f4742c39972"}},{"ruleId":"D1","level":"warning","message":{"text":"robotd::handle (cyclomatic 24): robotd::handle 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 38 functions over the threshold \u2014 including the worst \u2014 and 217 of the 624 points over it (35%), 2.9\u00D7 the next-largest file (duckctl/src/main.rs at 75). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":3581}}}],"partialFingerprints":{"codehealthFindingId/v1":"043c178a28f6de1b3dc0bd6dbdaf7b6fd2796c0178b7721a1c6e6d34b3acba3b"}},{"ruleId":"D1","level":"warning","message":{"text":"configd::dispatch (cyclomatic 23): configd::dispatch 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":"configd/src/main.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"84f16b8f448c2ea0872068cde1016d3e0fe86053f7b04dbf4d8f3e41a4cc1f0b"}},{"ruleId":"D1","level":"warning","message":{"text":"BlueZ::bond (cyclomatic 21): BlueZ::bond 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":"configd/src/bluez.rs"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"e595694a94bff91127e56d6b35e14fe71dbf7597e929132042cd04046b4a79f6"}},{"ruleId":"D1","level":"warning","message":{"text":"NetworkManager::connect (cyclomatic 21): NetworkManager::connect has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/nm.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5dbada4759fff2f1f65e16e838476c117e1803b0e89fdedbcfbccba72334546"}},{"ruleId":"D1","level":"warning","message":{"text":"View::power (cyclomatic 21): View::power has cyclomatic complexity 21 (threshold 15). 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":"robotctl/src/monitor.rs"},"region":{"startLine":2122}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e82637c67f13e741b83863ce350dd0e7c435a8b2f3739a4ddbe14c862ee73f6"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::run_pad_bindings (cyclomatic 21): robotctl::run_pad_bindings has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":4348}}}],"partialFingerprints":{"codehealthFindingId/v1":"741d7d6c856b8dc00f116144f6b6a1b654c2af2186f4d75f4c8a2b6c7ad0e7eb"}},{"ruleId":"D1","level":"warning","message":{"text":"updater::install (cyclomatic 21): updater::install 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":"updater/src/main.rs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"1466a44571c81dd8b43fb5d5fc8d8218ad20c887e232adf65d3ef6b5f3339c29"}},{"ruleId":"D1","level":"warning","message":{"text":"hub.readHub (cyclomatic 21): hub.readHub has cyclomatic complexity 21 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/policy-playground/web/src/hub.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5be327d9254b740e0c630565002e1fa31687fc4c782ca7d663febd9ff840f44"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::show::event_line (cyclomatic 20): robotctl::show::event_line 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":"robotctl/src/show.rs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5cafbd848eb31510a00b61af411ed5f57c56377be04b1f8a17af5ba46da9edb"}},{"ruleId":"D1","level":"warning","message":{"text":"Relay::session (cyclomatic 18): Relay::session 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":"mediad/src/relay.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc8ea77b33bae0f5a799881c430ccd4309abab711148ba0d6ac6fc9bbb32ed1a"}},{"ruleId":"D1","level":"warning","message":{"text":"Model::edit (cyclomatic 18): Model::edit 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":"robotd-params/src/edit.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc635e7d1dbf2ea9d957da1d26cac6ddfe0771004ae05ef3b12377908d058f95"}},{"ruleId":"D1","level":"warning","message":{"text":"updater::source::http::attempt_download (cyclomatic 18): updater::source::http::attempt_download has cyclomatic complexity 18 (threshold 15). 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":"updater/src/source/http.rs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"477a8f72733064779f4b1b40fe6fed3e717b190b54a98b2d381da931dcac9720"}},{"ruleId":"D1","level":"warning","message":{"text":"Streamer::start (cyclomatic 17): Streamer::start has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/stream.rs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"400e46c2415a7f425769d5dc331916ff2b9cf1825c71e6fe2c2f5bbac7271db6"}},{"ruleId":"D1","level":"warning","message":{"text":"Sound::sing_start (cyclomatic 17): Sound::sing_start has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/sound.rs"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c2cbf8aa15168c5b98b9273019fccea88bb2bc19ba527f2048855687733a967"}},{"ruleId":"D1","level":"warning","message":{"text":"robotd::load_policy_request (cyclomatic 17): robotd::load_policy_request 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. This file is where this pass\u0027s cyclomatic complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 38 functions over the threshold \u2014 including the worst \u2014 and 217 of the 624 points over it (35%), 2.9\u00D7 the next-largest file (duckctl/src/main.rs at 75). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":4127}}}],"partialFingerprints":{"codehealthFindingId/v1":"883787c3d72edc7bf0fa82cb04894cba7caea1c5240ab2f48fe93052cc58717b"}},{"ruleId":"D1","level":"warning","message":{"text":"sounds::main (cyclomatic 17): sounds::main 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":"sounds/src/main.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ac035b00dc83b874ac8f984656aa0c30bd59d543383b4de66668b538438e06d"}},{"ruleId":"D1","level":"warning","message":{"text":"Engine::apply_inner (cyclomatic 17): Engine::apply_inner 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":"updater/src/engine.rs"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab20937b81f2369c4d9ce161cf74ec91dc50968014b5d8efad20004f3330faa2"}},{"ruleId":"D1","level":"warning","message":{"text":"main.card (cyclomatic 17): main.card has cyclomatic complexity 17 (threshold 15). 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":"spaces/policy-playground/web/src/main.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e15c25d75d8c0c2d3246a961e581f2419f469b2ea4fa7c40e80afd40757c906"}},{"ruleId":"D1","level":"warning","message":{"text":"BlueZ::pair (cyclomatic 16): BlueZ::pair has cyclomatic complexity 16 (threshold 15). 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":"configd/src/bluez.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"6084843a6aabad75f9d71913896be61dcc023f3bfb9c8db1aa96a3508965ca2f"}},{"ruleId":"D1","level":"warning","message":{"text":"duck_detect::bin::duck-bench::main (cyclomatic 16): duck_detect::bin::duck-bench::main has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-detect/src/bin/duck-bench.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b5ef7bac041d39b9954e2248ddc582b073bcda952c87360938652782a8bc38"}},{"ruleId":"D1","level":"warning","message":{"text":"robotctl::print_result (cyclomatic 16): robotctl::print_result 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. This is NOT this file\u0027s highest cyclomatic complexity: robotctl::run_robot (cyclomatic 18) 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":"robotctl/src/main.rs"},"region":{"startLine":5121}}}],"partialFingerprints":{"codehealthFindingId/v1":"439fa99afa11d695b7aa753aa2928efdbe0d3e0ae574a530184cdb0f3df2b3bf"}},{"ruleId":"D1","level":"warning","message":{"text":"Config::validate (cyclomatic 16): Config::validate has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/config.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e43317bb59254dff23066cea45550923a7b282dc1267bd9e054986106eeb23f"}},{"ruleId":"D1","level":"warning","message":{"text":"Engine::stage_and_swap (cyclomatic 16): Engine::stage_and_swap has cyclomatic complexity 16 (threshold 15). 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":"updater/src/engine.rs"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e869676eac9909d0845d2d1b73fc35e9fd0af285491a585de97399bc0ddd3b6"}},{"ruleId":"D2","level":"warning","message":{"text":"robotd::control_loop (cognitive 462): robotd::control_loop has cognitive complexity 462 (threshold 15). Drivers by points: if/else 111 (284 pts), match/switch 28 (94 pts), boolean chains 46, loops 12 (38 pts) (nesting depth added 265). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function. This file is where this pass\u0027s cognitive complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 77 functions over the threshold \u2014 including the worst \u2014 and 504 of the 1464 points over it (34%), 3.2\u00D7 the next-largest file (padd/src/main.rs at 160). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdb2f8ae7b92554cf209e94e5db66e4d74b266f4b2e09923f136fe8dfd7dca8f"}},{"ruleId":"D2","level":"warning","message":{"text":"padd::main (cognitive 175): padd::main has cognitive complexity 175 (threshold 15). Drivers by points: if/else 54 (125 pts), match/switch 14 (36 pts), boolean chains 7, loops 4 (7 pts) (nesting depth added 96). 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":"padd/src/main.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"550bb91d9296075672daa03f888a05de4bc82db7dce8f8e5a3bb9044a2d5db11"}},{"ruleId":"D2","level":"warning","message":{"text":"duckctl::run (cognitive 102): duckctl::run has cognitive complexity 102 (threshold 15). Drivers by points: if/else 39 (76 pts), match/switch 6 (12 pts), boolean chains 7, loops 5 (7 pts) (nesting depth added 45). 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":"duckctl/src/main.rs"},"region":{"startLine":1362}}}],"partialFingerprints":{"codehealthFindingId/v1":"80c23f897e05a02472c6ec5fd907115a6e538990ee5b8b1821c5a731747501a4"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::configure::run (cognitive 95): robotctl::configure::run has cognitive complexity 95 (threshold 15). Drivers by points: if/else 22 (59 pts), match/switch 11 (34 pts), loops 2 (nesting depth added 60). 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":"robotctl/src/configure.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"77d731b9c7b68372b86e99d6ee7af0fbaa77a9c8bbbfd37d2d0105bad11cffa3"}},{"ruleId":"D2","level":"warning","message":{"text":"sounds::chorale::midi::parse (cognitive 62): sounds::chorale::midi::parse has cognitive complexity 62 (threshold 15). Drivers by points: if/else 16 (41 pts), match/switch 3 (12 pts), loops 3 (5 pts), boolean chains 4 (nesting depth added 36). 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":"sounds/src/chorale/midi.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e72e4a9c5544eecc1080609967c43f5e622450d3275f1a703b77d38201c784"}},{"ruleId":"D2","level":"warning","message":{"text":"Controller::step (cognitive 61): Controller::step has cognitive complexity 61 (threshold 15). Drivers by points: if/else 23 (38 pts), boolean chains 8, match/switch 5 (8 pts), loops 3 (7 pts) (nesting depth added 22). 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":"robotd/src/control.rs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"648f928ffd387d389f14d8cd19a48c876ea0a720c54d3a02f3da11fcf65ec55a"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::main (cognitive 58): mediad::main has cognitive complexity 58 (threshold 15). Drivers by points: if/else 24 (34 pts), match/switch 12 (18 pts), loops 3 (6 pts) (nesting depth added 19). 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":"mediad/src/main.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9db611618b1de29cc442cad9959c87ecbbd95988ef53ab9cb7b26c6cdc45b7f"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::configure::draw (cognitive 45): robotctl::configure::draw has cognitive complexity 45 (threshold 15). Drivers by points: if/else 22 (36 pts), match/switch 5 (7 pts), boolean chains 1, loops 1 (nesting depth added 16). 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":"robotctl/src/configure.rs"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f98f241376fb1869f1bf6b8043a97023323f2592475ef1b9dcb1d919695f5bf"}},{"ruleId":"D2","level":"warning","message":{"text":"robotd::handle (cognitive 45): robotd::handle has cognitive complexity 45 (threshold 15). Drivers by points: match/switch 9 (24 pts), if/else 8 (20 pts), loops 1 (nesting depth added 27). 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. This file is where this pass\u0027s cognitive complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 77 functions over the threshold \u2014 including the worst \u2014 and 504 of the 1464 points over it (34%), 3.2\u00D7 the next-largest file (padd/src/main.rs at 160). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":3581}}}],"partialFingerprints":{"codehealthFindingId/v1":"c67ce7d7a6162a9c9f9d78f50063e75e4b0177d5a0fd81a3e3c8769945618f10"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::render_health (cognitive 42): robotctl::render_health has cognitive complexity 42 (threshold 15). Drivers by points: if/else 15 (24 pts), match/switch 7 (15 pts), loops 3 (nesting depth added 17). 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":"robotctl/src/main.rs"},"region":{"startLine":1751}}}],"partialFingerprints":{"codehealthFindingId/v1":"a03f032e5a0c70904a505a851c769dbe200b7462a5e1e8015f9050aafd5e636c"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::run_policy (cognitive 42): robotctl::run_policy has cognitive complexity 42 (threshold 15). Drivers by points: if/else 16 (29 pts), match/switch 5 (9 pts), loops 2 (4 pts) (nesting depth added 19). 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":"robotctl/src/main.rs"},"region":{"startLine":3472}}}],"partialFingerprints":{"codehealthFindingId/v1":"03a34cf2d9f04dd53757ba3d2dec71cba36252c1ac419697eb6a13fb33fd42fd"}},{"ruleId":"D2","level":"warning","message":{"text":"duck_ether::serve (cognitive 39): duck_ether::serve has cognitive complexity 39 (threshold 15). Drivers by points: if/else 9 (31 pts), loops 2 (4 pts), boolean chains 2, match/switch 1 (2 pts) (nesting depth added 25). 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":"duck-ether/src/main.rs"},"region":{"startLine":248}}}],"partialFingerprints":{"codehealthFindingId/v1":"2eb99eb905678edb7d69cdea2f29c2621768d2bdb9f88fa08671d0ce85f88ffc"}},{"ruleId":"D2","level":"warning","message":{"text":"robotd::dispatch (cognitive 38): robotd::dispatch has cognitive complexity 38 (threshold 15). Drivers by points: if/else 22 (31 pts), match/switch 3 (5 pts), boolean chains 2 (nesting depth added 11). 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. This file is where this pass\u0027s cognitive complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 77 functions over the threshold \u2014 including the worst \u2014 and 504 of the 1464 points over it (34%), 3.2\u00D7 the next-largest file (padd/src/main.rs at 160). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":4298}}}],"partialFingerprints":{"codehealthFindingId/v1":"48ea69a14e88f1e57966fe5faccabb09149eba59c00e076e086646a8e4f88ed1"}},{"ruleId":"D2","level":"warning","message":{"text":"Score::from_gestures (cognitive 34): Score::from_gestures has cognitive complexity 34 (threshold 15). Drivers by points: if/else 5 (19 pts), loops 5 (13 pts), match/switch 1 (2 pts) (nesting depth added 23). 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":"sounds/src/chorale/mod.rs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba81728e15bf5b02d90635a91dd2958c1356626a7097e45024b1233ae55b9f7"}},{"ruleId":"D2","level":"warning","message":{"text":"btd::chorale::radio::run (cognitive 33): btd::chorale::radio::run has cognitive complexity 33 (threshold 15). Drivers by points: if/else 6 (20 pts), match/switch 4 (12 pts), loops 1 (nesting depth added 22). 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":"btd/src/chorale.rs"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d47add521e8e0055e9ce8b892fef77e8d9463f46cb9b676c75f8f3890e2583"}},{"ruleId":"D2","level":"warning","message":{"text":"NetworkManager::connect (cognitive 33): NetworkManager::connect has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (20 pts), match/switch 5 (8 pts), boolean chains 4, loops 1 (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":"configd/src/nm.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"24c06ba174e00ef03abfaf1e807e39cec44afb91d5bac267843a75c59ad0c215"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::run_pad_bindings (cognitive 33): robotctl::run_pad_bindings has cognitive complexity 33 (threshold 15). Drivers by points: if/else 15 (21 pts), loops 3 (6 pts), match/switch 2 (5 pts), boolean chains 1 (nesting depth added 12). 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":"robotctl/src/main.rs"},"region":{"startLine":4348}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf6199386278cfbed5f3aaeb4144c4e5bc96dd9813806babd8ecf81ae91451c9"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::dispatch (cognitive 33): Server::dispatch has cognitive complexity 33 (threshold 15). Drivers by points: match/switch 15 (29 pts), if/else 2 (3 pts), boolean chains 1 (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":"updater/src/ipc.rs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ad0ce0037e27f735e338673e2b346d8ac4ffe475020512a6f1e2affc10456d3"}},{"ruleId":"D2","level":"warning","message":{"text":"BlueZ::bond (cognitive 31): BlueZ::bond has cognitive complexity 31 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 6 (15 pts), boolean chains 1 (nesting depth added 16). 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":"configd/src/bluez.rs"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"b56e72718da816db59845013fac8d2356a610a5ae7befec5ff33866bf8bd9b69"}},{"ruleId":"D2","level":"warning","message":{"text":"hub.readHub (cognitive 31): hub.readHub has cognitive complexity 31 (threshold 15). Drivers by points: if/else 6 (13 pts), ternaries 5 (9 pts), loops 4 (6 pts), boolean chains 2, error handling 1 (nesting depth added 13). Of this number, 30 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"spaces/policy-playground/web/src/hub.ts"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2e1941db2bd8a4ca055ced66eaccff98961ed2d6bfab44000c8f8614ae21d62"}},{"ruleId":"D2","level":"warning","message":{"text":"duck_detect::bin::duck-bench::main (cognitive 30): duck_detect::bin::duck-bench::main has cognitive complexity 30 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 4 (5 pts), boolean chains 1, match/switch 1 (nesting depth added 14). 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":"duck-detect/src/bin/duck-bench.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2d2b19e0a0e4b536e7fddadc32d524e2db204c72a38fad2ca74cfdc0f8b67a6"}},{"ruleId":"D2","level":"warning","message":{"text":"btd::session::run (cognitive 28): btd::session::run has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (18 pts), match/switch 2 (5 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 17). 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":"btd/src/session.rs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e4180db367e28d5c456203516acae441bbf800dad1d4b2fa4d822eef25a37c"}},{"ruleId":"D2","level":"warning","message":{"text":"Relay::session (cognitive 28): Relay::session has cognitive complexity 28 (threshold 15). Drivers by points: if/else 5 (15 pts), match/switch 6 (12 pts), loops 1 (nesting depth added 16). 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":"mediad/src/relay.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d01a7ec2f7ece411c69172a209230aea1c3aea18e5645cfbd0dda9834b64392"}},{"ruleId":"D2","level":"warning","message":{"text":"View::power (cognitive 27): View::power has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (18 pts), match/switch 3 (5 pts), boolean chains 2, loops 2 (nesting depth added 5). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":2122}}}],"partialFingerprints":{"codehealthFindingId/v1":"da187ccae03b4e2db8447a139d6fb6f8c9f9816f2fa3071207104bdedaaec18b"}},{"ruleId":"D2","level":"warning","message":{"text":"padd::tap::stream_imu (cognitive 26): padd::tap::stream_imu has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (15 pts), match/switch 3 (7 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 15). 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":"padd/src/tap.rs"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"658ac3a8a7f772d52828422f3b4296de242440d297e7bad8acf8390bdc2d8dbd"}},{"ruleId":"D2","level":"warning","message":{"text":"Streamer::start (cognitive 25): Streamer::start has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 3 (6 pts), boolean chains 3, loops 1 (nesting depth added 10). 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":"mediad/src/stream.rs"},"region":{"startLine":400}}}],"partialFingerprints":{"codehealthFindingId/v1":"235366a5db6cac5b57795e0d23aca782cca34ffab3a0dcf1056d52d8053921de"}},{"ruleId":"D2","level":"warning","message":{"text":"SoundSentry::frame (cognitive 25): SoundSentry::frame has cognitive complexity 25 (threshold 15). Drivers by points: if/else 16 (24 pts), boolean chains 1 (nesting depth added 8). 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":"pet-detect/src/worker.rs"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"020f745d6e890ada9f1d9e7527eaf53e193df6cb029ce599aaa6b453a07587f8"}},{"ruleId":"D2","level":"warning","message":{"text":"Sound::sing_start (cognitive 25): Sound::sing_start has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 4, loops 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 8). 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":"robotd/src/sound.rs"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"e01bc7bdd0f2f69c6d7d8b1418686d3d332a40400dbd4bef1de98e49f3a4902d"}},{"ruleId":"D2","level":"warning","message":{"text":"Server::check_all (cognitive 25): Server::check_all has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (17 pts), match/switch 4 (7 pts), loops 1 (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":"updater/src/ipc.rs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"341f031996482a40fc3e5f69b2808bd42b297dab54f65be3131d173b34c801e6"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::exposure::spawn (cognitive 24): mediad::exposure::spawn has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (14 pts), match/switch 3 (8 pts), boolean chains 1, loops 1 (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":"mediad/src/exposure.rs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2fce8462c4110a3b865cadef28eff240244488fe7bc79af36fa352516e7ec38"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::print_result (cognitive 24): robotctl::print_result has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 5 (11 pts), if/else 4 (7 pts), loops 2 (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":"robotctl/src/main.rs"},"region":{"startLine":5121}}}],"partialFingerprints":{"codehealthFindingId/v1":"7611ce1af361e6747dac7923aa706759f6f60e41e945401b378d811ad03903de"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::relay::carry (cognitive 23): mediad::relay::carry has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (14 pts), match/switch 3 (7 pts), loops 2 (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":"mediad/src/relay.rs"},"region":{"startLine":1322}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a20aa0ff30b7526cde4935e38956511d2ef5033692f41b88bea69f30403369f"}},{"ruleId":"D2","level":"warning","message":{"text":"Config::validate (cognitive 23): Config::validate has cognitive complexity 23 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 3 (5 pts), boolean chains 3 (nesting depth added 8). 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":"updater/src/config.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"485a96efc991d9a9bb9a1c5ce291b485f51de313e0c8adab23a2eabac42cde28"}},{"ruleId":"D2","level":"warning","message":{"text":"Chorale::heard (cognitive 22): Chorale::heard has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 4, match/switch 1 (nesting depth added 8). 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":"robotd/src/chorale.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"d12c8f89414aa06f500ee31207df491236c54b65f1e49197453fafc1dc09d7de"}},{"ruleId":"D2","level":"warning","message":{"text":"tof::sensor_loop (cognitive 22): tof::sensor_loop has cognitive complexity 22 (threshold 15). Drivers by points: match/switch 3 (11 pts), if/else 2 (7 pts), loops 2 (4 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":"tof/src/main.rs"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc2731f891c78ffe79b3ffae4ea43454010bc01ea0ae50be7ecade6cfe85ca49"}},{"ruleId":"D2","level":"warning","message":{"text":"Engine::recover_on_start (cognitive 22): Engine::recover_on_start has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (14 pts), match/switch 2 (5 pts), loops 2, boolean chains 1 (nesting depth added 10). 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":"updater/src/engine.rs"},"region":{"startLine":1844}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06763b6a31ed0f7a19ade4861523058d148defea38e03792830c46231fb3750"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::pipeline::find_sensor (cognitive 21): mediad::pipeline::find_sensor has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 2 (3 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 10). 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":"mediad/src/pipeline.rs"},"region":{"startLine":1629}}}],"partialFingerprints":{"codehealthFindingId/v1":"bae7920f32acd6c21b8e16e62e21078b99e8f2629a7a9a40939194ec06f38a60"}},{"ruleId":"D2","level":"warning","message":{"text":"View::render (cognitive 21): View::render has cognitive complexity 21 (threshold 15). Drivers by points: if/else 16 (19 pts), match/switch 1 (2 pts) (nesting depth added 4). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":1605}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ab18b31b02c68f6c7683ca5cb0b259bfcb92b299ea023baf6e6b07988cc8af3"}},{"ruleId":"D2","level":"warning","message":{"text":"Sound::theremin_start (cognitive 21): Sound::theremin_start has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (16 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 6). 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":"robotd/src/sound.rs"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b6a533f7dcd8117d4932c6420acdbdd763d8244cb215208d253b93ef50386a1"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::detect::spawn (cognitive 20): mediad::detect::spawn has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (16 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 10). 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":"mediad/src/detect.rs"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae0bd32af562cb1308ced8413682ecdf77dc2a2e8d5d085a494e16914450c61e"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::monitor::live (cognitive 20): robotctl::monitor::live has cognitive complexity 20 (threshold 15). Drivers by points: match/switch 4 (12 pts), loops 3 (5 pts), if/else 1 (2 pts), boolean chains 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":"robotctl/src/monitor.rs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e1710cbd840c94bbc3fdcbb071c6aee8b806fb3601bcf24799fe130635e049e"}},{"ruleId":"D2","level":"warning","message":{"text":"BlueZ::pair (cognitive 19): BlueZ::pair has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (14 pts), match/switch 2 (3 pts), boolean chains 2 (nesting depth added 4). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/bluez.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"7336b35b0e419ac446f9d099d7131b2629650fccbd04e0d97446db0f00c3009a"}},{"ruleId":"D2","level":"warning","message":{"text":"duck_ether::nearby (cognitive 19): duck_ether::nearby has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), match/switch 1 (3 pts), loops 1 (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":"duck-ether/src/main.rs"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ab89d0ee0df476f9815e97399139c74dc15b56f332f4b7ea462cc0a1ae0d26f"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::run_chorale (cognitive 19): robotctl::run_chorale has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 3 (7 pts), loops 1 (nesting depth added 8). 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":"robotctl/src/main.rs"},"region":{"startLine":687}}}],"partialFingerprints":{"codehealthFindingId/v1":"7045ddf693d0e19cdc7f9c77ad26e0e1cd8be47496d32aa3cca13b3ebb89460b"}},{"ruleId":"D2","level":"warning","message":{"text":"robotd::load_policy_request (cognitive 19): robotd::load_policy_request has cognitive complexity 19 (threshold 15). Drivers by points: match/switch 8 (11 pts), if/else 5 (7 pts), boolean chains 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. This file is where this pass\u0027s cognitive complexity CONCENTRATES: robotd/src/main.rs holds 4 of the 77 functions over the threshold \u2014 including the worst \u2014 and 504 of the 1464 points over it (34%), 3.2\u00D7 the next-largest file (padd/src/main.rs at 160). No single row can show this, because each is measured only against the threshold: reducing this one file moves this dimension further than any other file in the repository."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":4127}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9fd6fd23cd4fcf6827f8420f80eb86fc88829ea264071ba447ce3347bb6ad4"}},{"ruleId":"D2","level":"warning","message":{"text":"Personality::harmonics (cognitive 19): Personality::harmonics has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 1, loops 1 (nesting depth added 7). 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":"sounds/src/personality.rs"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7e4a82548f03303a2ca96d31b62525763c466165e44b322989888f327c2c2e"}},{"ruleId":"D2","level":"warning","message":{"text":"Stream::block (cognitive 19): Stream::block has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 2 (3 pts), boolean chains 2 (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":"sounds/src/stream.rs"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d1354ab380ef016f28672a3cb5dc66af79441f9fda27eb9c94fb4d01d548664"}},{"ruleId":"D2","level":"warning","message":{"text":"sounds::chorale::text::parse (cognitive 19): sounds::chorale::text::parse has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (13 pts), match/switch 2 (5 pts), loops 1 (nesting depth added 10). 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":"sounds/src/chorale/text.rs"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d2ddf0215e361ac845053aeef60a7d4ac4283fb9af9ff847ef59a9d0661abec"}},{"ruleId":"D2","level":"warning","message":{"text":"sounds::main (cognitive 19): sounds::main has cognitive complexity 19 (threshold 15). Drivers by points: if/else 4 (8 pts), match/switch 5 (8 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 8). 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":"sounds/src/main.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"9332a48853979026de86d6cf68f99be32de3b8765540f02bb1bbe190edd45dd9"}},{"ruleId":"D2","level":"warning","message":{"text":"Relay::handle (cognitive 18): Relay::handle has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (17 pts), match/switch 1 (nesting depth added 8). 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":"mediad/src/relay.rs"},"region":{"startLine":905}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf3d506560e22fe4aecce7ec89d59d76045e980de859f9621de1ed91aa23d4d"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::pipeline::meter_capture_rate (cognitive 18): mediad::pipeline::meter_capture_rate has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 1, match/switch 1 (nesting depth added 9). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/pipeline.rs"},"region":{"startLine":1824}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be0558182fa4d8e14a157630572799cb9840b50b6698df1cb6000d30d82fc73"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::stream::carry (cognitive 18): mediad::stream::carry has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (9 pts), match/switch 3 (8 pts), loops 1 (nesting depth added 11). 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":"mediad/src/stream.rs"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"d15ff48701c654e389d60519d8b3143c7b348b0763cb8d198e4e90f560f9a7fc"}},{"ruleId":"D2","level":"warning","message":{"text":"DuckView::draw (cognitive 18): DuckView::draw has cognitive complexity 18 (threshold 15). Drivers by points: loops 6 (8 pts), if/else 4 (5 pts), boolean chains 3, match/switch 1 (2 pts) (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":"robotctl/src/duck.rs"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ba4a4aea095000b02be0d765f6eb208239d01d342921a02228e9bd559630f1"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::monitor::subscribe_to_tof (cognitive 18): robotctl::monitor::subscribe_to_tof has cognitive complexity 18 (threshold 15). Drivers by points: if/else 3 (11 pts), match/switch 2 (5 pts), boolean chains 1, loops 1 (nesting depth added 11). 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":"robotctl/src/monitor.rs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca84e0b56eae06872dbf8b19fd25b4a208bfdc48dc12e3ab442db98b30a2dba"}},{"ruleId":"D2","level":"warning","message":{"text":"updater::source::http::attempt_download (cognitive 18): updater::source::http::attempt_download has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (11 pts), boolean chains 4, match/switch 1 (2 pts), loops 1 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. 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":"updater/src/source/http.rs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"85dee32cd12445d29a711b22b30baf149a3d2b618380ed677ff1d81a97011962"}},{"ruleId":"D2","level":"warning","message":{"text":"xtask::package (cognitive 18): xtask::package has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (12 pts), boolean chains 3, loops 2, match/switch 1 (nesting depth added 3). 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":"xtask/src/main.rs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"df2abde29136581cc751c4349908768d71d58e3b5306a328834eab1c5d7c7e43"}},{"ruleId":"D2","level":"warning","message":{"text":"btd::bluez::reconcile_advertisement (cognitive 17): btd::bluez::reconcile_advertisement has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (13 pts), match/switch 1 (2 pts), boolean chains 1, loops 1 (nesting depth added 7). 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":"btd/src/bluez.rs"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"e88d336f04c3d133e4f98a7263a45331e99a98460e76a1f16088506354297aa6"}},{"ruleId":"D2","level":"warning","message":{"text":"duckctl::request_line (cognitive 17): duckctl::request_line has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (14 pts), match/switch 2 (3 pts) (nesting depth added 6). 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":"duckctl/src/main.rs"},"region":{"startLine":2107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca0ea3ce4d0183ef52774b84291078ac53810f991974ab146e17f7bfe105fe6b"}},{"ruleId":"D2","level":"warning","message":{"text":"padd::tap::stream (cognitive 17): padd::tap::stream has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 2 (3 pts), match/switch 2 (3 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":"padd/src/tap.rs"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"5334c73df807ae196259a976c67b201b13ee13ecb11c5d9cc80551328e5de31e"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::run_policy_skill (cognitive 17): robotctl::run_policy_skill has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13 (15 pts), match/switch 2 (nesting depth added 2). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":3747}}}],"partialFingerprints":{"codehealthFindingId/v1":"4280410842801d6ee3012e1adcd6b81176f8346c2f89bdc2b3fdd77980fa8497"}},{"ruleId":"D2","level":"warning","message":{"text":"Sound::start_wheee (cognitive 17): Sound::start_wheee has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 4 (5 pts) (nesting depth added 5). 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":"robotd/src/sound.rs"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a731c704ab57272844e5b40d2f1553a80a78f6d68d68a5552710473b5ec38d3"}},{"ruleId":"D2","level":"warning","message":{"text":"Engine::stage_and_swap (cognitive 17): Engine::stage_and_swap has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (11 pts), match/switch 3 (5 pts), loops 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. 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":"updater/src/engine.rs"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"63bb8c792240399b30a11a1ca30522f21c85d4a00ce1c21b3877a1831fae8b2a"}},{"ruleId":"D2","level":"warning","message":{"text":"updater::install (cognitive 17): updater::install has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 7 (9 pts), if/else 4 (7 pts), 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":"updater/src/main.rs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7699f7a024d18cd3e83129ab6b002b781f4b0e6f6448212e78c83214436d23"}},{"ruleId":"D2","level":"warning","message":{"text":"WsConsumer._pump (cognitive 17): WsConsumer._pump has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 2 (3 pts), boolean chains 1, error handling 1 (nesting depth added 7). 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":"spaces/shared/wire.py"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"40e0836f034543a61ff05306d35bb354f2d92f081106ce5dea83997b18d6de59"}},{"ruleId":"D2","level":"warning","message":{"text":"main.header (cognitive 17): main.header has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (8 pts), ternaries 2 (5 pts), boolean chains 2, loops 1 (2 pts) (nesting depth added 6). Of this number, 16 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"spaces/policy-playground/web/src/main.ts"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"c631bd0821390f30daaefa3674e8c1d175cff99c8d826dee6a834163f12c0f38"}},{"ruleId":"D2","level":"warning","message":{"text":"btd::session::dispatch (cognitive 16): btd::session::dispatch has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 8 (11 pts), if/else 3 (4 pts), 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":"btd/src/session.rs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03b9c1f50737c68c1ef40469752811f49cadd5221e741b2fcfe307eb849bb08"}},{"ruleId":"D2","level":"warning","message":{"text":"NetworkManager::scan (cognitive 16): NetworkManager::scan has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (8 pts), match/switch 2 (5 pts), loops 2 (3 pts) (nesting depth added 7). 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":"configd/src/nm.rs"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b740683703e67231ac5f1b2b0de90282a728d38042555255de101c4e2ca99d1"}},{"ruleId":"D2","level":"warning","message":{"text":"mediad::session::handle (cognitive 16): mediad::session::handle has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 7 (12 pts), if/else 3 (4 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":"mediad/src/session.rs"},"region":{"startLine":146}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c183664dc897aa2a163a68abcf66df7c9d213cee6f5daf7d2a0f9bb8268dbdf"}},{"ruleId":"D2","level":"warning","message":{"text":"PadView::frame (cognitive 16): PadView::frame has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12 (15 pts), loops 1 (nesting depth added 3). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":1151}}}],"partialFingerprints":{"codehealthFindingId/v1":"abd92245814cd9144e41c6069a00164ccd70e4e9242faeae383da64daf9bb454"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::show::render (cognitive 16): robotctl::show::render has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 3, boolean chains 2 (nesting depth added 5). 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":"robotctl/src/show.rs"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4638cc2a8fc5b8630d20e1c0ab19dce174a6b4a745fe3774b6d1352527f0b63"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::show::event_line (cognitive 16): robotctl::show::event_line has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), match/switch 4 (6 pts), loops 1 (2 pts) (nesting depth added 7). 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":"robotctl/src/show.rs"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"307ee83f8e5be955e2684371664eb5f8924315c685fbc9dc6697917ccd619275"}},{"ruleId":"D2","level":"warning","message":{"text":"robotctl::render_policies (cognitive 16): robotctl::render_policies has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (11 pts), loops 2 (3 pts), match/switch 1 (2 pts) (nesting depth added 4). 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, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":4171}}}],"partialFingerprints":{"codehealthFindingId/v1":"4298f51fec64b168b4207856b50dfdb6e474a6e99027fec3f74abe3623756e3c"}},{"ruleId":"D2","level":"warning","message":{"text":"Model::edit (cognitive 16): Model::edit has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (8 pts), boolean chains 3, match/switch 2 (3 pts), loops 1 (2 pts) (nesting depth added 6). 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":"robotd-params/src/edit.rs"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"98464e6e906fbef76bd009291ec85de4c16acff20d73221fa5f9f2da2c5507a4"}},{"ruleId":"D2","level":"warning","message":{"text":"tof::imu::imu_loop (cognitive 16): tof::imu::imu_loop has cognitive complexity 16 (threshold 15). Drivers by points: if/else 2 (7 pts), match/switch 2 (5 pts), loops 2 (3 pts), boolean chains 1 (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":"tof/src/imu.rs"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff021e55f68b97f1d06c32a3956a81f9148ab50081d91167040561be26d043a"}},{"ruleId":"D2","level":"warning","message":{"text":"updater::policy::fetch (cognitive 16): updater::policy::fetch has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), boolean chains 3, loops 2, match/switch 2 (nesting depth added 3). 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":"updater/src/policy.rs"},"region":{"startLine":1273}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9b3c6effae9911d076ed098c935edf4f2f967b79b9a911424657ed69b312fd"}},{"ruleId":"D2","level":"warning","message":{"text":"Session.handle (cognitive 16): Session.handle has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (12 pts), ternaries 1 (2 pts), boolean chains 1, error handling 1 (nesting depth added 5). 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":"spaces/policy-playground/web/src/rendezvous.ts"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"21e726c7ad58f5d727a12791fb8ec0f4f83372ea485dccf883648d050960527e"}},{"ruleId":"D2","level":"warning","message":{"text":"main.card (cognitive 16): main.card has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8, ternaries 4 (5 pts), boolean chains 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. 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":"spaces/policy-playground/web/src/main.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"185b5d8e5fabca825795d4b37e494841e9f4889dc75c6e1a1c227dab10f5a402"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotd::control_loop: FunctionTooLong \u2014 robotd::control_loop runs 817 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 717 over it, 8.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":"robotd/src/main.rs"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"9408255edb4fc35297223678d413a0f8d7d679842265296c3f698eff40725452"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/main.rs: FileTooLong \u2014 2796 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 77 free functions. The bar is 500 significant lines; this is 2296 over it, 5.59\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":"robotctl/src/main.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"47318deb701572a21e6720d315d07b574174b1abf917abaedac46d7af89e030c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/main.rs: FileTooLong \u2014 2467 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 45 free functions. The bar is 500 significant lines; this is 1967 over it, 4.93\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":"robotd/src/main.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0373d66b80f05701f6dc6de29aef57a101799738d782d2780c74b4476f8bc21b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 2101 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 1601 over it, 4.20\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":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54fa7949c78418ed41037313f8823619969b120112c441f34646df4e7fdcad10"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/monitor.rs: FileTooLong \u2014 1674 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 1174 over it, 3.35\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":"robotctl/src/monitor.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf4f36a261826997684126791d90773a27ae7a776a1001c1a54e7bfd31c4f6c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/engine.rs: FileTooLong \u2014 1616 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 72% of them inside a single declaration: Engine (2 blocks, 188-2535). The bar is 500 significant lines; this is 1116 over it, 3.23\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":"updater/src/engine.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce18db45692c5363f14056693fd576307c94b8e1244b3103e60c1728c114f397"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: padd::main: FunctionTooLong \u2014 padd::main runs 320 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 220 over it, 3.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":"padd/src/main.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"af71d6b89b4443fe4d1de6d0e4ae3c28f6e9b0eccaee1a73acfa6c063b47e033"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Engine: ClassTooLong \u2014 1164 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 46 methods, 2 blocks, lines 188-2535. The bar is 400 significant lines; this is 764 over it, 2.91\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":"updater/src/engine.rs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"de87d64528680979d21e04ae200625ff5abd33b5626ae13380a3b5beab2c1a9a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mediad::main: FunctionTooLong \u2014 mediad::main runs 254 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 154 over it, 2.54\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":"mediad/src/main.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dc97001d6e04fb8bc4650e561aee733d88e1439ce813e2d33030f0154a62ef8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/pipeline.rs: FileTooLong \u2014 1152 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 652 over it, 2.30\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":"mediad/src/pipeline.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8456db1b051ddeb338a32bc67430974b57091202fb32adb3d7def6c300bf298"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/main.rs: FileTooLong \u2014 1148 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), declaring 39 free functions. The bar is 500 significant lines; this is 648 over it, 2.30\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":"duckctl/src/main.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a10589f8479abe0544ed2eb8a49f79af959e49937408306c85033bdfc1bbd1a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: View: ClassTooLong \u2014 917 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 46 methods, 2 blocks, lines 1357-3021. The bar is 400 significant lines; this is 517 over it, 2.29\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":"robotctl/src/monitor.rs"},"region":{"startLine":1357}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4045a67a6e9bbf97ef7f91e547221afc3370d88889855736c7ed931f2a2f978"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: duckctl::run: FunctionTooLong \u2014 duckctl::run runs 228 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 128 over it, 2.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":"duckctl/src/main.rs"},"region":{"startLine":1362}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c5b3743b4c55b7c92146dd05252234b01d1379f4f263f638871fcf1d9329617"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Server.dispatch: MethodTooLong \u2014 dispatch runs 228 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 128 over it, 2.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":"updater/src/ipc.rs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e304ff434672cc72fc65ab84f760042ab38f971d8f79dc56decf0b7c23d0d63"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotd::dispatch: FunctionTooLong \u2014 robotd::dispatch runs 226 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 126 over it, 2.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":"robotd/src/main.rs"},"region":{"startLine":4298}}}],"partialFingerprints":{"codehealthFindingId/v1":"2812b98a82a477961994ecaa07b7f1290ff8a94e21d22d55b7c08a72f5d17342"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: btd::bluez::serve_on_an_adapter: FunctionTooLong \u2014 btd::bluez::serve_on_an_adapter runs 191 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 91 over it, 1.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":"btd/src/bluez.rs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"503cedbde4ce305d8dffcf2dd55cfc9fc934fb97aae519a97171e2fba67f44f7"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Engine.stage_and_swap: MethodTooLong \u2014 stage_and_swap runs 186 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 86 over it, 1.86\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":"updater/src/engine.rs"},"region":{"startLine":904}}}],"partialFingerprints":{"codehealthFindingId/v1":"70e7fe1e2f79fea5d9ad6ff4e38d98127629debf242c4e0ebaac1cc9a7efa0bf"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mediad::pipeline::start: FunctionTooLong \u2014 mediad::pipeline::start runs 180 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 80 over it, 1.80\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":"mediad/src/pipeline.rs"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"77d438cb23eec2bf9b047544da758bff90b89d09c2189b30cad9c6d4b339ee14"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/lib.rs: FileTooLong \u2014 874 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 374 over it, 1.75\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":"robotd-params/src/lib.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fdfa6ad275b2ebe1470e0c76d31bf202d7c06425240dc5754ce90fb7ed71ff0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::configure::run: FunctionTooLong \u2014 robotctl::configure::run runs 165 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 65 over it, 1.65\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":"robotctl/src/configure.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc13d6e95a6de7a38f4a307799eedabf0911c4d6944fc2f6f94b8b71cd327da8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: View: TooManyMethods \u2014 46 methods. The bar is 30 methods; this is 16 over it, 1.53\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":"robotctl/src/monitor.rs"},"region":{"startLine":1357}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeafdcfbc8c6a3aba504b2fb5552bae4adeca7bd23c8e673add9f874f0632593"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Engine: TooManyMethods \u2014 46 methods. The bar is 30 methods; this is 16 over it, 1.53\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":"updater/src/engine.rs"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf20decadd961d7b53c26f102d68381eaaf0ddfeb2db9e5e6d074d0dab4200e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: duckctl::request_line: FunctionTooLong \u2014 duckctl::request_line runs 150 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 50 over it, 1.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":"duckctl/src/main.rs"},"region":{"startLine":2107}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae19706d7a9a5d053d35af485429b91868c762ccbb1941c23383fa312f4844a6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/relay.rs: FileTooLong \u2014 725 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 225 over it, 1.45\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":"mediad/src/relay.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5b0dd4cf04918284f4d478ca70140c565007dcc43f7fea1513de717413913a6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Server: ClassTooLong \u2014 576 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 19 methods, 2 blocks, lines 100-1093. The bar is 400 significant lines; this is 176 over it, 1.44\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":"updater/src/ipc.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"5af85d0c87f3b1ac8106b6801c801fcae3526142f23df48ea7628d1e18b2f02d"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Controller.step: MethodTooLong \u2014 step runs 137 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 37 over it, 1.37\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":"robotd/src/control.rs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"826ecb323604a7377db2b746369a91d582d7fbc3a80322064d5c9362222b436e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::configure::draw: FunctionTooLong \u2014 robotctl::configure::draw runs 136 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 36 over it, 1.36\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":"robotctl/src/configure.rs"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"52320a0a7c7eec62f48276ea17d5c49f5509c4de4e247b1f7bbb218faa0323fe"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyFields: RobotState: TooManyFields \u2014 40 stored fields beside 6 methods. The bar is 30 stored fields; this is 10 over it, 1.33\u00D7 the bar. This is width in DATA, not behaviour: every reader that takes the whole type couples to all of its fields, so a change to any one of them is a change every reader has to be checked against. To reduce it, group the fields that are read together by the same callers into a smaller type of their own, and have this one hold that type as a single member \u2014 each reader then names only the group it uses."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":525}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7a175b18fe00f280de21112e537acb5f3f3f86ee5fee732f0d991829823b291"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: updater::install: FunctionTooLong \u2014 updater::install runs 132 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 32 over it, 1.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":"updater/src/main.rs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"27a5650f262cb1a1a3c990402b906113018f39192e79134a580664e36b89f79a"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::render_health: FunctionTooLong \u2014 robotctl::render_health runs 131 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 31 over it, 1.31\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":"robotctl/src/main.rs"},"region":{"startLine":1751}}}],"partialFingerprints":{"codehealthFindingId/v1":"af659b5d26ea730e7d2a4f0853671416f6aaddcd099b76628d07eb1051bc4bc8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sounds::chorale::midi::parse: FunctionTooLong \u2014 sounds::chorale::midi::parse runs 130 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 30 over it, 1.30\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":"sounds/src/chorale/midi.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"631a4cb9297323416fa166ab8bd360e553963b8aea90eac1969e84d15c9d1137"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/ipc.rs: FileTooLong \u2014 628 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), about 92% of them inside a single declaration: Server (2 blocks, 100-1093). The bar is 500 significant lines; this is 128 over it, 1.26\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":"updater/src/ipc.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38f5c49537ff70f8747f8009611aacbe96beb631ee69990d6fac43fc5f97373c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: sounds::main: FunctionTooLong \u2014 sounds::main runs 125 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\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":"sounds/src/main.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0c3c577257a126ce65084417afcf885b93f078caea6610a2fc9aec6c21587ff"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: duck_detect::bin::duck-bench::main: FunctionTooLong \u2014 duck_detect::bin::duck-bench::main runs 122 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 22 over it, 1.22\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":"duck-detect/src/bin/duck-bench.rs"},"region":{"startLine":140}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bb82dbe9642b9842dd68c79f43c4c465d95084ccbb69cbb73eec16eec316c4e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::run_policy: FunctionTooLong \u2014 robotctl::run_policy runs 120 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 20 over it, 1.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":"robotctl/src/main.rs"},"region":{"startLine":3472}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa921b054fd48a6f958851e784cf54279d7a1c1d674c7d2a4f616942f96da66"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: NetworkManager.connect: MethodTooLong \u2014 connect runs 115 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 15 over it, 1.15\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":"configd/src/nm.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37ed64419d670f6ff2bb985e122c396b1afb8913ee2520288c65e02d91f8d69"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BlueZ.pair: MethodTooLong \u2014 pair runs 114 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 14 over it, 1.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":"configd/src/bluez.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"411b53656c492c64ecff3258bd5b8b003cb4d65844ded861170f36641a4888af"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Intents: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\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":"robotd/src/intents.rs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f46d5eec0a369ffd7502cdd3f28ca2e596e4ed7f91a90289965c7b737e7a1a0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Model.open: MethodTooLong \u2014 open runs 109 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 9 over it, 1.09\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":"duck-detect/src/rknn.rs"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe8cd3f016607669b94267f347145f2b7baa55a9b8cc52ad01a6a1be57e5ec71"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: mediad::pipeline::build_stream_branch: FunctionTooLong \u2014 mediad::pipeline::build_stream_branch runs 108 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\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":"mediad/src/pipeline.rs"},"region":{"startLine":754}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce67b4998b6616e029e559ced933994810fd7cf39a31236683623bc49091a98d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::run: FunctionTooLong \u2014 robotctl::run runs 108 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 8 over it, 1.08\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":"robotctl/src/main.rs"},"region":{"startLine":4925}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec1bf61a8bcce5ab273095a9f8b9f902181980ac40e898be59cbc62b958692b1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/policy.rs: FileTooLong \u2014 537 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 37 over it, 1.07\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":"updater/src/policy.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24eda9012eab7c72c211fca110412c0a25efae80badedd4819b523485ef71228"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/configure.rs: FileTooLong \u2014 517 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 17 over it, 1.03\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":"robotctl/src/configure.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a760c6b7be2a9b1fe8aa93f9f4c4165869c0623e6894dcd5a7b3278327ecaab"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Call: ClassTooLong \u2014 406 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted), 6 methods, 2 blocks, lines 963-1639. The bar is 400 significant lines; this is 6 over it, 1.02\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":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":963}}}],"partialFingerprints":{"codehealthFindingId/v1":"0575e38593026d268ad39ffbabbe1a9c78a60a826c5f58ef3beaacddc70c0da1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/main.rs: FileTooLong \u2014 506 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 6 over it, 1.01\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":"padd/src/main.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dabb96ae436d048845d65aa8e2b4f5a048323fcd64fcff6050284391539ca0e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: robotctl::run_policy_skill: FunctionTooLong \u2014 robotctl::run_policy_skill runs 101 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted) in one body. The bar is 100 significant lines; this is 1 over it, 1.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":"robotctl/src/main.rs"},"region":{"startLine":3747}}}],"partialFingerprints":{"codehealthFindingId/v1":"55b1b406aabb4c9c68c482188dba4b682211aa07016bd3929c0e2c35333fb6ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: src/tap.rs: FileTooLong \u2014 502 significant lines (blank, comment-only and punctuation-only lines excluded, and inline test code \u2014 #[cfg(test)] modules and bare #[test] functions \u2014 not counted). The bar is 500 significant lines; this is 2 over it, 1.00\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":"padd/src/tap.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdcb63a19414054b0104406cf92f57e7823f213ca063efa3279f40c60fac9ae0"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (52 shared lines): robotctl/src/main.rs:583-680 | robotctl/src/main.rs:687-798 \u2014 These two members are variants of one another: 52 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":"robotctl/src/main.rs"},"region":{"startLine":583}}}],"partialFingerprints":{"codehealthFindingId/v1":"1be7895666c57c56970e2bce2c8ac3b7816c4d2d969932caf5e55014a9927553"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (16 corresponding lines): spaces/shared/rendezvous.py:99-114 | spaces/vision-demo/rendezvous.py:99-114 \u2014 These two members are one piece of code written twice and then edited apart: 16 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":"spaces/shared/rendezvous.py"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"3716015aacd2f1ff135c6371995f5780b93ab8ff8e0748b03e6590bce84603db"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (17 corresponding lines): pad-imu/src/lib.rs:332-351 | robotctl/src/duck.rs:225-248 \u2014 These two members are one piece of code written twice and then edited apart: 17 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":"pad-imu/src/lib.rs"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee813a7bb52f7bd1bd7881c045549b05af25f9c398d092d9e98f93f237628ab8"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): btd/src/main.rs:175-189 | configd/src/main.rs:619-633 | robotd/src/main.rs:4743-4760 | updater/src/main.rs:684-701 \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":"btd/src/main.rs"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"71496ab16f039d3e283945d91e5bc41c2bb03bac07ec77e3cd609c5435149c37"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (65\u201384 lines \u00D7 2): btd/src/route.rs:323-406 | mediad/src/route.rs:103-167 \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":"btd/src/route.rs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"c59166d8eaf83afee57f4ce8123ab225ede8b8624478cb6e4e94a7c649d9c6e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21\u201323 lines \u00D7 2): robotctl/src/main.rs:633-655 | robotctl/src/main.rs:736-756 \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":"robotctl/src/main.rs"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"a45899821a8d29ae449ff481567ca276b5381f5e2a771a595ccfb38bac89a759"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): uyvy/src/lib.rs:119-139 | uyvy/src/lib.rs:190-210 \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":"uyvy/src/lib.rs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb52d101a5041e67d759e5e07e18b852683a04f9366166373ea32ed5fa943d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): btd/src/upstream.rs:189-208 | mediad/src/upstream.rs:143-162 \u2014 before extracting anything, compare \u0060btd/src/upstream.rs\u0060 and \u0060mediad/src/upstream.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 61 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":"btd/src/upstream.rs"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"6990cb88f9370712aaf07c13afe78bade2f21cff1ec26f6c54fd5ad8ec23b02b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18\u201319 lines \u00D7 2): robotctl/src/main.rs:3689-3707 | robotctl/src/main.rs:3962-3979 \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":"robotctl/src/main.rs"},"region":{"startLine":3689}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0437204881491453a234ee8e5613ad66ca52dbb967ec225c110001f6ed9991e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): robotd/src/sound.rs:343-361 | robotd/src/sound.rs:582-600 \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":"robotd/src/sound.rs"},"region":{"startLine":343}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31b4fec0c47f866382d84e5fd915be47c3830393eda1a7132677cca8e5cc7ee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): mediad/src/frame.rs:233-250 | padd/src/tap.rs:945-962 | tof/src/main.rs:788-805 \u2014 before extracting anything, compare \u0060padd/src/tap.rs\u0060 and \u0060tof/src/main.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 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":"mediad/src/frame.rs"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"47717242ec929365dc7a265f2d7b136d31b43eac393ef21a61addbc775509eae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): btd/src/upstream.rs:166-182 | mediad/src/upstream.rs:121-137 \u2014 before extracting anything, compare \u0060btd/src/upstream.rs\u0060 and \u0060mediad/src/upstream.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 61 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":"btd/src/upstream.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"00e44818dadef4e44db09fbfe775018606152a90a48fdec553a345ee7e004338"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 2): pad-imu/src/lib.rs:334-350 | robotctl/src/duck.rs:230-244 \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":"pad-imu/src/lib.rs"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bed751a2fdf52fe088e292e12d2d41cb26a20ba4a960fbaa8ce8ca598da7a2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 2): robotd/src/main.rs:3608-3624 | robotd/src/main.rs:3638-3652 \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":"robotd/src/main.rs"},"region":{"startLine":3608}}}],"partialFingerprints":{"codehealthFindingId/v1":"7779ec6a7907e050a2266d621ea57e7b3d2cb5f9743382cbda030d89ef9471f0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11\u201316 lines \u00D7 2): duckctl/src/main.rs:1828-1838 | robotctl/src/main.rs:4007-4022 \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":"duckctl/src/main.rs"},"region":{"startLine":1828}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d87dcd3f11ada99dc00686c8d7fcb8aaca2a1053e5e71d737ea093ca9b653c4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): robotd/src/main.rs:4745-4760 | updater/src/main.rs:686-701 \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":"robotd/src/main.rs"},"region":{"startLine":4745}}}],"partialFingerprints":{"codehealthFindingId/v1":"6383dab79f8ddb4454f597f823698018f43bb1c33954f2f47bd860b8165e664b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201315 lines \u00D7 2): tof/src/main.rs:349-363 | tof/src/main.rs:503-514 \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":"tof/src/main.rs"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"bac88fd5156573c5958d47369ad546d6c96bbdc70ce1386a280fb196ef4bcb91"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 3): updater/src/ipc.rs:634-645 | updater/src/ipc.rs:660-671 | updater/src/ipc.rs:707-719 \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":"updater/src/ipc.rs"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"deb076a8fd38066785a491629e09bc9fab95329269bea701512960ac5e601c20"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): robotctl/src/show.rs:360-372 | updater/src/engine.rs:2873-2885 \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":"robotctl/src/show.rs"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a0eeb69b0be5277298383cad948406b9ac450fc3706f97c035aeb8a9ba8c054"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): btd/src/main.rs:178-189 | configd/src/main.rs:622-633 \u2014 before extracting anything, compare \u0060btd/src/main.rs\u0060 and \u0060configd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 39 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":"btd/src/main.rs"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"133299f05bc7b462041eea047bf4411592e5e62b8962faa2cf78f2e58b8b5761"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201312 lines \u00D7 2): configd/src/main.rs:113-122 | updater/src/ipc.rs:79-90 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060updater/src/ipc.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 38 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":"configd/src/main.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"c094e57d0373970a3f7e04ee7901a776a03baf921ad068b77c53a6108fe6ca7d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): configd/src/main.rs:397-408 | updater/src/ipc.rs:488-499 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060updater/src/ipc.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 38 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":"configd/src/main.rs"},"region":{"startLine":397}}}],"partialFingerprints":{"codehealthFindingId/v1":"efcb8300d962bd6e0ee24e3370ef9ba290d92ec75b1f4ae4f86d366b696e82de"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): configd/src/bluez.rs:690-700 | configd/src/bluez.rs:766-776 \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":"configd/src/bluez.rs"},"region":{"startLine":690}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb6fa86f6465395cc49f45e8371614c609c8c097f818a96af45da5188d8aaf88"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): configd/src/main.rs:354-364 | robotd/src/main.rs:3561-3571 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060robotd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 43 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":"configd/src/main.rs"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4b19ceb770297d5d1756f829e78a0677f53869e74c7abf160f15e0f699627e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): updater/src/verify.rs:209-219 | updater/src/verify.rs:256-266 \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":"updater/src/verify.rs"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"3751a13ed8407b99b1e03cd481b79ffde7f9a661a830ddc6ba298b3f24482917"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): btd/src/chorale.rs:263-272 | duck-ether/src/main.rs:299-307 \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":"btd/src/chorale.rs"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c1f01f18c370b1acf6f611220785d9ae883ed3bff2e14cdcb0af01f1b71cba3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): configd/src/main.rs:387-396 | robotd/src/main.rs:3688-3697 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060robotd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 43 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":"configd/src/main.rs"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"a69f2d635e0842f400dac8587b2e619e9194a34ce7eec33920ab7eb37dce7cc7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): configd/src/main.rs:394-403 | tof/src/main.rs:696-705 \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":"configd/src/main.rs"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"768a934e9bb560fe07c335c6bde2d339ddad101491c986fbb0241adcb4404e90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): configd/src/nm.rs:258-267 | configd/src/nm.rs:292-301 \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":"configd/src/nm.rs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c205f644e8b6e1a61d58178fa97b6a3349ef454f904cde38957b4878f9db0d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201310 lines \u00D7 2): robotctl/src/main.rs:591-599 | robotctl/src/main.rs:697-706 \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":"robotctl/src/main.rs"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d44d1eba6508f8cf4e228f33e91e8b6805f43d025d80ac1204cb2d0630af526"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): robotd/src/sound.rs:411-420 | robotd/src/sound.rs:529-538 \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":"robotd/src/sound.rs"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd3e108e7dd3d1a09fc38f1ccfb26d37d604d6c0c422df4e438344700e4edf2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 4): btd/src/main.rs:176-184 | configd/src/main.rs:620-628 | robotd/src/main.rs:4744-4751 | updater/src/main.rs:685-692 \u2014 before extracting anything, compare \u0060btd/src/main.rs\u0060 and \u0060configd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 39 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":"btd/src/main.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"889f4d88949906d677a5807e3cc29922be6934d4a26b1cea354b84857c093d5b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): btd/src/main.rs:95-103 | configd/src/main.rs:195-203 \u2014 before extracting anything, compare \u0060btd/src/main.rs\u0060 and \u0060configd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 39 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":"btd/src/main.rs"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"20bfb0f6dd9fe1ed788427ed280b0934a378d47952f026317363e418f2844421"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): btd/src/upstream.rs:226-234 | mediad/src/upstream.rs:179-187 \u2014 before extracting anything, compare \u0060btd/src/upstream.rs\u0060 and \u0060mediad/src/upstream.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 61 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":"btd/src/upstream.rs"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"5397f6cebbd243fc51c7d292cfe3db3be8a0128b94f4ddf99d7e01064c69df91"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): configd/src/main.rs:376-384 | updater/src/ipc.rs:467-475 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060updater/src/ipc.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 38 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":"configd/src/main.rs"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8095e58395613d88c506d605587a5a57f4957652f628a398e1403b3ff74267c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20139 lines \u00D7 2): mediad/src/frame.rs:45-50 | robotd/src/main.rs:3476-3484 \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":"mediad/src/frame.rs"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba98ac185683c7da3fbe856e6436c147f2972fddc511d77acaa90876ebcf5f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): robotd/src/main.rs:212-220 | robotd/src/main.rs:1384-1392 \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":"robotd/src/main.rs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"61858c5f2cb22abfbd3e0153d5812c33b8f7f0c53cb151a0511229d87cc371a9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): tof/src/main.rs:744-752 | tof/src/main.rs:769-777 \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":"tof/src/main.rs"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5584792c86dca08d7bff88adc3b43c7f6de14540d4bb2d43343e151921b7992"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): updater/src/engine.rs:1167-1175 | updater/src/engine.rs:1657-1665 \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":"updater/src/engine.rs"},"region":{"startLine":1167}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f8cdb3921a707d4f2460e924a88e7c524014cd5d95835edffa909ade94642ec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3): mediad/src/main.rs:200-207 | padd/src/main.rs:383-390 | updater/src/main.rs:214-223 \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":"mediad/src/main.rs"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6e787486b2e742394fe5255cc51c6e648c135c17a1634626075709716e5780"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): configd/src/main.rs:444-451 | robotd/src/main.rs:4711-4718 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060robotd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 43 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":"configd/src/main.rs"},"region":{"startLine":444}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d84a8ac0c3d94022aec321fd431fd5abe56778c4c5ff089f100621d94c8a2ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): padd/src/tap.rs:176-182 | tof/src/main.rs:624-630 \u2014 before extracting anything, compare \u0060padd/src/tap.rs\u0060 and \u0060tof/src/main.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 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":"padd/src/tap.rs"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"13d00fdaac7be3a0e6cedd00cfca0b76e51a83ce07c865f5fb537a2c856f50ff"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): robotd/src/soc.rs:108-119 | robotd/src/soc.rs:157-163 \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":"robotd/src/soc.rs"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac30b2682599feb1bf93c023adbf3cec91e6cb23a0f69a703f70a01487e420c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): sounds/src/voices.rs:143-149 | sounds/src/voices.rs:310-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":"sounds/src/voices.rs"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"debf4b16cc6faeb9d2bd8402689f21f3918fca68b8ed091a107fac027f90c826"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): sounds/src/voices.rs:309-314 | sounds/src/voices.rs:374-380 \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":"sounds/src/voices.rs"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"327de242e33dfdd907b240868d62a082db9006ba1ed10852c27b0696b8629d13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): updater/src/journal.rs:224-230 | updater/src/journal.rs:485-491 \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":"updater/src/journal.rs"},"region":{"startLine":224}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c7ddc253c72a2f776a5521d0e295be10e7ad3f2e0499f3b59b5d5f68a59f798"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): updater/src/journal.rs:250-256 | updater/src/journal.rs:499-505 \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":"updater/src/journal.rs"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"f74f6bb2edb35b1ff4f1c0743905e88953e9cca6628af14cea5ac1246e7496f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): btd/src/upstream.rs:212-217 | mediad/src/upstream.rs:166-171 \u2014 before extracting anything, compare \u0060btd/src/upstream.rs\u0060 and \u0060mediad/src/upstream.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 61 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":"btd/src/upstream.rs"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"9585407de8e3aaabf1b13c83fe5d166eba1ed8854b801836a37fbac7b10c9ab7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): mediad/src/pipeline.rs:477-482 | mediad/src/pipeline.rs:627-632 \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":"mediad/src/pipeline.rs"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c50d2428e99c6e198b659a78376f348ebf4c18b96e4de34be48cd4584567f13"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): configd/src/main.rs:612-616 | robotd/src/main.rs:4736-4740 | updater/src/ipc.rs:1129-1133 \u2014 before extracting anything, compare \u0060configd/src/main.rs\u0060 and \u0060robotd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 43 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":"configd/src/main.rs"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2b2303a85efd9990fde4661db176c7af9338f86abdf7c8c721cdb906509ac99"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): mediad/src/frame.rs:252-256 | padd/src/tap.rs:964-968 | tof/src/main.rs:808-812 \u2014 before extracting anything, compare \u0060padd/src/tap.rs\u0060 and \u0060tof/src/main.rs\u0060 as WHOLE FILES: this scan already matched 3 separate duplicated blocks between them, totalling at least 30 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":"mediad/src/frame.rs"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f15a97482c85276a24a6560ac420227548272cc700aacdb86c37e5b327ffee"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): sounds/src/voices.rs:78-82 | sounds/src/voices.rs:141-146 | sounds/src/voices.rs:159-163 \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":"sounds/src/voices.rs"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"af01b008e3d2baf6463014218028447555548ebfbcd7a045490d96598217e6cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): duck-ipc-proto/src/lib.rs:5262-5266 | duck-ipc-proto/src/lib.rs:5330-5334 \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":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":5262}}}],"partialFingerprints":{"codehealthFindingId/v1":"d53ff6247d3f6a1cadaa26bbdc706d4640afb5215259bc3d72e2e00ffe9b371b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): btd/src/main.rs:67-75 | configd/src/main.rs:185-191 \u2014 before extracting anything, compare \u0060btd/src/main.rs\u0060 and \u0060configd/src/main.rs\u0060 as WHOLE FILES: this scan already matched 4 separate duplicated blocks between them, totalling at least 39 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":"btd/src/main.rs"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f52589486219b6a264bb5f930358c0ffa1e61c0186f13ea96d8c8101dcb12db"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): btd/src/upstream.rs:256-264 | mediad/src/upstream.rs:209-217 \u2014 before extracting anything, compare \u0060btd/src/upstream.rs\u0060 and \u0060mediad/src/upstream.rs\u0060 as WHOLE FILES: this scan already matched 5 separate duplicated blocks between them, totalling at least 61 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":"btd/src/upstream.rs"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa95cc7db60ad3bda0b59376ca6124110d2760bf9aa2bd7c0e0fa1a2d6382d5d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): robotctl/src/main.rs:2178-2183 | updater/src/journal.rs:19-24 \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":"robotctl/src/main.rs"},"region":{"startLine":2178}}}],"partialFingerprints":{"codehealthFindingId/v1":"666f29214bf6da1d62f8dcd31af52f704361a4d06269016c2ee0716b7e2dd109"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): robotctl/src/main.rs:609-626 | robotctl/src/main.rs:716-728 \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":"robotctl/src/main.rs"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e0beb2d711e5bb93557fa4b1bc7f66acb526cbbb5e9c90350db50660eb7cdd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): robotctl/src/main.rs:2577-2587 | robotctl/src/main.rs:2598-2613 \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":"robotctl/src/main.rs"},"region":{"startLine":2577}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f6dffa3721d18f1dac2bd08b8f3604df38b837e24753bf738af1892fb8cd00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): robotd/src/main.rs:2098-2110 | robotd/src/main.rs:2714-2729 \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":"robotd/src/main.rs"},"region":{"startLine":2098}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d3e82b014bb113a7c4616dd4036a5b00bfda674be684002711465915b368ec5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): robotctl/src/main.rs:2591-2601 | robotctl/src/main.rs:2617-2627 \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":"robotctl/src/main.rs"},"region":{"startLine":2591}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b54b3914d818de70fa52d95530ae507509fde1d83667b7d69edeb7ceace3ac3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): robotctl/src/main.rs:1922-1929 | robotctl/src/main.rs:2660-2669 \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":"robotctl/src/main.rs"},"region":{"startLine":1922}}}],"partialFingerprints":{"codehealthFindingId/v1":"99edadb0662f8c1ec00bdaf66677d9537b1ce04f6406f3f18bf069e08a69ef4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): robotd/src/main.rs:3618-3626 | robotd/src/main.rs:3670-3678 \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":"robotd/src/main.rs"},"region":{"startLine":3618}}}],"partialFingerprints":{"codehealthFindingId/v1":"07f102a7f590dff5908a15ab6cabae8725f77e50bd9ab5c7e984e0e2e6a93aa3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): robotctl/src/main.rs:601-608 | robotctl/src/main.rs:708-715 \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":"robotctl/src/main.rs"},"region":{"startLine":601}}}],"partialFingerprints":{"codehealthFindingId/v1":"554f5f6b96633cb3f4085dc4a87214f7bf0db3bb8cb981256c57bde0e47f89ec"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): robotctl/src/main.rs:2055-2062 | robotctl/src/main.rs:2080-2087 \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":"robotctl/src/main.rs"},"region":{"startLine":2055}}}],"partialFingerprints":{"codehealthFindingId/v1":"53d9355ce0e9a98564d14303b31878fe80ab2e332054cfa011e4406817513b60"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): robotctl/src/monitor.rs:550-557 | robotctl/src/monitor.rs:597-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":"robotctl/src/monitor.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4a02655c24e7d4ddcb2a4a82842e594805ea0c242cb864f0a009f67a3eec2d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): btd/src/session.rs:196-202 | btd/src/session.rs:252-258 \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":"btd/src/session.rs"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"782a3a78ed0dad7176a4f61e58a4a1f199fda0cbe1bda380e751a0b3aa907724"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): updater/src/ipc.rs:580-586 | updater/src/ipc.rs:759-765 \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":"updater/src/ipc.rs"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6c53adefae99c77b29e27bed0ee4f872bce0f74d6a216788932c06973fae74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): robotd/src/sound.rs:378-383 | robotd/src/sound.rs:477-482 \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":"robotd/src/sound.rs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd341db4a39d95c7c5e25f100374ddcbb55f0a866b35e375a2b0b51fcfb5d2d8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): pad-imu/src/lib.rs:385-390 | robotctl/src/duck.rs:266-271 \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":"pad-imu/src/lib.rs"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d6123565895cb31290db7c6bca873f4cdd5f085fddd2233e8f8e09e10be815"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): robotctl/src/main.rs:2164-2169 | robotctl/src/show.rs:393-398 \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":"robotctl/src/main.rs"},"region":{"startLine":2164}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4c043295a2a9d7c47086daafadc3f9d068b3c98eda3af2c46aa05cd66bb76c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): robotd-params/src/edit.rs:100-104 | robotd-params/src/edit.rs:625-629 \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":"robotd-params/src/edit.rs"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf7f86b76794d5058306893a4c7f8298d64b2a965776359c82e91330ad57605"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (59 lines \u00D7 2): spaces/shared/rendezvous.py:158-216 | spaces/vision-demo/rendezvous.py:158-216 \u2014 \u0060spaces/shared/rendezvous.py\u0060 and \u0060spaces/vision-demo/rendezvous.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 106 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/rendezvous.py"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3fb29c2697b7f563ce15a792d1aee902576d3f574bb7b8637145728a0d13a32"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2): spaces/shared/wire.py:106-147 | spaces/vision-demo/wire.py:106-147 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"2917accebec419e3f89ea48ae66e39488a78bae9be99c9baf1be83bd2fe042c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2): spaces/shared/wire.py:260-298 | spaces/vision-demo/wire.py:260-298 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"bda14d973bd8c331632f7050fcd995a517af5883535bd22e737810faf868fbc5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2): spaces/shared/control.py:117-154 | spaces/vision-demo/control.py:117-154 \u2014 \u0060spaces/shared/control.py\u0060 and \u0060spaces/vision-demo/control.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/control.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"db9a282fdf5150d2c7d5b635f281da16ae24b0fcb742e54ef0a832f71374247a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (38 lines \u00D7 2): spaces/shared/wire.py:220-257 | spaces/vision-demo/wire.py:220-257 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"6277eb3197f4723bba1881164c35c307c074d66146bd5ce8f86525e1c92ed0a2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2): spaces/shared/wire.py:301-334 | spaces/vision-demo/wire.py:301-334 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cef4ae1cdc1d05a3141688930b6cfb9fb6867ec7c7c4d513b3bb72eef0ca258"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (32 lines \u00D7 2): spaces/shared/control.py:83-114 | spaces/vision-demo/control.py:83-114 \u2014 \u0060spaces/shared/control.py\u0060 and \u0060spaces/vision-demo/control.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/control.py"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fe816174f5ac20af325058ad545aa66c60ea370e4595ee6ed0e0effdb820d46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2): spaces/shared/wire.py:76-99 | spaces/vision-demo/wire.py:76-99 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"8eea9e6b4bf4f56bf917d478f5184e10e705b18890196dfca14a81f2ba3fe6bc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): spaces/shared/rendezvous.py:117-137 | spaces/vision-demo/rendezvous.py:117-137 \u2014 \u0060spaces/shared/rendezvous.py\u0060 and \u0060spaces/vision-demo/rendezvous.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 106 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/rendezvous.py"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee8c9a02d76f78de3ac61088f7263399590d03228cf93fcd061550aca6c7e54d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): spaces/shared/wire.py:199-217 | spaces/vision-demo/wire.py:199-217 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f6ced6c4d544b5be13571d3db37256a8562ac2d41c1a75f0383ed9b215c06b2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): spaces/shared/rendezvous.py:101-114 | spaces/vision-demo/rendezvous.py:101-114 \u2014 \u0060spaces/shared/rendezvous.py\u0060 and \u0060spaces/vision-demo/rendezvous.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 106 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/rendezvous.py"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"4813582a0a8f39db9432860a28ea79cd7de8ae01e46000ce759d62945a40cddc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): spaces/shared/wire.py:153-166 | spaces/vision-demo/wire.py:153-166 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"d02b5775d1ec5903d64f459e409d1681b22b56fa4277ea637e317232f64aa1a7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): spaces/shared/rendezvous.py:141-152 | spaces/vision-demo/rendezvous.py:141-152 \u2014 \u0060spaces/shared/rendezvous.py\u0060 and \u0060spaces/vision-demo/rendezvous.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 106 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/rendezvous.py"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aee76baf39eb9c31008eb37784376a784f4fa56c59d10a5fb1a09731ccebc34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): spaces/shared/control.py:62-72 | spaces/vision-demo/control.py:62-72 \u2014 \u0060spaces/shared/control.py\u0060 and \u0060spaces/vision-demo/control.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/control.py"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1531e95baecd369d0eb13333ab3b3f28a15842f12cc64d67d68d20d9db1ddd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): spaces/shared/control.py:157-164 | spaces/vision-demo/control.py:157-164 \u2014 \u0060spaces/shared/control.py\u0060 and \u0060spaces/vision-demo/control.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 4 separate duplicated blocks between them, totalling at least 89 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/control.py"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c1d16424c49fc895f01240cd5193f59b59187e6dfdabf922f21a8b8da656a46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): spaces/shared/wire.py:186-194 | spaces/vision-demo/wire.py:186-194 \u2014 \u0060spaces/shared/wire.py\u0060 and \u0060spaces/vision-demo/wire.py\u0060 are one unit implemented once per sibling directory, so they are most likely parallel implementations of one contract rather than a copy of each other \u2014 this scan matched 8 separate duplicated blocks between them, totalling at least 219 lines. If both are selected at run time, neither can be retired in favour of the other, and the lines that DIFFER between them are the reason both exist. The move that pays here is to hoist the identical part into a shared location the whole family can reach and give what differs a parameter or a seam, so a change lands once instead of once per sibling; extracting one helper per block leaves every sibling to drift on its own. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/shared/wire.py"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"abca09817e062b3f0b621330a57a592888af5c1651a8379511888224b9930fcb"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: duck-ble: duck-ble: 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":"6efa8bad29c83180aecf4c8563c7b2c837406c9cb4eb223d7bb13ce5d391d8ec"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: duck-ipc-proto: duck-ipc-proto: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 14 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d973ef527765b0d931a332f56ba11338da6f86e14f2b66d3907b8d0254862372"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: kinematics: kinematics: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 4 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"84a2abe7dc86d5568befa7a900b88e0c917d1af8614993f6987418218c695c2f"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: pet-detect: pet-detect: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"06279e28ffa302de61fb8a14cb8ff8627fe59255402f8452d732586e75b46915"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: sounds: sounds: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 1 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dcd8118a1f9f1031888e39cd9e4f68e5959458eafe93b5f884b087ea2ea3d3b5"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: uyvy: uyvy: abstractness 0.00, instability 0.00, distance 1.00 \u2014 zone of pain \u2014 concrete and depended on by 3 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"631cada4bfebb67e8d5f77f8fa58fb798ad3b6c595927d590c76b0c7c4af6c83"}},{"ruleId":"D5","level":"warning","message":{"text":"Off the main sequence: robotd-params: robotd-params: abstractness 0.00, instability 0.29, distance 0.71 \u2014 zone of pain \u2014 concrete and depended on by 5 project(s), so it\u0027s rigid to change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"244e77d4c1045bd235a272d01c98f8a8af40a4488cba3485f893392eb51a5405"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Intents (LCOM4 6): Intents\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/intents.rs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a1c03d00513cf544ad6eb1c29b5b307ef05715454270781ae9781f23d78fa8a"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: FakeIo (LCOM4 4): FakeIo\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-control/src/io.rs"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"522c710d60540ce7cdde1c4c099e57b9a9af1bc3edbfc315a02304201a285dd8"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotd/src/main.rs: robotd/src/main.rs changed 95 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 185 in robotd::control_loop at line 1761. 3 of those changes were fix/bug commits, and the other 92 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotd/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"f846dafd6999f6e8a33ff1a6b3bd590c4e846d41620203f02ebf680aedf9fe42"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: duck-ipc-proto/src/lib.rs: duck-ipc-proto/src/lib.rs changed 96 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 74 in Call::parse at line 1543. 1 of those changes was a fix/bug commit, and the other 95 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- duck-ipc-proto/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":1543}}}],"partialFingerprints":{"codehealthFindingId/v1":"767296dd1031e1f8c08dc2077e3b359d4d4e89b2f6ea7d2255b5142f1902a856"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotctl/src/main.rs: robotctl/src/main.rs changed 104 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 30 in robotctl::run at line 4925. 2 of those changes were fix/bug commits, and the other 102 changed it for other reasons \u2014 this file is under both repair and feature pressure. Before the next change lands here, make sure the area it touches is under test, then split that area out of the file so the following change is smaller than this one \u2014 a file this often edited pays the complexity back every time. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotctl/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":4925}}}],"partialFingerprints":{"codehealthFindingId/v1":"608b77a23bddbb0d35387dffdbd1e8ad3e3c8b39c482def3f41f4d0de543125f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: duckctl/src/main.rs: duckctl/src/main.rs changed 44 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 61 in duckctl::run at line 1362. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- duckctl/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duckctl/src/main.rs"},"region":{"startLine":1362}}}],"partialFingerprints":{"codehealthFindingId/v1":"6aa7f756cc71132efee4015227f24eb8ec6b11b6843ec7a1ba82a5462062fb5c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: padd/src/main.rs: padd/src/main.rs changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 86 in padd::main at line 382. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- padd/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"padd/src/main.rs"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"130978f7fff62d405f31f2f327b2e99971cf7408b0dba3fbf70e98d10ec4e139"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: btd/src/route.rs: btd/src/route.rs changed 43 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 54 in btd::route::permits at line 76. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- btd/src/route.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"btd/src/route.rs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3a68b3bbcadb528dde39d0643afefb9f4a1689b1bb6abcc30e66ea5e51c068e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/ipc.rs: updater/src/ipc.rs changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 43 in Server::dispatch at line 521. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/ipc.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/ipc.rs"},"region":{"startLine":521}}}],"partialFingerprints":{"codehealthFindingId/v1":"4550fc0f655641eb4444a2a107aa0a67803eb9a8458293089b28ee24b6835e00"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mediad/src/main.rs: mediad/src/main.rs changed 38 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in mediad::main at line 199. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- mediad/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/main.rs"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b2195f8005972fdab9ed6fe87f2aefb2185b92188594001566c6618612b2c5c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotctl/src/configure.rs: robotctl/src/configure.rs changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 55 in robotctl::configure::run at line 357. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotctl/src/configure.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/configure.rs"},"region":{"startLine":357}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e8fe17b98ba840db69ce371d29465bf19d60868fc7609c99008a6096774759"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotctl/src/monitor.rs: robotctl/src/monitor.rs changed 36 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 26 in robotctl::monitor::live at line 903. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotctl/src/monitor.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":903}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ec9d561b459746d24b93e6885472afab0949008b23620fc8273b1f1a808967a"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/engine.rs: updater/src/engine.rs changed 48 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in Engine::apply_inner at line 713. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/engine.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/engine.rs"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d3cd54309e44c79ce92fc6f6e4148faf87188c5ace6ddbcadacf11ac9d3b220"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mediad/src/route.rs: mediad/src/route.rs changed 19 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in mediad::route::permits at line 51. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- mediad/src/route.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/route.rs"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"03cc71b3d92fd7b3a372170036e6ea112d28a0b61270fdc8c9c9eab3560f1051"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: xtask/src/main.rs: xtask/src/main.rs changed 41 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in xtask::package at line 287. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- xtask/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"xtask/src/main.rs"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"cff25c237cc89f8deb8f42b76ea49283325d779974670e147cb5786c2447a564"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotd/src/control.rs: robotd/src/control.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 39 in Controller::step at line 427. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotd/src/control.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/control.rs"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f4679350a0e1de40632343862ebc01ffcdc62df1563337c1bca8129f7803bb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/main.rs: updater/src/main.rs changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in updater::install at line 313. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/main.rs"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0166f1d1029a4b2a92abcd6ec6be7e48a106ed1a77d5edfc220c4defb8e2d90"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/lib.rs: updater/src/lib.rs changed 16 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in Error::code at line 258. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/lib.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/lib.rs"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"99551ba9fb1d2dea7684ca70dc6bacc225bbca276d56616493ccb0bc46fcf4ec"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: configd/src/main.rs: configd/src/main.rs changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in configd::dispatch at line 419. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- configd/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/main.rs"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56214710d1a9f94956cd55384afddfbdd2bd9c5f0d9e45bb96e4ba163d8bb33"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: mediad/src/relay.rs: mediad/src/relay.rs changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Relay::session at line 652. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- mediad/src/relay.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/relay.rs"},"region":{"startLine":652}}}],"partialFingerprints":{"codehealthFindingId/v1":"390cdc39eceb209d62e82be73d360d62902b88917aaf562769a329ac1bfaf38f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: configd/src/nm.rs: configd/src/nm.rs changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in NetworkManager::connect at line 550. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- configd/src/nm.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/nm.rs"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f6fd0bd915e87fda3e358e301c9c8ef1565c442368958ecadf33526e3cc7f03"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/config.rs: updater/src/config.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in Config::validate at line 402. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/config.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/config.rs"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dcfd75d52afd1e20d1292a3a240addcc623789fccd27d9ef1423c7932f18ccb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: configd/src/bluez.rs: configd/src/bluez.rs changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in BlueZ::pair at line 853. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- configd/src/bluez.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/bluez.rs"},"region":{"startLine":853}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b1ea79e65c075527894cc3919c1cce83cfbecb36e71ec69381d4d9018e83e8d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: spaces/policy-playground/web/src/main.ts: spaces/policy-playground/web/src/main.ts changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in main.card at line 466. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- spaces/policy-playground/web/src/main.ts\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"spaces/policy-playground/web/src/main.ts"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2bbe61827fb552902d0edc5980352c4441c1c2ac99fd34ea706c728205bd024"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotd/src/chorale.rs: robotd/src/chorale.rs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in Chorale::heard at line 264. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotd/src/chorale.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/chorale.rs"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"19bbdca5a82511003fbb9ea5e871c4bfb97392acc2d7d17aabf8aec3c4c525f0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotctl/src/duck.rs: robotctl/src/duck.rs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in DuckView::draw at line 403. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotctl/src/duck.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/duck.rs"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"837d27412142d713d5d02ad0c07ea87ba23968900d2b4b7d6ccec3d06079456c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: updater/src/source/http.rs: updater/src/source/http.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in updater::source::http::attempt_download at line 203. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- updater/src/source/http.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"updater/src/source/http.rs"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5ba8c286fd416747ca21487b7475b66eda422ee4502df0e9a506557ed011162"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: robotd/src/sound.rs: robotd/src/sound.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in Sound::sing_start at line 437. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- robotd/src/sound.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/sound.rs"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6a60302d22c72831ef7f4eeeb37b2f432df1081997dbb118a0150eb9f489196"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: sounds/src/main.rs: sounds/src/main.rs changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in sounds::main at line 281. Frequent change and high complexity in one file compound: schedule the next change to it to include carving out the part being edited, with the area under test before it moves. Counted over 2026-06-30..2026-09-28, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-06-30 17:01:03 \u002B02:00\u0027 --until=\u00272026-09-28 17:01:03 \u002B02:00\u0027 --full-history --no-merges -- sounds/src/main.rs\u0060: merges are excluded because a merge re-states changes already counted at their own commits, and history is NOT path-simplified because a change that reached the file through a merged branch is still a change to it. That command counts raw commits and can read HIGHER than this row, which counts a cherry-picked re-land, and a revert together with the commit it undoes, once each \u2014 a difference of several commits on a file whose history was re-landed or reverted inside the window."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"sounds/src/main.rs"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"3adbe03bd09cdea42cd3b4baf6a370b0e19b7e0f55d4af54cf247224dafda3d7"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 32 significant file(s) lose their only recent owner: duckctl/src/main.rs, btd/src/bluez.rs, btd/src/session.rs, updater/src/main.rs, configd/src/nm.rs, robotctl/src/show.rs, updater/src/source/github.rs, configd/src/main.rs (\u002B24 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3a59826988d04f1a03b6c183481c97e436f16f161cacc711e71ea7278f11c00c"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 16 significant file(s) lose their only recent owner: sounds/src/chorale/mod.rs, robotd/src/chorale.rs, sounds/src/stream.rs, robotctl/src/duck.rs, sounds/src/chorale/midi.rs, sounds/src/chorale/beat.rs, robotd/src/theremin.rs, sounds/src/chorale/text.rs (\u002B8 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8c379348542d6ce695a90957a5ad3074a324e74031e0f600e3e84a0ac8cc7da0"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The opening paragraph is a one-line description of the project (\u0027A tiny biped robot that moves using reinforcement learning policies.\u0027) and no overview of what it does or its role in the repository. Expand with a short \u0027What Microduck does\u0027 section covering its purpose, the daemons it runs, and where to find the cheat sheet."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dbf18d06aa983c06246108610908ba99aae6784280b3aacd1a6655733d71be"}},{"ruleId":"D22","level":"warning","message":{"text":"Duplicate method signature with different parameter names (one uses \u0060_lines\u0060/\u0060_boot\u0060, the other uses \u0060lines\u0060/\u0060boot\u0060). This suggests an accidental overload or copy-paste error in the API definition.: Remove the duplicate signature. If the intent was to have an overload, ensure the types differ; if not, keep only the canonical version. (signatures: configd.logs.read(unit: str, lines: usize, boot: i32): Result | configd.logs.read(unit: str, _lines: usize, _boot: i32): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ba6b4e8a3f8bdcc5b4a9327339f0b01d06e6eb91bcd12fbb7e26b2ffe6c54169"}},{"ruleId":"D22","level":"warning","message":{"text":"Two methods perform the same core operation (pairing a link) but differ only in how the MTU is passed (owned \u0060usize\u0060 vs shared \u0060AtomicUsize\u0060). This creates unnecessary cognitive load and API surface duplication.: Unify into a single method, e.g., \u0060pair(mtu: impl Into\u003CAtomicUsize\u003E, peer: ...)\u0060, or expose the atomicity as a property of the returned \u0060Link\u0060 rather than a constructor choice. (signatures: Link.pair(mtu: usize, peer: impl Into\u003CString\u003E): (Self, Sender\u003CVec\u003Cu8\u003E\u003E, Receiver\u003CVec\u003Cu8\u003E\u003E) | Link.pair_sharing_mtu(mtu: AtomicUsize, peer: impl Into\u003CString\u003E): (Self, Sender\u003CVec\u003Cu8\u003E\u003E, Receiver\u003CVec\u003Cu8\u003E\u003E))"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"1eb10c3480672c0e3032d16633f853fc981c01830ed5157aeaa498124d0725aa"}},{"ruleId":"D22","level":"warning","message":{"text":"Naming inconsistency in the \u0060configd.pad\u0060 module. \u0060Pads.pair\u0060 is a method on the struct, while \u0060pad.pair_timeout\u0060 appears to be a free function or module-level helper. The naming convention \u0060pair_timeout\u0060 suggests it returns a timeout, but it\u0027s unclear if it\u0027s a configuration helper or a distinct operation compared to \u0060Pads.pair\u0060.: Clarify if \u0060pad.pair_timeout\u0060 is a configuration constant/helper. If so, rename to \u0060DEFAULT_PAIR_TIMEOUT\u0060 or similar to distinguish it from the action \u0060Pads.pair\u0060. (signatures: configd.pad.Pads.pair(mac: str, timeout: Duration): PadResult | configd.pad.pad.pair_timeout(requested: u32): Duration)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"fdc2b92d7033d6ae0f40df3583792080290dd236e8f684bedd1af4615e82416e"}},{"ruleId":"D22","level":"warning","message":{"text":"While technically distinct types, the \u0060infer\u0060 method signature is identical across different backend implementations (\u0060onnx\u0060 vs \u0060rknn\u0060). If these are meant to be interchangeable via a trait, the trait should be exposed. If not, the duplication is acceptable but highlights a potential lack of abstraction.: Ensure a common \u0060InferenceBackend\u0060 trait is defined and used if these are meant to be polymorphic. If not, this is a minor consistency note rather than a strict error, but worth noting for API design. (signatures: duck_detect.onnx.Model.infer(frame: \u0026[u8], out: f32): Result | duck_detect.rknn.Model.infer(frame: \u0026[u8], out: f32): Result)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"145f8679a25cc12e2b64ff71a9094a144fafe2d8cc4bf6d4045786c7beb473dc"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 23 project(s) overshoot their size bounds, lowering Project Cohesion to 9.4/10. The most over is \u0060duck-ipc-proto\u0060 (6255 LoC, 148 public types across 1 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":"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":"129c3e98bf027353d5aeef71e5bf36c5d842129221f64c4695b9245030fd808a"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"2129223a2ceb8cfc04ac8d4edd450a9dbd20536abae067f1d0102ef0f31ffef4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"3163556e9b37816979f484087b4dbf3e67cc9b97cb6700261c34873a6647e3df"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"fb1d47dd9a1e1b6d0777c4c776581d56cd621a67b6e99cc4805b83b0404f07d5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"ee23f86f3b529b484391fe45b94ff2181e24d196a98ba51ea549eb275d86bc80"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"9d40cede01e346077f2be4d7885b988226addf060ad63800dc006ec2cc1754a9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c2e3b341c8b65b383d44f7abddc36cccbf724cdbe50bce7a663c07f80d44f52f"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"3f0e209843adf71bda4c92aa71817b7b099e6291e886dd9f49af34cb27a73a7b"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"3018c374e2e9c7b511078c4c9772ae8f8be2ea102d04dec12826041ab542b20d"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"9c9efdbd1796ff6dcd65d559918fd4e7654df2270ec97f0a2959dfaa7161b240"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"6560f265b09364c6250850b7a51ffdc58f59b21550e8b04e0972697114a61578"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"85364f1748c69179bdedcc4e11279d971ef8591555a0d0820c2af3fed876ad9f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"302195100311ee3f943e7aa3d37f671cfd49ab02c972f10c3b60da8e730f7cbe"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"e1eb94f8c6a0f40dded6a5208b2426134554fb0f5690700876b46ebbd41a7f0b"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"40c80f1cdae728dee45851deb30af5b20cfc6c546050918ea8de2a5db85afc9b"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"e595a38825f47c13052e0d149ea3fde14cd82d74da40e3df54de193f476529ea"},"taxa":[{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"a1f31e3fc38e806c632551480508ae27b2701acddad0a9d80c648ba1fc9463b3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"866f5db9e17cba13054be81498300d5689d6380b38ab693dd948f99e20adbff5"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"54015389eb5f9a0beb6433e209224f32665bbffd45f48b4ac71eacdc7584cddd"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c1bb7814097052b3b9e49cf20adb5ffa3c94da3abc00863955683dc4725b2e91"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"05dd1cc6a6536213feac72458953b3ecc92da85b7219289a9d2c68054660f8e9"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"58416306c1a27a37c4768b939e55dd2865e8672774adab59964be2ffeffdd74f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"53041d0452eb7a0f6d7363cca46cccfc47fe77904a465fee573e39f7c59d9395"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c52164266fcb7e0daeb69466e90e70cf55f61b711dad3de792b478f4bd542aa2"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"9258488a9063d06de578a4e9568800b9f0c55ad1345e829d7ac39a2ae11e4f87"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"ae4b19a624088a80ae967fa19fc6e2d3b4d86bf95f6afb9918729adad8224e32"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"a1873f73df2980e05749fb989e4983bd7e44b6790994284629fa7f4a2ef29ad4"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"99c8716916ca0dd9ddee8302208a5745bab6513f34ca12c2672d93f07c07be5f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"cc8b8cec5bab8a78c112d2579123538682d6ceab8113091834d3a36af69552d0"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"947ba76d4628ac852b722d0a2f2638ba590702151ec71657920a1fd55e8cc215"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"6e31fd2f0f817d6c2089419e2e061473f2542d709ca00cd177477cea7fc71afe"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"6cde03804f4b3aee6750b50681ec93104d9b02d52f0389dc3fe89d2ce236dba7"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"76fac36c6dff6ac34a57fd8b18ae1bb45fadcdf80ce311d4dd20e917a7b9918e"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"82f8a289a5c2406f37c7c37d3f9cd74d4edd29c100d1930dcf816f0c999352b3"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"de78c66291369eccf94d359ec0c66ce05c2b90c1ce54745bc8aa1eb34a5e2677"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-829","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"dacc0fbed831c5151c2e1f5b3a0730978e5516371200e85cac1f3169f4336dd7"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"5bc85f08223fa72f6176541465286af52cf535be4cfe4786b746baa901a8333f"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"fd34071f0a37397b22950926e6e7d533f19a1ab2e35c80a3ec230eef7195ce4c"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"a5a94de598d5f66dcc4ccfd4adeb9bbd82d59e61120ddfa86a1354ef816f7094"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"94112b1d706b2f9d9118c577518290919c2d702aa0b944fa06a5bcbb51101185"},"taxa":[{"id":"CWE-250","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"495e1b0b2a07ba00a8ca73daffd305231bf5656971e4f9bd36bd2a4c3ca2618b"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"41e0f49548014cf82486708f896a71e4acf812b40811cf5743dfc6d47b24bf72"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"3341aab7f25e3ccb82bd100f891964fc0eba48189ba4c468c3d1204323f6d333"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"28c806bf4965eca2a179ce979123df96d8087067b8ae261d7b5c1fddabf4b015"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"9aee9527e1276543253d4a33040f65a3ff218870a17b7056b69afe973caf7569"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"b89c936d2f72d26a51da610c25fccabf7b0d67bd9fb021a297cc261a2c177bbf"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"8ef72fd22bceb01e9ba21d28e1eca453407c18c73eb311b7d050480d243c62c8"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c12d77a046be3c491ba9121875ddb72d7b4c3de475f223aeaa914b9069c33928"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"4a95d0211c5425e9811599eefb962fe894baae264cf3bf727250667524d143e3"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"808a257ad2e0139c7efe1aae4e437560ecc72ee91fb9206d5d4e3aca487a1ba3"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"e05bf4826423a9f77039c6cb4dfc3312f0d6c72633e62839f69d8b803205a59d"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"feefe3ddda21ffad04e3fb13e7c4469ae2cc02924a73ffefc1c031142f21f819"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"2b71f60856a9b54d0d6b2b4bca999af438d592553ea62f9b530cba6abfe54d90"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"f052381440c941d33a0cbbf777d17483d3b6bd4d36d5ea4077c67f7bd5a7dba9"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"ad2b2cd9a703d68d435c6273b11ac631ab8c30d3088b23cb356c5fcc2d91da86"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"b60f929929e2f368dde6f346e814dd68cee0b3e5c00f7077b68b73048378a295"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"c45aca8cc8b6997f9273876813860a187bfaea9e675ae243c17185c5a9b42e3c"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"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":"513fee054fadaca0334d249855f665b14f1dc6c60315616a9563ceae098cd822"},"taxa":[{"id":"CWE-494","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","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":"2133a8c81131864f60647d3f47d16be9790dc48ee900b5d203fa2856f85f525f"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-552","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","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":"e06c4c144999d551e6fbba9dd4e56dbc2fbd94e2a305a26b8acb81c5c4538bc6"},"taxa":[{"id":"CWE-522","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-552","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","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":"c75adb92445f709e2875c92fe2eb3b3d0a9dc6149e778b2fc2cfb8ea1c76ca1b"},"taxa":[{"id":"CWE-532","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","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":"642efbd6ff8397003a7d6b88bc5600b6e62aba767b08d3d3c271033add1e9f29"},"taxa":[{"id":"CWE-532","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":"8d503622cd864ad1abf1e850a51d032e629f951fa7abbdd9273b09f984fefeec"},"properties":{"dependency":{"package":"gradio","version":"5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","PYSEC-2026-1410","PYSEC-2026-1418","PYSEC-2026-1423","PYSEC-2026-211"],"reachability":{"kind":"production","file":"spaces/hello/app.py","line":11}}}},{"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":"5922a5beeab5ac077ffb485a783ad545036e79b56239f83da38f3fb84336b113"},"properties":{"dependency":{"package":"paste","version":"1.0.15","advisory":"RUSTSEC-2024-0436","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":"80b5c22beae306eb623d7a60ec13361ab89285e1cc30fcf5b8daa2e87ffb5c69"},"properties":{"dependency":{"package":"h2","version":"0.4.15","advisory":"RUSTSEC-2026-0258","aliases":["[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":"3035e85b1a9c0c33df37dc333f490439b3fa52aefda24a401e2e75a177cdf778"},"properties":{"dependency":{"package":"rustls","version":"0.23.42","advisory":"RUSTSEC-2026-0285","aliases":["[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D31","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":"a64fc08866885a7490aaa4eb9cef53c3f8357446fe86a7ada11727cc05296b31"}},{"ruleId":"D31","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":"625e12e80843e95391d5cb320ab029e080a82b466df7c130f2d2be3361b4b4d5"}},{"ruleId":"D31","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":"2d0e96ae2473469403eb0fe06a075b66d19646556d022880742f7f1c9a9baf88"}},{"ruleId":"D31","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":"579ed4df143d09f5e46de6c0b97f27dad58e1669be158385fe5817b3e69a3bed"}},{"ruleId":"D31","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":"90408d2538abc21ae13dd765f56ab85caf431b56bf19ac20383a1417c021f530"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"40e1d50ac3c36b0d366a2e10f836bf4b733cb0492f76ddf607f9ee3945cf37d8"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"1a7d07d2b86f1f3fe3ed50824a89725ce5637052523ebb2ee3008b8deb260cfc"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"b424d82473c227da648f8a611c6b85aa08a66fa4ea5c2cd2abd20acce2512f29"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"de58b797d0d899508c5562319e0d072191db69f8ff1bb3be41edd394700f4072"},"taxa":[{"id":"CWE-527","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-538","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"b9dac3884db7ee15de2b67738984b10ebf3d340dc156fe8e92a85ef0d7a60f86"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"b8779af7a6808ccb754e717f325db237decc84560abd473b7e159655b05324fe"},"taxa":[{"id":"CWE-1357","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-353","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"87c947703fc53d8ea69a63297c60edf498ecdf28322e9a313fc20ff7da876b59"},"taxa":[{"id":"CWE-527","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-538","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D31","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":"347fc47e7a3b52e1a30149e73c8be40590a5fb6eeabdd78c83e55ff9e8c78b9c"}},{"ruleId":"D31","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":"8ec2829a61fe64fda1fee8ba424361cb77c9dec91beb4abc1179f40ee0de4634"}},{"ruleId":"D31","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":"7b2dd3bf46448ef6a3978015d792cb2bb64b7c38d16204994cb450f38e925440"}},{"ruleId":"D31","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":"d4dc29aa095db26417bb5063edb243c68118050dbd5ade4ae78c0c65189f3195"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: route.rs \u2194 ipc.rs: \u0060mediad/src/route.rs\u0060 (context mediad) and \u0060updater/src/ipc.rs\u0060 (context updater) sit in DIFFERENT parts of the tree yet change together 62% of the time (10 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060f2bda509\u0060 \u0060duckctl logs\u0060: a daemon\u0027s last words, over the radio; \u00602b112cbf\u0060 head IMU: unambiguous head_imu.* naming \u002B publish the sensor mount pose; \u0060648d7d25\u0060 route imu.stream: over WebRTC (mediad), refused on BLE (btd) and upda\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/route.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c7eaaa7bdcfa7689e086873d547936d73ed070de72aa92c992aa6815154d988"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: route.rs \u2194 ipc.rs: \u0060btd/src/route.rs\u0060 (context btd) and \u0060updater/src/ipc.rs\u0060 (context updater) sit in DIFFERENT parts of the tree yet change together 56% of the time (14 of the 25 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) \u2014 the bounded-context boundary may be in the wrong place, or one context is leaking into the other. This is the behavioural boundary violation a static scan can\u0027t see. You can check this without leaving the row: of the 14 shared commits counted here, the most recent 3 are \u0060f2bda509\u0060 \u0060duckctl logs\u0060: a daemon\u0027s last words, over the radio; \u00602b112cbf\u0060 head IMU: unambiguous head_imu.* naming \u002B publish the sensor mount pose; \u0060648d7d25\u0060 route imu.stream: over WebRTC (mediad), refused on BLE (btd) and upda\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"btd/src/route.rs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f1e2c81c8c3343b0624b0d4b4451fd1d51bc9123f15ff7ba5a39c6d1c02be4a"}},{"ruleId":"D36","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":"1b213f6eedd4b140d0bc37bdf1496f72811a643f34064f12518b32e9e83bcfc7"}},{"ruleId":"D36","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":"eb00976a698a5d68999b7ee6d27206fd374e916853e7ff1ead5eed42386f043f"}},{"ruleId":"D36","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":"90f83b4fa27db32740afe9540c905f3c0499caed87f61049a8a903ecc95b41c3"}},{"ruleId":"D36","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":"0752d0df7434000fcabf1048e2de30a7a1a8b982b3db9a19898c4dec199856b4"}},{"ruleId":"D36","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":"d068c977b62d9a977df1bb6f53e8b00b586c3abee955f91d715f92b8e019d624"}},{"ruleId":"D36","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":"d657599f6f99da1927d3377533dfc0888b34c4d84aa7d5579841fd72d0e39bce"}},{"ruleId":"D36","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":"ace515990e7ee0f17b5c17e44dd168a5bdecf90804a3a3dd845cf05540978013"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/webclient/index.html"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"66b32de0769cd1fd28872f417ee679cecda1851e67617c0e6228e16ff7c47e38"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/webclient/index.html"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f90c566d8e9a9b9b8dd03e3496df4714e7eb97fb158772153c1d2d6e7cd8a44"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/webclient/index.html"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"4161fd54e7382e65cc6146df15afe4435e198832441aaa2e158a5b797d8a95b5"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no a11y linter (an accessibility check that can read your UI \u2014 no component framework was detected and your pages are rendered by server-side templates, which neither the JSX/Vue ESLint plugins nor the HTML-template linters can parse; run axe/pa11y over the rendered pages, or assert the accessibility invariants over that rendered HTML in the test suite you already have) and no axe/pa11y/Lighthouse in tests or CI. Start by running that check over your rendered pages in CI. What was searched, so you can tell an absence from a miss: the 3 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":"AX7","level":"warning","message":{"text":"Cross-slice coupling: btd \u2192 duck_ipc_proto: \u0060Sighting\u0060 (slice \u0027btd\u0027) depends on \u0060ChoraleBeacon\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"btd/src/chorale.rs"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"947d61fd0de2d387efc76686141c23ae2bf8aad2a030e0b66467e2ac15a7af74"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: configd \u2192 duck_ipc_proto: \u0060FakeState\u0060 (slice \u0027configd\u0027) depends on \u0060Pad\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"configd/src/pad.rs"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aecba4cd2d339ecac461b5c79b8b76169f0fb7067711ccbc01010ea56a27c5b"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duck_control \u2192 configd: \u0060Policy\u0060 (slice \u0027duck_control\u0027) depends on \u0060Net\u0060 from slice \u0027configd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-control/src/policy.rs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"f03010eaab5b2bfdb5d61390e1f6c3e171f0480773112cbd2fc1d8db09ccafb4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duck_control \u2192 btd: \u0060RemoteIo\u0060 (slice \u0027duck_control\u0027) depends on \u0060Link\u0060 from slice \u0027btd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-control/src/sim.rs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"a943310ff4a3ca460763796788b71c29882c68c18803e4765feb8422310f21e7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duck_ether \u2192 duck_ipc_proto: \u0060OnAir\u0060 (slice \u0027duck_ether\u0027) depends on \u0060ChoraleBeacon\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-ether/src/main.rs"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"22d5fa7b37ccc56dea887da6128d215e43ec30ae2c75a1121cc31aeb1e2e4754"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duck_ipc_proto \u2192 btd: \u0060LogEntry\u0060 (slice \u0027duck_ipc_proto\u0027) depends on \u0060Outcome\u0060 from slice \u0027btd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":3264}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc947c3ab1a6345e8fb74c7f00ca7881038412f9627c085152df50ab9a29d962"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duck_ipc_proto \u2192 duck_control: \u0060NetScanResult\u0060 (slice \u0027duck_ipc_proto\u0027) depends on \u0060Network\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duck-ipc-proto/src/lib.rs"},"region":{"startLine":4027}}}],"partialFingerprints":{"codehealthFindingId/v1":"4022ff6e3b93991676e4cf8a9a9d840f375121e943401282318d6dc7828ffbaf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: duckctl \u2192 duck_control: \u0060Cli\u0060 (slice \u0027duckctl\u0027) depends on \u0060Command\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"duckctl/src/main.rs"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"fccc4baa15cacfce26134c9ac890c115f2fb9fddae16fadcc8ca36363cc8eeab"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: kinematics \u2192 configd: \u0060Tracker\u0060 (slice \u0027kinematics\u0027) depends on \u0060Config\u0060 from slice \u0027configd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"kinematics/src/hand.rs"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8024ac72a7730c832b38068eb6dadaa8140f79b3eb12f6818f1925d6232e18"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 robotd_params: \u0060Settings\u0060 (slice \u0027mediad\u0027) depends on \u0060CongestionControl\u0060 from slice \u0027robotd_params\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/pipeline.rs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"5654e2cbc17fcfb80e2c9de6817b5656a7900ce8039a043277431bdb40397ac4"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 duck_ipc_proto: \u0060Published\u0060 (slice \u0027mediad\u0027) depends on \u0060RemoteStatus\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/relay.rs"},"region":{"startLine":412}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fc4cae173397ff87fcade161dac92c382ecdad3a8c9bf57ef46cef2ec6c7cae"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 robotctl: \u0060Relay\u0060 (slice \u0027mediad\u0027) depends on \u0060Client\u0060 from slice \u0027robotctl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/relay.rs"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1590f02dc6bb33e495a5a6ddecae09f064cd7eb426d8c442a9b2852c5d8ac84"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 robotctl: \u0060Hub\u0060 (slice \u0027mediad\u0027) depends on \u0060Client\u0060 from slice \u0027robotctl\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/relay.rs"},"region":{"startLine":1232}}}],"partialFingerprints":{"codehealthFindingId/v1":"4868067f3a5824331acb239ad85574d4d2e0278d435e84a76dec13c89c50d52d"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 configd: \u0060Live\u0060 (slice \u0027mediad\u0027) depends on \u0060Config\u0060 from slice \u0027configd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/stream.rs"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"97875893f515d04bfc866a675d4238494794946b3a8779badcd30bab04b8a8f6"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: mediad \u2192 btd: \u0060Pool\u0060 (slice \u0027mediad\u0027) depends on \u0060Sockets\u0060 from slice \u0027btd\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"mediad/src/upstream.rs"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9781d91f879adc6d10d216a35a70ef2c1515b1be6abdce4c16aac9c773725be1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: pad_imu \u2192 duck_ipc_proto: \u0060Imu\u0060 (slice \u0027pad_imu\u0027) depends on \u0060PadImuDevice\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"pad-imu/src/lib.rs"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3e1e3f7c411a03ff51f92f0f5ae498acc6781a2f02478ce967b3a5cc8beaca"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: padd \u2192 mediad: \u0060Tap\u0060 (slice \u0027padd\u0027) depends on \u0060Shared\u0060 from slice \u0027mediad\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"padd/src/tap.rs"},"region":{"startLine":113}}}],"partialFingerprints":{"codehealthFindingId/v1":"e15de902d063d461af301081bb24cd02e83a9aa469c13e364cec2cfb70df85b1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: padd \u2192 pad_imu: \u0060Shared\u0060 (slice \u0027padd\u0027) depends on \u0060Imu\u0060 from slice \u0027pad_imu\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"padd/src/tap.rs"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"18c0dbd1b1a31a7f921cfce8deec20a1e34b2166e61a1ceb815fae62d5e8956f"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: padd \u2192 duck_ipc_proto: \u0060State\u0060 (slice \u0027padd\u0027) depends on \u0060PadReport\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"padd/src/tap.rs"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"196510eee3d761566b2efdb94bebfcd62537182186196c502a69e8fb0d412cdf"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060Shot\u0060 (slice \u0027robotctl\u0027) depends on \u0060MediaFrameHeader\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/camera.rs"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"8026b4dff25d7df262a3fb2078ca1d152f425083e023a1729aeca996a2aa1f98"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 kinematics: \u0060Model\u0060 (slice \u0027robotctl\u0027) depends on \u0060Body\u0060 from slice \u0027kinematics\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/duck.rs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7f5be7b3c8a1bc641958da9a844d6fbbf91ad6515342e8a2f38670b3f7e9132"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060ComponentReport\u0060 (slice \u0027robotctl\u0027) depends on \u0060CheckAttempt\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":1461}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c7f3a62a3f3876edba936cbe513db419c3c2e504a6bf620173be6e74b41d5f7"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060VersionReport\u0060 (slice \u0027robotctl\u0027) depends on \u0060ServiceUnit\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":1614}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aff6054449be17929b935603ae705660db7e5e8ae0e8a74cd364d1a84d89f97"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060HealthReport\u0060 (slice \u0027robotctl\u0027) depends on \u0060HealthResult\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/main.rs"},"region":{"startLine":1632}}}],"partialFingerprints":{"codehealthFindingId/v1":"468c1949b9d4b86c3b24303bfa3fd2251a570bcf94477bb1f877a54d97b8b1cb"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060PadView\u0060 (slice \u0027robotctl\u0027) depends on \u0060PadInputDevice\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":1046}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8d214b87f37353cb65078182c8a2c6dd9ab0853e747ec26856699a3f7295f55"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotctl \u2192 duck_ipc_proto: \u0060View\u0060 (slice \u0027robotctl\u0027) depends on \u0060SubscribeResult\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotctl/src/monitor.rs"},"region":{"startLine":1357}}}],"partialFingerprints":{"codehealthFindingId/v1":"e667a0bbae1c0d0a46ce39194fa293a69ab9a26db1f94fd8684fde0443116692"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_ipc_proto: \u0060Peer\u0060 (slice \u0027robotd\u0027) depends on \u0060ChoraleBeacon\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/chorale.rs"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"de683738fe79b41a24cb6a772ff4ec06794d42c6148c39ac9e59b743b4f69dff"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_ipc_proto: \u0060Tick\u0060 (slice \u0027robotd\u0027) depends on \u0060ChoraleAdvertise\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/chorale.rs"},"region":{"startLine":148}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eb24c740f6ece4507b3084aae4f794e739f394e8c8486458675fdf5d5220503"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 sounds: \u0060Chorale\u0060 (slice \u0027robotd\u0027) depends on \u0060Score\u0060 from slice \u0027sounds\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/chorale.rs"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"93b9eb505c5fefb8fbc9e74ef1bedf336120205811ccc829ed25c0618eb9b639"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 robotd_params: \u0060SkillTuning\u0060 (slice \u0027robotd\u0027) depends on \u0060SkillDef\u0060 from slice \u0027robotd_params\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/control.rs"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"2912ae730bfbf9a7c6cdc7c7f003694ebb47426e4b92aa5b827bd4a4d818ef19"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_control: \u0060Controller\u0060 (slice \u0027robotd\u0027) depends on \u0060Policy\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/control.rs"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eb616d478a3c8a4d660186f1afdbd52f696aa9278c52b9879a85a7fe74d9d87"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_ipc_proto: \u0060Intents\u0060 (slice \u0027robotd\u0027) depends on \u0060ChoraleHeard\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/intents.rs"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9170e4ef0e57ff18475480103b317f57affe5221af819bdfad18a81faf799a3"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_control: \u0060Snapshot\u0060 (slice \u0027robotd\u0027) depends on \u0060Command\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/intents.rs"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3bb61a014182bf5d9ffb10087bd72f00f28cdfc19896085e35e77ff45043df1"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_control: \u0060Args\u0060 (slice \u0027robotd\u0027) depends on \u0060Command\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":225}}}],"partialFingerprints":{"codehealthFindingId/v1":"695bdce12b6d4bd0e61909fe72bfad01e13a682003c2a622ca23e23e8b9ec789"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 robotd_params: \u0060PendingSwap\u0060 (slice \u0027robotd\u0027) depends on \u0060PolicyParams\u0060 from slice \u0027robotd_params\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":1481}}}],"partialFingerprints":{"codehealthFindingId/v1":"42ec22253accced281fc8bceeb3c94ca28debd4c0a059f2a73ceeeb430a1df48"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_control: \u0060Coast\u0060 (slice \u0027robotd\u0027) depends on \u0060Sensors\u0060 from slice \u0027duck_control\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/main.rs"},"region":{"startLine":3335}}}],"partialFingerprints":{"codehealthFindingId/v1":"c434c905ea6013e1613bd268bcc1d03409810e4f920527327fca4d6e643eb8a2"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 mediad: \u0060Sound\u0060 (slice \u0027robotd\u0027) depends on \u0060Live\u0060 from slice \u0027mediad\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/sound.rs"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0ad16e41bf823b92b60779941498c7475becd637b308134955258343885daa5"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 duck_ipc_proto: \u0060Note\u0060 (slice \u0027robotd\u0027) depends on \u0060ThereminState\u0060 from slice \u0027duck_ipc_proto\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/theremin.rs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80bb3cb7d4612c877459b2218d21f2143130a6af4e43bf55627220c3cd19d85"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd \u2192 kinematics: \u0060Theremin\u0060 (slice \u0027robotd\u0027) depends on \u0060Tracker\u0060 from slice \u0027kinematics\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd/src/theremin.rs"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"43bf35f9150260ad27b2a13cfbd34c8ce1b06dec815992278252e711e813882e"}},{"ruleId":"AX7","level":"warning","message":{"text":"Cross-slice coupling: robotd_params \u2192 mediad: \u0060Params\u0060 (slice \u0027robotd_params\u0027) depends on \u0060Control\u0060 from slice \u0027mediad\u0027."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robotd-params/src/lib.rs"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e0802d176ec1f43015bcbf4bb69178ac8eb1752124bb5383f2e853d4f0d430c"}},{"ruleId":"M2","level":"note","message":{"text":"ADRs not easily discoverable: 2 ADR-shaped document(s) detected by content \u2014 \u0060docs/design/updater-design.md\u0060, \u0060docs/project/ci-setup.md\u0060. They are not under a conventional ADR folder (docs/adr/) and are not named NNNN-title.md, and this check found them by their decision signature rather than by where they live \u2014 so a reader who does not already know these paths has no route to them. Detected by content signature only: records kept outside the repository, or written without a Status/Decision/Consequences shape, are not visible to this check and are not counted here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ea921cf64dae701abd877090b3279ff10d03c2e3250e26c8c299d7c5665e0d3f"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 15/20 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060duckctl\u0060, \u0060robotctl\u0060, \u0060sounds\u0060, \u0060spaces/hello\u0060, \u0060xtask\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"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"}}],"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-1032","guid":"5f21e517-68aa-a650-9a25-5771ef024637","name":"OWASP Top Ten \u2014 Security Misconfiguration category","shortDescription":{"text":"OWASP Top Ten \u2014 Security Misconfiguration category"},"helpUri":"https://cwe.mitre.org/data/definitions/1032.html"},{"id":"CWE-1357","guid":"e4d2e772-757e-0a5c-bd7d-77052949d866","name":"Reliance on Insufficiently Trustworthy Component","shortDescription":{"text":"Reliance on Insufficiently Trustworthy Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1357.html"},{"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-16","guid":"659db3ea-affc-8453-8add-c1218fbfcb92","name":"Configuration","shortDescription":{"text":"Configuration"},"helpUri":"https://cwe.mitre.org/data/definitions/16.html"},{"id":"CWE-250","guid":"52ee12e8-390a-7351-b1e6-388afa694e54","name":"CWE-250","shortDescription":{"text":"CWE-250"},"helpUri":"https://cwe.mitre.org/data/definitions/250.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-353","guid":"09d7e902-d4ee-f05d-ae6c-0a1554d0c18f","name":"CWE-353","shortDescription":{"text":"CWE-353"},"helpUri":"https://cwe.mitre.org/data/definitions/353.html"},{"id":"CWE-494","guid":"b8a65e0d-e459-4a55-a931-fc1136482375","name":"Download of Code Without Integrity Check","shortDescription":{"text":"Download of Code Without Integrity Check"},"helpUri":"https://cwe.mitre.org/data/definitions/494.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-522","guid":"71fb233e-ce6a-ae57-9419-ef8373540b09","name":"CWE-522","shortDescription":{"text":"CWE-522"},"helpUri":"https://cwe.mitre.org/data/definitions/522.html"},{"id":"CWE-527","guid":"79b27cde-9d04-1a54-b64b-d5bb9b4a8ee7","name":"CWE-527","shortDescription":{"text":"CWE-527"},"helpUri":"https://cwe.mitre.org/data/definitions/527.html"},{"id":"CWE-532","guid":"1cd8877a-76e8-ce54-b40b-779af23364a0","name":"CWE-532","shortDescription":{"text":"CWE-532"},"helpUri":"https://cwe.mitre.org/data/definitions/532.html"},{"id":"CWE-538","guid":"3baa1f05-df1b-ae58-9ee0-1d790ff4a989","name":"CWE-538","shortDescription":{"text":"CWE-538"},"helpUri":"https://cwe.mitre.org/data/definitions/538.html"},{"id":"CWE-552","guid":"3492436b-eca2-9c54-9ba3-5dade427c903","name":"CWE-552","shortDescription":{"text":"CWE-552"},"helpUri":"https://cwe.mitre.org/data/definitions/552.html"},{"id":"CWE-732","guid":"1da27e8f-b330-7650-ab63-bd61953eae5d","name":"Incorrect Permission Assignment for Critical Resource","shortDescription":{"text":"Incorrect Permission Assignment for Critical Resource"},"helpUri":"https://cwe.mitre.org/data/definitions/732.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-829","guid":"13c33925-97fb-5a5e-b40c-56d328b8a4d7","name":"CWE-829","shortDescription":{"text":"CWE-829"},"helpUri":"https://cwe.mitre.org/data/definitions/829.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":89,"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."]}]}