{"$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":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D8","name":"Code Coverage","shortDescription":{"text":"Code Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/D8"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D10","name":"Test Quality","shortDescription":{"text":"Test Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D10"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"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":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"]}},{"id":"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":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AXB2","name":"Runtime readiness","shortDescription":{"text":"Runtime readiness"},"helpUri":"https://codehealth.canine.dev/dimensions/AXB2"},{"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":"P10","name":"Library API \u0026 versioning","shortDescription":{"text":"Library API \u0026 versioning"},"helpUri":"https://codehealth.canine.dev/dimensions/P10"},{"id":"P12","name":"CI test-gate honesty","shortDescription":{"text":"CI test-gate honesty"},"helpUri":"https://codehealth.canine.dev/dimensions/P12"},{"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":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R5","name":"Dependency Freshness","shortDescription":{"text":"Dependency Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/R5"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"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":"constructor (cyclomatic 89): constructor has cyclomatic complexity 89 (threshold 15). Of this number, 69 points are the body\u0027s own statements and 20 belong to 6 function literals inside it that branch. 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":"src/platform/graphics/render-target.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"8028c48c8ef13e915544effd7da742bc6226328c882f96d60360df4f8c29fb08"}},{"ruleId":"D1","level":"warning","message":{"text":"TextElement._updateMeshes (cyclomatic 85): TextElement._updateMeshes has cyclomatic complexity 85 (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":"src/framework/components/element/text-element.js"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"c132f505ea9b30ac6d59ea69609cdc33cd6fcd96800502937ea0d15b8e8e5d68"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementComponentSystem.initializeComponentData (cyclomatic 84): ElementComponentSystem.initializeComponentData has cyclomatic complexity 84 (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":"src/framework/components/element/system.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"baf943015f70faf809590d26198272d798fc9ed5a21bbc38d9917725c11e2ce9"}},{"ruleId":"D1","level":"warning","message":{"text":"basis-worker.BasisWorker (cyclomatic 84): basis-worker.BasisWorker has cyclomatic complexity 84 (threshold 15). Most of this is not in the body itself: 1 of the 84 points is its own statement and the rest belongs to 17 function literals inside it that branch (lines 295, 191, 60, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"868f212c4b2fa4f4fd4ad7ee292bb051dc2757836523bfe6c957c0d6b777f305"}},{"ruleId":"D1","level":"warning","message":{"text":"WebglTexture.upload (cyclomatic 74): WebglTexture.upload has cyclomatic complexity 74 (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 is NOT this file\u0027s highest cyclomatic complexity: WebglTexture.initialize (cyclomatic 76) 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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"5971d3a96b6bc7ec64e85365bebe3d64b9db98b2ca1fc1770325e9b8f3617c58"}},{"ruleId":"D1","level":"warning","message":{"text":"gsplat-sort-worker.SortWorker (cyclomatic 73): gsplat-sort-worker.SortWorker has cyclomatic complexity 73 (threshold 15). Most of this is not in the body itself: 3 of the 73 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 209, 44, 29). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sort-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7bbcc3b175448a663b37f719c708f1975c0ef6368bc84b76b5d4a07cc85e933"}},{"ruleId":"D1","level":"warning","message":{"text":"layout-calculator.createCalculator (cyclomatic 72): layout-calculator.createCalculator has cyclomatic complexity 72 (threshold 15). Of this number, 71 points are the body\u0027s own statements and 1 belongs 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":"src/framework/components/layout-group/layout-calculator.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b3b1c2375ee11d30060cbc666b75bb68143aa46ac4e8c3b93fc2be41fd0491b"}},{"ruleId":"D1","level":"warning","message":{"text":"TextElement._updateText (cyclomatic 58): TextElement._updateText has cyclomatic complexity 58 (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":"src/framework/components/element/text-element.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"1578915fd0866a825c829947be5e374549749c28a734182e6559c23ef6b0c4aa"}},{"ruleId":"D1","level":"warning","message":{"text":"ShadowRenderer.cullShadowCastersOmni (cyclomatic 58): ShadowRenderer.cullShadowCastersOmni has cyclomatic complexity 58 (threshold 15). Of this number, 55 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"7db18ffce50e2c1aadc4f2ada7a3a99909f1a2931e5fbc1611ca031f9fb607a3"}},{"ruleId":"D1","level":"warning","message":{"text":"GltfExporter.writeStandardMaterial (cyclomatic 57): GltfExporter.writeStandardMaterial has cyclomatic complexity 57 (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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"9db62b3fbfcc3889d834817d5fb7c28d75386d6ccdc8e88042e60fd892511d90"}},{"ruleId":"D1","level":"warning","message":{"text":"script-attributes.rawToValue (cyclomatic 56): script-attributes.rawToValue has cyclomatic complexity 56 (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":"src/framework/script/script-attributes.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"2afbe30d488248b6829b5c37541920dd826ba873b6edfaafd8c39acd36ce9280"}},{"ruleId":"D1","level":"warning","message":{"text":"draco-worker.DracoWorker (cyclomatic 51): draco-worker.DracoWorker has cyclomatic complexity 51 (threshold 15). Most of this is not in the body itself: 3 of the 51 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 137, 11, 24, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"22fdda26a1d0ce83d123cf35845fdab432616a23b6ffa59ec6ad79aa0a3e54e3"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor (cyclomatic 49): constructor has cyclomatic complexity 49 (threshold 15). Of this number, 19 points are the body\u0027s own statements and 30 belong to 30 function items inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba605e32e78241a422eecc27b4e75c337bf388ba321a10c96270253c94500333"}},{"ruleId":"D1","level":"warning","message":{"text":"UnifiedSortWorker (cyclomatic 48): UnifiedSortWorker has cyclomatic complexity 48 (threshold 15). Most of this is not in the body itself: 3 of the 48 points are its own statements and the rest belongs to 12 function items inside it that branch (computeEffectiveDistanceRangeLinear, computeEffectiveDistanceRangeRadial, buildIndexMap, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d22e66d60013f23e031da4665bfd22df0f6bd38a522f68eea8dd74bbf65fc867"}},{"ruleId":"D1","level":"warning","message":{"text":"Preprocessor._preprocess (cyclomatic 45): Preprocessor._preprocess has cyclomatic complexity 45 (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":"src/core/preprocessor.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e6003bf7b3e231d0328bd07760f90024e941b9cea04ef3af5334c8de2c6173"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticleCPUUpdater.update (cyclomatic 45): ParticleCPUUpdater.update has cyclomatic complexity 45 (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":"src/scene/particle-system/cpu-updater.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9aa954e03321a52828526c4b245a194afe4c0d912bfb92bf80e1bec6bbe10c5"}},{"ruleId":"D1","level":"warning","message":{"text":"_validateCopy (cyclomatic 45): _validateCopy has cyclomatic complexity 45 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/texture.js"},"region":{"startLine":1482}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5084f6d7b74d6e6ca9607058692ca2421b6fc884c5106453da87cb3e4af1eb5"}},{"ruleId":"D1","level":"warning","message":{"text":"StandardMaterialValidator.validate (cyclomatic 43): StandardMaterialValidator.validate has cyclomatic complexity 43 (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":"src/scene/materials/standard-material-validator.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"4bd70d378d693683a08acc83d74f34e4c9eb6ba03cbefa5c90e2cd3202335cfc"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor (cyclomatic 43): constructor has cyclomatic complexity 43 (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":"src/platform/graphics/texture.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eef66280893307f8ee133464fb61d02f93f6fd1d17bf6d2818de45125d9cd28"}},{"ruleId":"D1","level":"warning","message":{"text":"ShaderGeneratorStandard.createShaderDefinition (cyclomatic 42): ShaderGeneratorStandard.createShaderDefinition has cyclomatic complexity 42 (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":"src/scene/shader-lib/programs/standard.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"850683ca24d4d3ff0c5df52cf7e94c79cc8f49cab9a861d086efe0b4e88f925c"}},{"ruleId":"D1","level":"warning","message":{"text":"draw (cyclomatic 42): draw has cyclomatic complexity 42 (threshold 15). Of this number, 38 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2148}}}],"partialFingerprints":{"codehealthFindingId/v1":"76ac906b2da6d9e6de39d8d39821df883d99731c2f159396020e336f8aabd0f1"}},{"ruleId":"D1","level":"warning","message":{"text":"frameUpdate (cyclomatic 42): frameUpdate has cyclomatic complexity 42 (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":"src/extras/render-passes/render-pass-compose.js"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"9be5acbf7fa6cec11ff0bf82fa52775455860f838dc919097cabe3deed7190c8"}},{"ruleId":"D1","level":"warning","message":{"text":"RigidBodyComponentSystem.onContactPair (cyclomatic 40): RigidBodyComponentSystem.onContactPair has cyclomatic complexity 40 (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":"src/framework/components/rigid-body/system.js"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"04446f8548f56c4abd7e434778cfac84897e231c315a3a6bc5c2f85ea52168cc"}},{"ruleId":"D1","level":"warning","message":{"text":"MiniStats.rebuildGeometry (cyclomatic 40): MiniStats.rebuildGeometry has cyclomatic complexity 40 (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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"3053e5c8b2b1526f85983c05d9c49a8d92214648345177e7ee86694e50b8d6fa"}},{"ruleId":"D1","level":"warning","message":{"text":"start (cyclomatic 37): start has cyclomatic complexity 37 (threshold 15). Of this number, 35 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":"src/framework/xr/xr-manager.js"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"f17a406a7e866cdbc0e078e98cd864cfd392951a2487341d0706e1178806b673"}},{"ruleId":"D1","level":"warning","message":{"text":"ForwardRenderer.buildFrameGraph (cyclomatic 36): ForwardRenderer.buildFrameGraph has cyclomatic complexity 36 (threshold 15). Of this number, 35 points are the body\u0027s own statements and 1 belongs 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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":661}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad1af435c67e24b4663ae774a05224abaf0ff2277d922ed46acfb93021557df"}},{"ruleId":"D1","level":"warning","message":{"text":"log (cyclomatic 36): log has cyclomatic complexity 36 (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":"src/platform/graphics/render-pass.js"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5225b7369d4247a5913a4310d47cf432c74b623690c479894b9f1fc37cbb48"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatBudgetBalancer.balance (cyclomatic 35): GSplatBudgetBalancer.balance has cyclomatic complexity 35 (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":"src/scene/gsplat-unified/gsplat-budget-balancer.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"aed1deac85103a44b6ee4e1eb019e476673720c52d7bad0cc880a731c44f7542"}},{"ruleId":"D1","level":"warning","message":{"text":"TextureRenderer.draw (cyclomatic 35): TextureRenderer.draw has cyclomatic complexity 35 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/renderers/texture-renderer.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"8fd878f6a8b8a672012e7ed5a61fffa3665191de9e7b7d84a34776f557968e92"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchManager.create (cyclomatic 34): BatchManager.create 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"41a7926669b6ff5628fedafec6a95726cae628ec1d49a0e8ec9194de9c4db673"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatBoxShaderEffect.generateLUT (cyclomatic 33): GSplatBoxShaderEffect.generateLUT has cyclomatic complexity 33 (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":"scripts/esm/gsplat/shader-effect-box.mjs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cdf55003cadac4ea85c96794e6521c1d8a6ecb696a0e85a115ddbc0ba869a9b"}},{"ruleId":"D1","level":"warning","message":{"text":"ConeBaseGeometry.constructor (cyclomatic 33): ConeBaseGeometry.constructor has cyclomatic complexity 33 (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":"src/scene/geometry/cone-base-geometry.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe9b59f778a4e2a30afa61aa8e5e8c8f13f00cabd50dbf85fc86458fc2c16fa2"}},{"ruleId":"D1","level":"warning","message":{"text":"Lightmapper.bakeInternal (cyclomatic 33): Lightmapper.bakeInternal has cyclomatic complexity 33 (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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0f96f3365351ba5b328b2826dacfb1e85a9081eb0fbbcce7c3ca008c7e805e"}},{"ruleId":"D1","level":"warning","message":{"text":"glb-parser.createAnimation (cyclomatic 33): glb-parser.createAnimation has cyclomatic complexity 33 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 9 belong to 2 function literals inside it that branch. 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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d19410f555af807c8d4cf804e0a127e694e2af610a4d60458e7804fd2f44df"}},{"ruleId":"D1","level":"warning","message":{"text":"update (cyclomatic 32): update has cyclomatic complexity 32 (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":"src/framework/handlers/cubemap.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"b84d83e47b0f9bad43410a182a6e4f553b808c9c0fdf7534be99e109683e1249"}},{"ruleId":"D1","level":"warning","message":{"text":"Texture.setSource (cyclomatic 31): Texture.setSource has cyclomatic complexity 31 (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":"src/platform/graphics/texture.js"},"region":{"startLine":1257}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf0e0405368a54d2a3ae1d05bb89a329036732d2eb5568082d7529d7afe8227e"}},{"ruleId":"D1","level":"warning","message":{"text":"Mesh._initBoneAabbs (cyclomatic 31): Mesh._initBoneAabbs has cyclomatic complexity 31 (threshold 15). Of this number, 27 points are the body\u0027s own statements and 4 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":"src/scene/mesh.js"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"9efaf2eac03230be1355f04178b84064c06a1255b17cc105776cd264c9f7516d"}},{"ruleId":"D1","level":"warning","message":{"text":"ScriptComponent.create (cyclomatic 31): ScriptComponent.create has cyclomatic complexity 31 (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":"src/framework/components/script/component.js"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79f567eb418a423626655a600223679ceafe252478932c9e37df2f240f983b2"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimationComponent.onAssetChanged (cyclomatic 31): AnimationComponent.onAssetChanged has cyclomatic complexity 31 (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":"src/framework/components/animation/component.js"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0ed742f6bf17ae303135b11c6bbc922cb9beac79977163de7b1274cbb6c9631"}},{"ruleId":"D1","level":"warning","message":{"text":"renderForwardInternal (cyclomatic 31): renderForwardInternal has cyclomatic complexity 31 (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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"03947a1bf775f01e5bccec27a25d5c0d8685fab72f09ec487b4b3c6d874369cb"}},{"ruleId":"D1","level":"warning","message":{"text":"init (cyclomatic 31): init has cyclomatic complexity 31 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 2 belong to 4 function items inside it that branch. 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":"src/platform/graphics/webgl/webgl-render-target.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"c34c932745741a5fdcbf672b1a046ca44ae14fb8d5dd329d728f5e2a6091b100"}},{"ruleId":"D1","level":"warning","message":{"text":"XrManipulation.update (cyclomatic 30): XrManipulation.update has cyclomatic complexity 30 (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":"scripts/esm/xr/xr-manipulation.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e5753e7b39738c0afdc73e8771c536922f7c93a0ff3c3acd4cef070daefedfa"}},{"ruleId":"D1","level":"warning","message":{"text":"BatchManager.prepare (cyclomatic 30): BatchManager.prepare has cyclomatic complexity 30 (threshold 15). Of this number, 29 points are the body\u0027s own statements and 1 belongs 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec6ea5f2319bc1abcd10b35d989090d18edf8bef537a64872df6f8633b88c171"}},{"ruleId":"D1","level":"warning","message":{"text":"render-physics.RenderPhysics.postUpdate (cyclomatic 29): render-physics.RenderPhysics.postUpdate has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 2 of the 29 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 81, 205). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/physics/render-physics.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e5275d6d33cd058ccb325ca6525ca4ace126bfcccb3cbf9168ce61c5d5f6f40"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticleEmitter.rebuild (cyclomatic 29): ParticleEmitter.rebuild has cyclomatic complexity 29 (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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"5869fd60f33c0e3bb20449a254b5f6a8f3a04c7af91b3e84ded5ad5ab8eee2f2"}},{"ruleId":"D1","level":"warning","message":{"text":"DdsParser.open (cyclomatic 29): DdsParser.open 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":"src/framework/parsers/texture/dds.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"95cbcce9d3ab755e891729225ca8c46e6c40e56f41011f7a51cc3aa07f5ef43b"}},{"ruleId":"D1","level":"warning","message":{"text":"AssetRegistry.load (cyclomatic 29): AssetRegistry.load has cyclomatic complexity 29 (threshold 15). Most of this is not in the body itself: 14 of the 29 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 482, 519, 472). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/asset/asset-registry.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea8b8c9808d158a2717eb292169a881d1ea68b74388c1c770b579c1675699b5"}},{"ruleId":"D1","level":"warning","message":{"text":"WebgpuTexture.uploadData (cyclomatic 29): WebgpuTexture.uploadData 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":"src/platform/graphics/webgpu/webgpu-texture.js"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"1181054662461d09741f2b1e8b09c01eb7be264a7115d272e68b85e19ddbde79"}},{"ruleId":"D1","level":"warning","message":{"text":"renderForwardLayer (cyclomatic 29): renderForwardLayer has cyclomatic complexity 29 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 7 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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e8c3ef5b2ccd93feccc4ed4184bea2e0c4ef7bc3a6741ffb0ea368866645bc7"}},{"ruleId":"D1","level":"warning","message":{"text":"reprojectTexture (cyclomatic 29): reprojectTexture 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":"src/scene/graphics/reproject-texture.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"76d1f57c44a74b19984e60ec5e6e98f335519b86bc2144c33a467626398739d9"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatWorld.update (cyclomatic 28): GSplatWorld.update has cyclomatic complexity 28 (threshold 15). Of this number, 24 points are the body\u0027s own statements and 4 belong to 2 function literals inside it that branch. 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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"c79b61faf324e2296c1d0c0f05022e6d6db094fa75c64318fc03aa1ceb75e56a"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatWorld._updateWorldState (cyclomatic 28): GSplatWorld._updateWorldState has cyclomatic complexity 28 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 5 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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c9e09565817883c5f0b8e4ba352fc02b67cfc8d6c19d6a9713a83977a94823"}},{"ruleId":"D1","level":"warning","message":{"text":"setupForRenderPass (cyclomatic 28): setupForRenderPass has cyclomatic complexity 28 (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":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3631c17427b8fbea9b8e542bc6252745638a779ae2a12f976fe3c31239ab886"}},{"ruleId":"D1","level":"warning","message":{"text":"glb-parser.createImages (cyclomatic 27): glb-parser.createImages has cyclomatic complexity 27 (threshold 15). Most of this is not in the body itself: 3 of the 27 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 1381, 1418, 1478, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1358}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b209712839f45b412c9f63f43ab443c9a6811012dedeea58d68f5de87b091c4"}},{"ruleId":"D1","level":"warning","message":{"text":"TextureAtlasHandler.patch (cyclomatic 27): TextureAtlasHandler.patch 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":"src/framework/handlers/texture-atlas.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"af3b2d38e27f572f989912281d3cd006166184daa870a4fa99059e4be4ad02da"}},{"ruleId":"D1","level":"warning","message":{"text":"draw (cyclomatic 27): draw 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":1339}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef4037c478a776e9c09d4e039b67ccae2c90d43cd1408d0d2d3c3cc4e86a4b7"}},{"ruleId":"D1","level":"warning","message":{"text":"Http.request (cyclomatic 26): Http.request has cyclomatic complexity 26 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 3 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":"src/platform/net/http.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0be57b505b951b3e4d9c0b74641b4297d988582bd0b5b91fa2ea2fca62279a"}},{"ruleId":"D1","level":"warning","message":{"text":"ResourceLoader.load (cyclomatic 26): ResourceLoader.load has cyclomatic complexity 26 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 10 belong to 2 function literals inside it that branch. 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":"src/framework/handlers/loader.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd1c5f46f681935312100312e51b35df3933bd2c5865b0d333e95e5a4ba60af"}},{"ruleId":"D1","level":"warning","message":{"text":"copyRenderTarget (cyclomatic 26): copyRenderTarget 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":2081}}}],"partialFingerprints":{"codehealthFindingId/v1":"d686160092ae1a0fef5aa67d03341b43cf8b2ac0f3e2687684c0cb48b7c97776"}},{"ruleId":"D1","level":"warning","message":{"text":"_setupLight (cyclomatic 26): _setupLight 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":"src/extras/render-passes/frame-pass-volumetric-fog.js"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"beb932002e569689b44607a17c5614a736d251417fb9b948b12c9f76e639a5bb"}},{"ruleId":"D1","level":"warning","message":{"text":"Water._frameUpdate (cyclomatic 25): Water._frameUpdate has cyclomatic complexity 25 (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":"scripts/esm/water.mjs"},"region":{"startLine":1607}}}],"partialFingerprints":{"codehealthFindingId/v1":"5940fc5dbc60ffec292abb7d724395cb27d027a64bb2c3646fc5fec0ca72c679"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatDirector.update (cyclomatic 25): GSplatDirector.update has cyclomatic complexity 25 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. 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":"src/scene/gsplat-unified/gsplat-director.js"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bef7f187bbcc6820bd6456a2a6ca5fcb21134ea6701237e227f868bac823347"}},{"ruleId":"D1","level":"warning","message":{"text":"StandardMaterialOptionsBuilder._updateMaterialOptions (cyclomatic 25): StandardMaterialOptionsBuilder._updateMaterialOptions has cyclomatic complexity 25 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"79986177313f52c607c87020fa547d3152f1fbe280844299ecc2a19d358d2883"}},{"ruleId":"D1","level":"warning","message":{"text":"ObjModelParser.parse (cyclomatic 24): ObjModelParser.parse has cyclomatic complexity 24 (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":"scripts/esm/parsers/obj-model.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"492d4d48cc33d05eaab2f31896e439252ccdd9bc07829b08bb969aeecd82d40a"}},{"ruleId":"D1","level":"warning","message":{"text":"Preprocessor.processParentheses (cyclomatic 24): Preprocessor.processParentheses has cyclomatic complexity 24 (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":"src/core/preprocessor.js"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"6820861efa03eb25210d8a24e48b37deaf9b708002806a5c1361f0fadf5d5679"}},{"ruleId":"D1","level":"warning","message":{"text":"LayerComposition._update (cyclomatic 24): LayerComposition._update has cyclomatic complexity 24 (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":"src/scene/composition/layer-composition.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab969e6f81cb70ecf2e85f3c5a55d1c78974a2c72d3cc451ca8e70d3375070d"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatOctreeInstance.applyLodChanges (cyclomatic 24): GSplatOctreeInstance.applyLodChanges has cyclomatic complexity 24 (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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24b6ae4b233d3c49dc78da6d08b3e0ed05e5b3045a33f37eb5ccf77d2910564"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementComponentSystem.getImageElementMaterial (cyclomatic 24): ElementComponentSystem.getImageElementMaterial has cyclomatic complexity 24 (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":"src/framework/components/element/system.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a299fb283e7a31ce85b0ed0395ec702cf9fd19761e89bd2b976417fead3f896"}},{"ruleId":"D1","level":"warning","message":{"text":"WebglGraphicsDevice.copyRenderTarget (cyclomatic 24): WebglGraphicsDevice.copyRenderTarget has cyclomatic complexity 24 (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"f928e44de7ac6a807afeccd96ccae4ca2349726f388581046eccb59bc6a2ccc7"}},{"ruleId":"D1","level":"warning","message":{"text":"glb-parser.createMaterial (cyclomatic 24): glb-parser.createMaterial has cyclomatic complexity 24 (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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea54bad4e5f5e43ebfdfcbd56a3b7837bc6ef7c6a81714043b06e11feaab3c42"}},{"ruleId":"D1","level":"warning","message":{"text":"initFromGpuDevice (cyclomatic 24): initFromGpuDevice has cyclomatic complexity 24 (threshold 15). Of this number, 22 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"d032ca96f3222ac3fcfd3ac61446f8e41937607fd899a88e7940343f4262e5a8"}},{"ruleId":"D1","level":"warning","message":{"text":"XrMenu._updateRayInteraction (cyclomatic 23): XrMenu._updateRayInteraction has cyclomatic complexity 23 (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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cb1ad9a7909e954605042cc1db692dc5802f6405e019bf7ad071a10c7b20c28"}},{"ruleId":"D1","level":"warning","message":{"text":"WebglGraphicsDevice.endRenderPass (cyclomatic 23): WebglGraphicsDevice.endRenderPass has cyclomatic complexity 23 (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1603}}}],"partialFingerprints":{"codehealthFindingId/v1":"b79f19d6dbce36c9f94cd32acdd21b465cd955cfa102eaf12c92a5f9bd4fce6a"}},{"ruleId":"D1","level":"warning","message":{"text":"GlbContainerResource.instantiateRenderEntity (cyclomatic 23): GlbContainerResource.instantiateRenderEntity has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 2 of the 23 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 141, 101). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-container-resource.js"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"6212974cc5adc4886b3c4c5bc4a7f3dcdbecccfbefb4e82a96000ccee2f63dcb"}},{"ruleId":"D1","level":"warning","message":{"text":"texture._completePartialMipmapChain (cyclomatic 23): texture._completePartialMipmapChain has cyclomatic complexity 23 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 10 belong to 2 function literals inside it that branch. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/texture.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"da7cc2b6e88c4a94c3878034f7f954e6d837b5e87190222015ae1513b886b148"}},{"ruleId":"D1","level":"warning","message":{"text":"StandardMaterialOptionsBuilder._updateEnvOptions (cyclomatic 23): StandardMaterialOptionsBuilder._updateEnvOptions has cyclomatic complexity 23 (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":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"c31e8d57fa8796815b4650f5c5c89640f9a50ca65c82640f8fbcc7e93cc8fd92"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor (cyclomatic 23): constructor has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 9 of the 23 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 221, 201, 207, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab2ff2ac4ef5927666eddebc0ce013723d723519b878d6ca6cd412a766147c75"}},{"ruleId":"D1","level":"warning","message":{"text":"tween.Tween.start (cyclomatic 22): tween.Tween.start has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 10 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 243, 276, 281, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/animation/tween.js"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d721c91d1984655c636035c2d08622e3576ce35ab5fc0920c63571c3638f64a"}},{"ruleId":"D1","level":"warning","message":{"text":"system.recreateShapes (cyclomatic 22): system.recreateShapes has cyclomatic complexity 22 (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":"src/framework/components/collision/system.js"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe6da89dfb4e7984c52235bce61f13598472350277f48c4ba4b03d32c69e3cfb"}},{"ruleId":"D1","level":"warning","message":{"text":"khr-gaussian-splatting.createGSplatData (cyclomatic 22): khr-gaussian-splatting.createGSplatData has cyclomatic complexity 22 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. 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":"src/framework/parsers/glb/extensions/khr-gaussian-splatting.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f64e0bb2cf1102e4c45072492b45a6d5ff44f6557c9670a93418ecde6546c03"}},{"ruleId":"D1","level":"warning","message":{"text":"XrHand.update (cyclomatic 22): XrHand.update has cyclomatic complexity 22 (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":"src/framework/xr/xr-hand.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"188c864742e34259c845661bf348adb07b9406913e449a6ab60f1c48733bbb1b"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimController.updateStateFromTransition (cyclomatic 22): AnimController.updateStateFromTransition has cyclomatic complexity 22 (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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"1817ca195d8c3dbbc946320f73799446a8e619dd6330c59de9787ee8e0bfc98f"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultAnimBinder.constructor (cyclomatic 22): DefaultAnimBinder.constructor has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 4 of the 22 points are its own statements and the rest belongs to 6 function literals inside it that branch (lines 34, 81, 118, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/anim/binder/default-anim-binder.js"},"region":{"startLine":12}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d86c1030174be456f0e0e75df452c2e459323817a63ebc349d4e4b914dc9ec"}},{"ruleId":"D1","level":"warning","message":{"text":"Skeleton.addTime (cyclomatic 22): Skeleton.addTime has cyclomatic complexity 22 (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":"src/scene/animation/skeleton.js"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fa2619a2c0572f99dbdd4be54c87ef09a4ddd388440fb0cb1221321506896bf"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimationComponent.update (cyclomatic 22): AnimationComponent.update has cyclomatic complexity 22 (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":"src/framework/components/animation/component.js"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"6855f094fdf8cdd8b84f80ed7a4fbd9902a87a365261265bb6cf6f3f893f0e6c"}},{"ruleId":"D1","level":"warning","message":{"text":"webgpu-shader-processor-wgsl.getTextureDeclarationType (cyclomatic 22): webgpu-shader-processor-wgsl.getTextureDeclarationType has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-shader-processor-wgsl.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c255d3e5c396c87e8523b3c4d7d899271fec4778ffd25bf356b50d5da07ff3"}},{"ruleId":"D1","level":"warning","message":{"text":"resolveDuplicatedEntityReferenceProperties (cyclomatic 22): resolveDuplicatedEntityReferenceProperties has cyclomatic complexity 22 (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":"src/framework/components/script/component.js"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"defbde3fd5733a3922ed42c939617acfdbc593c011f8b53000c2062ef76c31bf"}},{"ruleId":"D1","level":"warning","message":{"text":"_createProjectorCompute (cyclomatic 22): _createProjectorCompute has cyclomatic complexity 22 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 2 belong to 12 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9ac53f9067fec567f28cbd6900b496fa31fe019621b98bf13d9bb400a7346a2"}},{"ruleId":"D1","level":"warning","message":{"text":"createDefinition (cyclomatic 22): createDefinition has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 10 of the 22 points are its own statements and the rest belongs to 3 function items inside it that branch (getDefines, getDefinesWgsl, normalizedOutputTypes). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-definition-utils.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e94a3c4ecc45a87d0030e3e960549c06b2ac2ba9c26108ad6e02909d4d59a7"}},{"ruleId":"D1","level":"warning","message":{"text":"TagsCache.find (cyclomatic 21): TagsCache.find 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":"src/core/tags-cache.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c8107306c0f8ca19eef8851acc797994acc1e8831c3dd4ab690f067d25b509"}},{"ruleId":"D1","level":"warning","message":{"text":"FrameGraph._compilePasses (cyclomatic 21): FrameGraph._compilePasses 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":"src/scene/frame-graph.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1871360e5cf490711ff93fd70929dcc32222fc0a2992e6b14667b65854e671d5"}},{"ruleId":"D1","level":"warning","message":{"text":"ShadowRendererDirectional.cull (cyclomatic 21): ShadowRendererDirectional.cull 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":"src/scene/renderer/shadow-renderer-directional.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8f18d8a29792ebcd69151a9a14367c36056218bd75f49fc70b00f3b28ebb83a"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementInput._onElementSelectEvent (cyclomatic 21): ElementInput._onElementSelectEvent 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":"src/framework/input/element-input.js"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"990f8a97ad21e1f6a693d23def89587f9d8bd727a00e3c2452bf21f3e67c3a79"}},{"ruleId":"D1","level":"warning","message":{"text":"SpriteComponentSystem.initializeComponentData (cyclomatic 21): SpriteComponentSystem.initializeComponentData 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":"src/framework/components/sprite/system.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"0733225c28a339e5e0b88690c2476c111248c94c9c42d49ab8634cbca0b43f2b"}},{"ruleId":"D1","level":"warning","message":{"text":"ScriptRegistry.add (cyclomatic 21): ScriptRegistry.add has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 4 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 159, 134). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/script/script-registry.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"615ba2f517149c03f56aa79bbf0172e97ef3782f5118f38f89479999b09d3d38"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimController.update (cyclomatic 21): AnimController.update 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab2e162a9014cb766d8012574b05b71a019bdebc4291d99418fea833a4fa37f"}},{"ruleId":"D1","level":"warning","message":{"text":"applySettings (cyclomatic 21): applySettings has cyclomatic complexity 21 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-params.js"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c8ed931141f0b7aa6cdcc58548e33c1ac1a76504efa6d2fc06993957e27236b"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphicsDevice.initCapsDefines (cyclomatic 20): GraphicsDevice.initCapsDefines has cyclomatic complexity 20 (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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b54b4159df1be1f4b71d81c63e62e720ff53b890e06bfab20eb93d8e663edb2"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatShadowRenderer._cullEntry (cyclomatic 20): GSplatShadowRenderer._cullEntry has cyclomatic complexity 20 (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":"src/scene/gsplat-unified/gsplat-shadow-renderer.js"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"82baaacfc0d4fe82aed97e226927c97c238fecd0cfeb3c77e8693a14fb3451fa"}},{"ruleId":"D1","level":"warning","message":{"text":"khr-draco-mesh-compression.createDracoMesh (cyclomatic 20): khr-draco-mesh-compression.createDracoMesh has cyclomatic complexity 20 (threshold 15). Most of this is not in the body itself: 3 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 23, 75, 20). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-draco-mesh-compression.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fab91ff268dfbb118cbb764f86b97bd1cfa1ae150503a54150b18e5d45d61a8"}},{"ruleId":"D1","level":"warning","message":{"text":"basis.basisInitialize (cyclomatic 20): basis.basisInitialize has cyclomatic complexity 20 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. 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":"src/framework/handlers/basis.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aa13515fb39367cef024c8be04215956273d49baf9531b6aad604cc260753f6"}},{"ruleId":"D1","level":"warning","message":{"text":"MaterialHandler._bindAndAssignAssets (cyclomatic 20): MaterialHandler._bindAndAssignAssets has cyclomatic complexity 20 (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":"src/framework/handlers/material.js"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc54b36f34212d46cd17d870e554972b45ddadc7719dc6b61c6fbb8fd0f6530f"}},{"ruleId":"D1","level":"warning","message":{"text":"AppBase._parseApplicationProperties (cyclomatic 20): AppBase._parseApplicationProperties has cyclomatic complexity 20 (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":"src/framework/app-base.js"},"region":{"startLine":858}}}],"partialFingerprints":{"codehealthFindingId/v1":"067baf422278ccb6582d0922df3cb4b68f5322bb359381f6dc73e3c51d1f2238"}},{"ruleId":"D1","level":"warning","message":{"text":"init (cyclomatic 20): init has cyclomatic complexity 20 (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":"src/framework/app-base.js"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c597747a021347355a4880a9eb2b77223e69a0b8afb9ea29cc1702bd5170507"}},{"ruleId":"D1","level":"warning","message":{"text":"shadowType (cyclomatic 20): shadowType has cyclomatic complexity 20 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/light.js"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd64b1474be4e4f86ae1c400717fab75f87d56a9395e633175798483d207e6e"}},{"ruleId":"D1","level":"warning","message":{"text":"BasisWorker::transcodeBasis (cyclomatic 20): BasisWorker::transcodeBasis has cyclomatic complexity 20 (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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"075b02afba1cfa547c9d5bbd5a61ef7ebf757eb9008fab7e7b7e8a1360845a37"}},{"ruleId":"D1","level":"warning","message":{"text":"EventHandler.off (cyclomatic 19): EventHandler.off has cyclomatic complexity 19 (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":"src/core/event-handler.js"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e33d27070e1756641fd00b20047d51d551fc2392bb8a90b009e41a260f4e8a"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatProjector.dispatch (cyclomatic 19): GSplatProjector.dispatch has cyclomatic complexity 19 (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":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4bf75301a4b3b52f52d37ef340a773324dcbd092967846ed93dc99b6e3262a3"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticleSystemComponentSystem.initializeComponentData (cyclomatic 19): ParticleSystemComponentSystem.initializeComponentData has cyclomatic complexity 19 (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":"src/framework/components/particle-system/system.js"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d320a69234bcc24f8f1194807082dd6a501629e2159735f645414121849b282"}},{"ruleId":"D1","level":"warning","message":{"text":"Lightmapper.collectModels (cyclomatic 19): Lightmapper.collectModels has cyclomatic complexity 19 (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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f09d52023f33c479c0b8c69a5fc9bce7e348023ad5f6c3513a2d90dbecbd42b"}},{"ruleId":"D1","level":"warning","message":{"text":"CubemapHandler.loadAssets (cyclomatic 19): CubemapHandler.loadAssets has cyclomatic complexity 19 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 7 belong to 3 function literals inside it that branch. 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":"src/framework/handlers/cubemap.js"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e313d3baf14540c45179079564986962022172b71fbcb70934a8546893ae02"}},{"ruleId":"D1","level":"warning","message":{"text":"JsonStandardMaterialParser.initialize (cyclomatic 19): JsonStandardMaterialParser.initialize has cyclomatic complexity 19 (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":"src/framework/parsers/material/json-standard-material.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"87c057bf93f8c46b5ee963070be1b36b5b12cb812c981e27ce0b62ba75a247c9"}},{"ruleId":"D1","level":"warning","message":{"text":"HdrParser._readPixels (cyclomatic 19): HdrParser._readPixels has cyclomatic complexity 19 (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":"src/framework/parsers/texture/hdr.js"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3afec716745d20a72d576e7fdab7db102eb12f33942aef7896cc872d5960594"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimController._findTransition (cyclomatic 19): AnimController._findTransition has cyclomatic complexity 19 (threshold 15). Of this number, 13 points are the body\u0027s own statements and 6 belong to one function literal inside it that branches. 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a46ecc7331199c3d0ee26c4fe3b0ee5dd8f16238f8de2738e0eeb01bc97b58"}},{"ruleId":"D1","level":"warning","message":{"text":"startRenderPass (cyclomatic 19): startRenderPass has cyclomatic complexity 19 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1490}}}],"partialFingerprints":{"codehealthFindingId/v1":"8acda55f7cae3134573244f0a64360ec37d7f0efc9a75cbe9792f9ed43058370"}},{"ruleId":"D1","level":"warning","message":{"text":"frameStart (cyclomatic 19): frameStart has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 1 of the 19 points is its own statement and the rest belongs to 7 function items inside it that branch ((anonymous)::(anonymous), (anonymous)::(anonymous), (anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/graphics-device.js"},"region":{"startLine":1780}}}],"partialFingerprints":{"codehealthFindingId/v1":"633a35469c532656973eafb3d09c75f24f4e148b7324687575a9f356e2a4eb23"}},{"ruleId":"D1","level":"warning","message":{"text":"setCameraUniforms (cyclomatic 19): setCameraUniforms has cyclomatic complexity 19 (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":"src/scene/renderer/renderer.js"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49200d923f33261f72caaec2e9f32f6f51291df6b517290d82c64b8b8309fbe"}},{"ruleId":"D1","level":"warning","message":{"text":"attachTexture (cyclomatic 19): attachTexture has cyclomatic complexity 19 (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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"78db92eeee48769b6d8f6ce9637171f60954c76ff4e9769876999d5a7234d603"}},{"ruleId":"D1","level":"warning","message":{"text":"get (cyclomatic 19): get has cyclomatic complexity 19 (threshold 15). Of this number, 18 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"src/platform/graphics/webgpu/webgpu-render-pipeline.js"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"73484a8b25f698eb6dbd03f79669cb2fa0b9b831c7df421543027d872fb69eb4"}},{"ruleId":"D1","level":"warning","message":{"text":"BasisWorker::transcodeKTX2 (cyclomatic 19): BasisWorker::transcodeKTX2 has cyclomatic complexity 19 (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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef01367f95691569eff5157f023d6f8e3eb36a42e8fa948a0421cf17ff2bffd6"}},{"ruleId":"D1","level":"warning","message":{"text":"load (cyclomatic 19): load has cyclomatic complexity 19 (threshold 15). Of this number, 16 points are the body\u0027s own statements and 3 belong to 12 function literals inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ff24b853fdb1064311eef24d93973e72d322aa19fc36fce928c135edae003f5"}},{"ruleId":"D1","level":"warning","message":{"text":"build.main (cyclomatic 18): build.main 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":"build.mjs"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"772cda4efc716e01d6f878d13fc6579130a5a8d18357027dabfea2aa89a8422c"}},{"ruleId":"D1","level":"warning","message":{"text":"XrMenu._checkFingerTouch (cyclomatic 18): XrMenu._checkFingerTouch has cyclomatic complexity 18 (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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1333}}}],"partialFingerprints":{"codehealthFindingId/v1":"704e070d829cbf604e57c8205b48b3e4235b6406fc693bfc41f7760919c16888"}},{"ruleId":"D1","level":"warning","message":{"text":"EventHandler.fire (cyclomatic 18): EventHandler.fire has cyclomatic complexity 18 (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":"src/core/event-handler.js"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d0fa2be1eeea2bc83135bd5be6fab30bd1aee72da5ace9a28143dac0e1140a0"}},{"ruleId":"D1","level":"warning","message":{"text":"GraphicsDevice.getRenderableHdrFormat (cyclomatic 18): GraphicsDevice.getRenderableHdrFormat has cyclomatic complexity 18 (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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":1905}}}],"partialFingerprints":{"codehealthFindingId/v1":"8628b9c0272105c7374f3bb76bf8a6df1ebbee8331acb47fbbe68b1986a8a0cb"}},{"ruleId":"D1","level":"warning","message":{"text":"StandardMaterialMapTransforms.update (cyclomatic 18): StandardMaterialMapTransforms.update has cyclomatic complexity 18 (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":"src/scene/materials/standard-material-map-transforms.js"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"d284870b9e6029c75d384f3eb190cbaa8107e3381191d947046ea24b01a2abfd"}},{"ruleId":"D1","level":"warning","message":{"text":"Mesh.update (cyclomatic 18): Mesh.update has cyclomatic complexity 18 (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":"src/scene/mesh.js"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c255fc98cdbb9a546b0d52773c771e2dec3255307c6d0a5839e80f559c3324b"}},{"ruleId":"D1","level":"warning","message":{"text":"ply.readPly (cyclomatic 18): ply.readPly has cyclomatic complexity 18 (threshold 15). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 459, 483, 544, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/ply.js"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"df205a976550403638bf614775bd448ec46492620ba1d1864b3b7a651b24c8cd"}},{"ruleId":"D1","level":"warning","message":{"text":"MeshInstance.getMaterialBindGroup (cyclomatic 18): MeshInstance.getMaterialBindGroup has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/mesh-instance.js"},"region":{"startLine":1749}}}],"partialFingerprints":{"codehealthFindingId/v1":"922a6851e03e70e0ae46b14136db2f7216f668c1d963e25ffa30c0ed66c22ab3"}},{"ruleId":"D1","level":"warning","message":{"text":"Culler.updateLightVisibility (cyclomatic 18): Culler.updateLightVisibility has cyclomatic complexity 18 (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":"src/scene/renderer/culler.js"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"500004e95121e194515237d583f7a7bed301caab9549bc1144d5801461798ec2"}},{"ruleId":"D1","level":"warning","message":{"text":"ImageElement._updateMesh (cyclomatic 18): ImageElement._updateMesh has cyclomatic complexity 18 (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":"src/framework/components/element/image-element.js"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"546a0dbba50c4d40173490ae8869387ff79790beba4dd9935bbba84d2967c3c3"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelComponentSystem.cloneComponent (cyclomatic 18): ModelComponentSystem.cloneComponent has cyclomatic complexity 18 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/model/system.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"6789a1c94d9e7f81cb8b8b1a973c646e79255ed52d436267416f7f3024024360"}},{"ruleId":"D1","level":"warning","message":{"text":"WebglGraphicsDevice.setTextureParameters (cyclomatic 18): WebglGraphicsDevice.setTextureParameters has cyclomatic complexity 18 (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1865}}}],"partialFingerprints":{"codehealthFindingId/v1":"7210678f96bea35f0110cdc38c273dfa7b034545920cd9149cb41f9cf020518f"}},{"ruleId":"D1","level":"warning","message":{"text":"MouseEvent.constructor (cyclomatic 18): MouseEvent.constructor 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":"src/platform/input/mouse-event.js"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"41b0332d7d5f3eb8cca0a9281d68a30c17cb98d0f253e588ea3e5ae2a3008261"}},{"ruleId":"D1","level":"warning","message":{"text":"evaluateNodeDistances (cyclomatic 18): evaluateNodeDistances has cyclomatic complexity 18 (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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"ceaad6e597b8e5dae25fbbe5eb5389e9fa0d4ef8fbdada6e30e4c14b06f22964"}},{"ruleId":"D1","level":"warning","message":{"text":"_draw (cyclomatic 18): _draw 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":"src/extras/renderers/texture-renderer.js"},"region":{"startLine":283}}}],"partialFingerprints":{"codehealthFindingId/v1":"290cbbb813d5464e83722ed0f5017c024a09c2151f0cf7a03611b38ede181d96"}},{"ruleId":"D1","level":"warning","message":{"text":"instantiateRenderEntity::cloneHierarchy (cyclomatic 18): instantiateRenderEntity::cloneHierarchy has cyclomatic complexity 18 (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":"src/framework/parsers/glb-container-resource.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"de51c8d7b5010f5f12646fefbfc2d44a1449c633b4abf575d600fef07cb23949"}},{"ruleId":"D1","level":"warning","message":{"text":"update (cyclomatic 18): update has cyclomatic complexity 18 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 3 belong to 4 function literals inside it that branch. To reduce it, 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":"src/framework/xr/xr-anchors.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"f108632e0dcdb67994820242c98b304458a4057457836049e36194a0d2362115"}},{"ruleId":"D1","level":"warning","message":{"text":"AnnotationManager.initialize (cyclomatic 17): AnnotationManager.initialize has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 5 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 918, 889, 825, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/annotations.mjs"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"e64a0d66aef7f4e6ea24ed47e283a39cb3dfa4c218900e503054dbcf77070867"}},{"ruleId":"D1","level":"warning","message":{"text":"XrMenu.update (cyclomatic 17): XrMenu.update 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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2817a5e493505875a50707d48ee611acd03e5faabbd5de696b0fb6b8a8e140c"}},{"ruleId":"D1","level":"warning","message":{"text":"WorldClustersDebug.render (cyclomatic 17): WorldClustersDebug.render has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/lighting/world-clusters-debug.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"46e8547bffb6f1b81869ba53d044a74a3eda315e64f497b1ee1b1b262f0e09b8"}},{"ruleId":"D1","level":"warning","message":{"text":"LightsBuffer.addLightData (cyclomatic 17): LightsBuffer.addLightData 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":"src/scene/lighting/lights-buffer.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fab540dd87cfccd1c4f579dbd5977d6a0303fbadc0c519af3e8ac04ddf61b33"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatBudgetBalancer._accumulate (cyclomatic 17): GSplatBudgetBalancer._accumulate 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":"src/scene/gsplat-unified/gsplat-budget-balancer.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3230eb4361c6bfe9ac69bd61bfb2ee66e30df7bbf5314b6e3de40013c7ce0a5"}},{"ruleId":"D1","level":"warning","message":{"text":"CollisionComponent.onEnable (cyclomatic 17): CollisionComponent.onEnable 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":"src/framework/components/collision/component.js"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"edaa28d9b5564f09c90857998b310f0f43b2490ce211cb65b151f75deb39f599"}},{"ruleId":"D1","level":"warning","message":{"text":"TextElement.font (cyclomatic 17): TextElement.font 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":"src/framework/components/element/text-element.js"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7989561088ffcaed154bd0b17521aa71f0da6a8a1a1749f7ea160c6cfb6dcbc"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementComponent._sync (cyclomatic 17): ElementComponent._sync 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":"src/framework/components/element/component.js"},"region":{"startLine":2218}}}],"partialFingerprints":{"codehealthFindingId/v1":"d183f1c3a2746a6abffc3736bc0a14bd57eef5ee495f8900786ffc8d198e7964"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelComponent.onEnable (cyclomatic 17): ModelComponent.onEnable 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":"src/framework/components/model/component.js"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"538eb16f69d92d97506e2d2932d5c119d1e7a55f2ded4a74842f848f6a3b524a"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementInput._onElementMouseEvent (cyclomatic 17): ElementInput._onElementMouseEvent 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":"src/framework/input/element-input.js"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ca6bb902da5c8c3d6a19e27d96c10a15edd986558e771c5c093e9f46970f75e"}},{"ruleId":"D1","level":"warning","message":{"text":"SpriteComponent._showFrame (cyclomatic 17): SpriteComponent._showFrame 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":"src/framework/components/sprite/component.js"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"be16befbeda42a42a0b27772aaa7fb20d41db19f255f454f9be7cbc8442ced7e"}},{"ruleId":"D1","level":"warning","message":{"text":"glb-parser.createMesh (cyclomatic 17): glb-parser.createMesh has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 422, 488). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa82f36e81bfbd5b4c47bd32d1f7d4424d31a828533e09d49c7fc7f71ffbdc5a"}},{"ruleId":"D1","level":"warning","message":{"text":"AnimComponentBinder._createAnimTargetForProperty (cyclomatic 17): AnimComponentBinder._createAnimTargetForProperty 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":"src/framework/components/anim/component-binder.js"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e59ba7a15b1caad211449559038403680ca770840eddfb6fe95e3ea2b8c471e"}},{"ruleId":"D1","level":"warning","message":{"text":"ShadowRenderer.submitCasters (cyclomatic 17): ShadowRenderer.submitCasters has cyclomatic complexity 17 (threshold 15). Of this number, 14 points are the body\u0027s own statements and 3 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":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"84bef45a27223fa56774d3cd9c9509d3ddd67ca9c30ab31fae23995aad7c083f"}},{"ruleId":"D1","level":"warning","message":{"text":"ResourceLine.equals (cyclomatic 17): ResourceLine.equals 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":"src/platform/graphics/webgpu/webgpu-shader-processor-wgsl.js"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"51a83ac781d8c4beec0c13139033d9e309a7165619544a52225488861c383766"}},{"ruleId":"D1","level":"warning","message":{"text":"typedoc-plugin.load (cyclomatic 17): typedoc-plugin.load has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 7 function literals inside it that branch (lines 161, 109, 97, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/typedoc/typedoc-plugin.mjs"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab2c82a406ccaf9e5c38e5325453c808ed14c858f288a7eeebca579e8a881495"}},{"ruleId":"D1","level":"warning","message":{"text":"update (cyclomatic 17): update 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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebbf0ff0004162e7d15298205006404ca80aa74250cd1e4321cb4a770ca6b645"}},{"ruleId":"D1","level":"warning","message":{"text":"sanitizeOptions (cyclomatic 17): sanitizeOptions has cyclomatic complexity 17 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators. This is NOT this file\u0027s highest cyclomatic complexity: needsReset (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 method is counted neither in this dimension\u0027s figures nor in its score."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/frame-pass-camera-frame.js"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4f433048211f422a758dec2bba2e167d2c7134ecb947ecd0e953133266e1876"}},{"ruleId":"D1","level":"warning","message":{"text":"update (cyclomatic 17): update 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":"src/extras/render-passes/camera-frame.js"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ecddc05e6622f6b95d6ad9c2525a48a442ff1c22ebc74f64114d3fccf3894c"}},{"ruleId":"D1","level":"warning","message":{"text":"_updateTexOptions (cyclomatic 17): _updateTexOptions 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":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"330087baa889fbe364a9ca430d82da18fe03710f5aa0926407dbfb7bf1bde13a"}},{"ruleId":"D1","level":"warning","message":{"text":"renderLayerRenderStep (cyclomatic 17): renderLayerRenderStep has cyclomatic complexity 17 (threshold 15). Of this number, 15 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":"src/scene/renderer/render-pass-forward.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"e12085979b306ce29cf25bb7be71c3161c659ce7faea495d542085f3f4ed50b1"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor::read (cyclomatic 17): constructor::read has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sog-data.js"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae7000e955a509371b9503075076c9514cfb807d5ecd36997eec13ba886d695e"}},{"ruleId":"D1","level":"warning","message":{"text":"tween.Tween.initialize (cyclomatic 16): tween.Tween.initialize has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 149, 170, 160). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/animation/tween.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c27e8800bae430ddd287fae1f5a8abab66af66f79397f8b2914e943e5536537"}},{"ruleId":"D1","level":"warning","message":{"text":"gsplat-mesh.rasterizeTriangle (cyclomatic 16): gsplat-mesh.rasterizeTriangle 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":"scripts/esm/gsplat/gsplat-mesh.mjs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffdfd6cb35f299b1510154585ecde6189d3a38498fe2d0e1fb5e2f6734e9a65a"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatText._rebuildFromText (cyclomatic 16): GSplatText._rebuildFromText 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":"scripts/esm/gsplat/gsplat-text.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"8180ac88ecbf6ab0f6112acda4943abd7b96be819c86078c2cb2a5c40a629c2d"}},{"ruleId":"D1","level":"warning","message":{"text":"BlockAllocator._defragIncremental (cyclomatic 16): BlockAllocator._defragIncremental 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":"src/core/block-allocator.js"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c35b3d0be1d53bc231e23f5a5c3997e8abd1bd4ddf1f46bf5b3e0f1abdb4d35"}},{"ruleId":"D1","level":"warning","message":{"text":"uri.createURI (cyclomatic 16): uri.createURI 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":"src/core/uri.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"3eb12a0c88935a11254bd11eab6f46b63b3e62898afaebadcd6e5c4dfd76221f"}},{"ruleId":"D1","level":"warning","message":{"text":"ShaderGeneratorStandard._addMapDefines (cyclomatic 16): ShaderGeneratorStandard._addMapDefines has cyclomatic complexity 16 (threshold 15). Of this number, 12 points are the body\u0027s own statements and 4 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":"src/scene/shader-lib/programs/standard.js"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab1a2954d5732a976b355ac65d39cb83125b73e9627cc71044f0a59db1a6da49"}},{"ruleId":"D1","level":"warning","message":{"text":"MeshInstance.aabb (cyclomatic 16): MeshInstance.aabb 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":"src/scene/mesh-instance.js"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf3a672358eac343ac9b900b38a0fc0bc1dcda0bf21a7d79d55ed06f78ab522"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatWorldState.assignSplatOffsets (cyclomatic 16): GSplatWorldState.assignSplatOffsets 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":"src/scene/gsplat-unified/gsplat-world-state.js"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"188b5e5a32b22c0760f9e7c4b0e201cc6653169ca8063d4fbc0ec7367bafb2fa"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatWorld.applyWorkBufferUpdates (cyclomatic 16): GSplatWorld.applyWorkBufferUpdates has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 5 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 969). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"07fab885579baae2f4ea7133cf17079a87cd8f441e0b8635dfd9bedfe4d537b9"}},{"ruleId":"D1","level":"warning","message":{"text":"GSplatManager.update (cyclomatic 16): GSplatManager.update has cyclomatic complexity 16 (threshold 15). Of this number, 15 points are the body\u0027s own statements and 1 belongs 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":"src/scene/gsplat-unified/gsplat-manager.js"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff87b46825ffb414881592d18156d0b00d1bfb8bf5295a252d4419ca862e8c1b"}},{"ruleId":"D1","level":"warning","message":{"text":"system.convertValue (cyclomatic 16): system.convertValue 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":"src/framework/components/system.js"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bf3b78c574dceeb70dea533d80680833185804f379017c428a2eeba66eade5e"}},{"ruleId":"D1","level":"warning","message":{"text":"ModelComponent.mapping (cyclomatic 16): ModelComponent.mapping 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":"src/framework/components/model/component.js"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"d000a8c910ee2942f59558c53049bc681d04869d156c6509096d0ded4916360b"}},{"ruleId":"D1","level":"warning","message":{"text":"ShaderGeneratorParticle.createVertexDefines (cyclomatic 16): ShaderGeneratorParticle.createVertexDefines 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":"src/scene/shader-lib/programs/particle.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ee35116851ddaf3c0e5628903952f7701a5f2485025cdf5610b223d5ed829cb"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticleEmitter._allocate (cyclomatic 16): ParticleEmitter._allocate 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":887}}}],"partialFingerprints":{"codehealthFindingId/v1":"56f681ee4d3ed88191cd518f616288a6902c782f1bc1afcababba5f2e95113a5"}},{"ruleId":"D1","level":"warning","message":{"text":"ParticleEmitter.addTime (cyclomatic 16): ParticleEmitter.addTime 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":1027}}}],"partialFingerprints":{"codehealthFindingId/v1":"52672846a829d0945fc9afbf58ad64d1c94ca6aeac0fcfdf9dd99861e300b0d2"}},{"ruleId":"D1","level":"warning","message":{"text":"ShaderProcessorGLSL.processUniforms (cyclomatic 16): ShaderProcessorGLSL.processUniforms has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 336, 296, 306, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-processor-glsl.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"49f46d4175eb86b73e27ef74d745b8eec64b3e6efd00bdb5619d5ab05c8b2b1c"}},{"ruleId":"D1","level":"warning","message":{"text":"Asset.file (cyclomatic 16): Asset.file 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":"src/framework/asset/asset.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"7fa5bce2c34e057fbb8c1bcfeeee489a906b57afee44d97c32a447e2bbc9c1a7"}},{"ruleId":"D1","level":"warning","message":{"text":"GltfExporter.collectResources (cyclomatic 16): GltfExporter.collectResources has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 173, 223, 181). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"51d82bd9a19d12160b7487972c89f2e401c5466b8a277eaafd369edd9e9e9a84"}},{"ruleId":"D1","level":"warning","message":{"text":"WebgpuTexture.getSampler (cyclomatic 16): WebgpuTexture.getSampler 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":"src/platform/graphics/webgpu/webgpu-texture.js"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"972d2dbeaabe685c4bec83130a38b266d8b678d152b124014ef92d3327a35e68"}},{"ruleId":"D1","level":"warning","message":{"text":"clear (cyclomatic 16): clear 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2383}}}],"partialFingerprints":{"codehealthFindingId/v1":"21fc1802f793c62f200dedc26c2e472f95aeb282d59ca0be72b27236290fc7f8"}},{"ruleId":"D1","level":"warning","message":{"text":"createPrimitive (cyclomatic 16): createPrimitive has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 767, 778, 777, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"def0fb3dfd24b79eb12798e285853a399fbb2d5d53543ae6130ed7a20f24204b"}},{"ruleId":"D1","level":"warning","message":{"text":"watchUnbundled (cyclomatic 16): watchUnbundled has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to 14 function items inside it that branch (update, queue, rebuild::(anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/esbuild-build-target.mjs"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b9ec26b8c828cb7d042768696fdb1f0430e19246331c613e401aefef6b908ae"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor (cyclomatic 16): constructor has cyclomatic complexity 16 (threshold 15). Of this number, 8 points are the body\u0027s own statements and 8 belong to 6 function literals inside it that branch. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/transform-feedback.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c2c7de11522251737b89d9e653c4ba2693c3d02b294ef7ee230f01f97bb511"}},{"ruleId":"D1","level":"warning","message":{"text":"constructor (cyclomatic 16): constructor 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":"src/platform/graphics/vertex-format.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"789f8ebe22e0154547b34567a7da970d5320c81010abceb7f3c56e9f58728954"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateMeshes (cognitive 221): _updateMeshes has cognitive complexity 221 (threshold 15). Drivers by points: if/else 48 (140 pts), loops 12 (37 pts), boolean chains 23, ternaries 8 (21 pts) (nesting depth added 130). Of this number, 212 points are the body\u0027s own statements and 9 belong to one function item inside it that branches. 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":"src/framework/components/element/text-element.js"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b606dbf0166189c45b5fa56b3b2c5c15ac256f290b6421ebce9126a1ac8ab3f"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglTexture.upload (cognitive 197): WebglTexture.upload has cognitive complexity 197 (threshold 15). Drivers by points: if/else 54 (154 pts), loops 6 (22 pts), boolean chains 21 (nesting depth added 116). 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":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"a14cc2dba6de2529230eba05d3397268192c7465f1534d0c6f3f9a9920918dd7"}},{"ruleId":"D2","level":"warning","message":{"text":"draw (cognitive 159): draw has cognitive complexity 159 (threshold 15). Drivers by points: if/else 39 (125 pts), loops 5 (19 pts), ternaries 2 (9 pts), boolean chains 5, other 1 (nesting depth added 107). Of this number, 148 points are the body\u0027s own statements and 11 belong to 2 function literals inside it that branch. 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2148}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd36dc4b4c7331e89c506015c3cff241100c809e1c0a90a59a1fa8ddbceef9e9"}},{"ruleId":"D2","level":"warning","message":{"text":"gsplat-sort-worker.SortWorker (cognitive 145): gsplat-sort-worker.SortWorker has cognitive complexity 145 (threshold 15). Drivers by points: if/else 42 (103 pts), loops 14 (29 pts), ternaries 4 (7 pts), boolean chains 6 (nesting depth added 79). Most of this is not in the body itself: 2 of the 145 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 209, 44, 29). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sort-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d67521c6696ef5b3139da70aadbea968074e5000b688710f3f224cf2d44b03f"}},{"ruleId":"D2","level":"warning","message":{"text":"initializeComponentData (cognitive 128): initializeComponentData has cognitive complexity 128 (threshold 15). Drivers by points: if/else 71 (117 pts), boolean chains 10, ternaries 1 (nesting depth added 46). 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":"src/framework/components/element/system.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e65cfad7d3f383743221fdd07686ee92ad2ad40e34d8bdc4407b0e634627230"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateText (cognitive 123): _updateText has cognitive complexity 123 (threshold 15). Drivers by points: if/else 33 (80 pts), ternaries 8 (28 pts), boolean chains 12, loops 2 (3 pts) (nesting depth added 68). 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":"src/framework/components/element/text-element.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"893dc7c1a719857780b8e72c3d3c1513bfa63742ad1a78bdf77bbcc154e01661"}},{"ruleId":"D2","level":"warning","message":{"text":"Preprocessor._preprocess (cognitive 113): Preprocessor._preprocess has cognitive complexity 113 (threshold 15). Drivers by points: if/else 27 (83 pts), ternaries 5 (16 pts), loops 2 (8 pts), boolean chains 4, match/switch 1 (2 pts) (nesting depth added 74). 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":"src/core/preprocessor.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d15a70a974a891a073d73f0a708af81869ff893a842120f235011632e87e728"}},{"ruleId":"D2","level":"warning","message":{"text":"rawToValue (cognitive 106): rawToValue has cognitive complexity 106 (threshold 15). Drivers by points: if/else 29 (64 pts), loops 5 (17 pts), ternaries 4 (17 pts), boolean chains 7, match/switch 1 (nesting depth added 60). 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":"src/framework/script/script-attributes.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"f87abb78866962e16924864d6f7574ba70ab7cf214eaf936d9f3a4dbfa833f23"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 105): constructor has cognitive complexity 105 (threshold 15). Drivers by points: if/else 39 (53 pts), other 20, boolean chains 18, ternaries 10 (14 pts) (nesting depth added 18). Of this number, 80 points are the body\u0027s own statements and 25 belong to 6 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/render-target.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"78aeb4e56a2d46da7a6ff03f800f61d77352a7b5406308a8bcd61a7afe680aed"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 105): update has cognitive complexity 105 (threshold 15). Drivers by points: if/else 29 (70 pts), ternaries 8 (17 pts), loops 6 (12 pts), boolean chains 6 (nesting depth added 56). 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":"src/scene/particle-system/cpu-updater.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"46ed44b2284e7191565c4d454f62270ac39242d8fabec4ab9baf646d1195675a"}},{"ruleId":"D2","level":"warning","message":{"text":"Mesh._initBoneAabbs (cognitive 101): Mesh._initBoneAabbs has cognitive complexity 101 (threshold 15). Drivers by points: if/else 22 (86 pts), loops 6 (12 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 71). Of this number, 99 points are the body\u0027s own statements and 2 belong 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":"src/scene/mesh.js"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"91c7f82b825151e85ca16df24df44698ca902f96f38c4245a768eb475ef1e31f"}},{"ruleId":"D2","level":"warning","message":{"text":"Lightmapper.bakeInternal (cognitive 97): Lightmapper.bakeInternal has cognitive complexity 97 (threshold 15). Drivers by points: if/else 13 (50 pts), loops 11 (28 pts), ternaries 3 (15 pts), boolean chains 4 (nesting depth added 66). 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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae39730ac0c8c260337abb0e3c522579a53cb905bb5c0a3f8406a4a50d193ca3"}},{"ruleId":"D2","level":"warning","message":{"text":"create (cognitive 97): create has cognitive complexity 97 (threshold 15). Drivers by points: if/else 18 (49 pts), loops 10 (35 pts), ternaries 2 (8 pts), boolean chains 5 (nesting depth added 62). 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"90d3e8b20001e334221131bba10c925ae2d0824734632479757ca19d1c95d00d"}},{"ruleId":"D2","level":"warning","message":{"text":"RigidBodyComponentSystem.onContactPair (cognitive 96): RigidBodyComponentSystem.onContactPair has cognitive complexity 96 (threshold 15). Drivers by points: if/else 25 (80 pts), boolean chains 13, loops 1 (3 pts) (nesting depth added 57). 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":"src/framework/components/rigid-body/system.js"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"439ef71a32d6779979ceb42625cd4919065be8a32c852f70baab5f3d4eb10f9b"}},{"ruleId":"D2","level":"warning","message":{"text":"StandardMaterialValidator.validate (cognitive 91): StandardMaterialValidator.validate has cognitive complexity 91 (threshold 15). Drivers by points: if/else 32 (79 pts), boolean chains 8, loops 2 (4 pts) (nesting depth added 49). 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":"src/scene/materials/standard-material-validator.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c55995819be1d6bb14d9c4a8cc002f94f41dda6aba367c29a6525418872a90b"}},{"ruleId":"D2","level":"warning","message":{"text":"layout-calculator.createCalculator (cognitive 90): layout-calculator.createCalculator has cognitive complexity 90 (threshold 15). Drivers by points: if/else 27 (44 pts), loops 21 (29 pts), boolean chains 12, ternaries 2 (4 pts), match/switch 1 (nesting depth added 27). Of this number, 89 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":"src/framework/components/layout-group/layout-calculator.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73f4c50b2a612cc3e905c0ce90adfd8986976b1fd0707114f1440035d32451c"}},{"ruleId":"D2","level":"warning","message":{"text":"onAssetChanged (cognitive 88): onAssetChanged has cognitive complexity 88 (threshold 15). Drivers by points: if/else 19 (60 pts), loops 4 (18 pts), boolean chains 10 (nesting depth added 55). 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":"src/framework/components/animation/component.js"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcf77b9c2574e8d0174fbc569aa8014453abb523f865ae7828c7263a83cebf36"}},{"ruleId":"D2","level":"warning","message":{"text":"log (cognitive 88): log has cognitive complexity 88 (threshold 15). Drivers by points: ternaries 26 (73 pts), if/else 4 (9 pts), boolean chains 2, loops 1 (2 pts), other 2 (nesting depth added 53). 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":"src/platform/graphics/render-pass.js"},"region":{"startLine":404}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cba603724308caed9064424f000b01001a8201fb2905572778d9e1d627303bf"}},{"ruleId":"D2","level":"warning","message":{"text":"init (cognitive 86): init has cognitive complexity 86 (threshold 15). Drivers by points: if/else 20 (52 pts), ternaries 7 (25 pts), loops 2 (5 pts), boolean chains 2, other 2 (nesting depth added 53). Of this number, 83 points are the body\u0027s own statements and 3 belong to 4 function items inside it that branch. 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":"src/platform/graphics/webgl/webgl-render-target.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"d66c143650f8683fa20e75350986cb2a17bd32383556849ac111c4924254dc09"}},{"ruleId":"D2","level":"warning","message":{"text":"frameUpdate (cognitive 86): frameUpdate has cognitive complexity 86 (threshold 15). Drivers by points: if/else 18 (49 pts), ternaries 16 (30 pts), other 5, boolean chains 1, loops 1 (nesting depth added 45). 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":"src/extras/render-passes/render-pass-compose.js"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"3967db117fc005070c1c066fdade0a09db883108f25c1a2d640dc91dd3b31f96"}},{"ruleId":"D2","level":"warning","message":{"text":"ShaderGeneratorStandard.createShaderDefinition (cognitive 81): ShaderGeneratorStandard.createShaderDefinition has cognitive complexity 81 (threshold 15). Drivers by points: if/else 23 (51 pts), ternaries 6 (23 pts), boolean chains 7 (nesting depth added 45). 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":"src/scene/shader-lib/programs/standard.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"a580090cbba3c4b62484422bfbe2565278d79e2755c6acdafb3d869cc7c7369b"}},{"ruleId":"D2","level":"warning","message":{"text":"GltfExporter.writeStandardMaterial (cognitive 79): GltfExporter.writeStandardMaterial has cognitive complexity 79 (threshold 15). Drivers by points: if/else 40 (65 pts), boolean chains 11, ternaries 3 (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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"72115bf7be9ed1933d8832e3153ce9a7ae4db68f293b62f0cc4569e80660cb85"}},{"ruleId":"D2","level":"warning","message":{"text":"basis-worker.BasisWorker (cognitive 78): basis-worker.BasisWorker has cognitive complexity 78 (threshold 15). Drivers by points: if/else 28 (43 pts), loops 8 (12 pts), boolean chains 11, ternaries 7 (9 pts), match/switch 2, error handling 1 (nesting depth added 21). Most of this is not in the body itself: 0 of the 78 points are its own statements and the rest belongs to 17 function literals inside it that branch (lines 295, 191, 127, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"87007e06aec2686d6dfa62dc92c1f374bd9fa4c0a23b44310dc7f72dcd968c8a"}},{"ruleId":"D2","level":"warning","message":{"text":"ConeBaseGeometry.constructor (cognitive 77): ConeBaseGeometry.constructor has cognitive complexity 77 (threshold 15). Drivers by points: if/else 14 (41 pts), loops 12 (31 pts), boolean chains 5 (nesting depth added 46). 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":"src/scene/geometry/cone-base-geometry.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a30e363c4db17cf405d61a530253a79b799be2b3853499f2b99d77f1a32021b"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatBoxShaderEffect.generateLUT (cognitive 76): GSplatBoxShaderEffect.generateLUT has cognitive complexity 76 (threshold 15). Drivers by points: if/else 19 (39 pts), ternaries 8 (31 pts), boolean chains 3, loops 2 (3 pts) (nesting depth added 44). 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":"scripts/esm/gsplat/shader-effect-box.mjs"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"245902b84ef82ec1e801fd2309bb82587e22b1fbee7f6dd4f9d2a4da242f428a"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementComponentSystem.getImageElementMaterial (cognitive 76): ElementComponentSystem.getImageElementMaterial has cognitive complexity 76 (threshold 15). Drivers by points: if/else 30 (76 pts) (nesting depth added 46). 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":"src/framework/components/element/system.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"5731c86c7f471d6cc5c20525c1f060960c70d6d13048cdacf816ea14052c3acd"}},{"ruleId":"D2","level":"warning","message":{"text":"WebgpuTexture.uploadData (cognitive 75): WebgpuTexture.uploadData has cognitive complexity 75 (threshold 15). Drivers by points: if/else 25 (58 pts), loops 3 (13 pts), boolean chains 4 (nesting depth added 43). 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":"src/platform/graphics/webgpu/webgpu-texture.js"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"93bfa48da8bf7ee72ec0bd6260697ff14dae75311e01a84fc47291e628fd28e1"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatBudgetBalancer.balance (cognitive 73): GSplatBudgetBalancer.balance has cognitive complexity 73 (threshold 15). Drivers by points: if/else 15 (41 pts), loops 9 (19 pts), ternaries 3 (11 pts), boolean chains 2 (nesting depth added 44). 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":"src/scene/gsplat-unified/gsplat-budget-balancer.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"6debba78442534109f0fc0031d602596a5c59393e61013edae11bcd3fd47a1f6"}},{"ruleId":"D2","level":"warning","message":{"text":"ForwardRenderer.buildFrameGraph (cognitive 73): ForwardRenderer.buildFrameGraph has cognitive complexity 73 (threshold 15). Drivers by points: if/else 17 (54 pts), boolean chains 12, ternaries 2 (6 pts), loops 1 (nesting depth added 41). Of this number, 70 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. 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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":661}}}],"partialFingerprints":{"codehealthFindingId/v1":"515707dd745956e5433a72bb0718b73750dd643c7dd32d9eb41f4271af844e26"}},{"ruleId":"D2","level":"warning","message":{"text":"LayerComposition._update (cognitive 69): LayerComposition._update has cognitive complexity 69 (threshold 15). Drivers by points: if/else 14 (53 pts), loops 5 (12 pts), boolean chains 4 (nesting depth added 46). 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":"src/scene/composition/layer-composition.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"c27385d979f5f75fc420ee2fd2e862b3789c1b59d1bf6348975c35fda3f9fce7"}},{"ruleId":"D2","level":"warning","message":{"text":"gsplat-unified-sort-worker.UnifiedSortWorker (cognitive 69): gsplat-unified-sort-worker.UnifiedSortWorker has cognitive complexity 69 (threshold 15). Drivers by points: ternaries 12 (26 pts), if/else 13 (18 pts), loops 13 (18 pts), boolean chains 6, match/switch 1 (nesting depth added 24). Most of this is not in the body itself: 2 of the 69 points are its own statements and the rest belongs to 10 function literals inside it that branch (lines 179, 221, 321, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"609bf4070947aaea8681ae6bf80938bf6153a72cdc5a495ceeb3b2d9657f2e51"}},{"ruleId":"D2","level":"warning","message":{"text":"rebuildGeometry (cognitive 66): rebuildGeometry has cognitive complexity 66 (threshold 15). Drivers by points: if/else 12 (30 pts), ternaries 8 (22 pts), boolean chains 13, loops 1 (nesting depth added 32). 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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"84e24d65e54a97fd40ccdef9cd3733f4061b2b9886ea8549f641fbed8dc37910"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatDirector.update (cognitive 64): GSplatDirector.update has cognitive complexity 64 (threshold 15). Drivers by points: if/else 15 (50 pts), loops 5 (9 pts), boolean chains 5 (nesting depth added 39). Of this number, 54 points are the body\u0027s own statements and 10 belong to 2 function literals inside it that branch. 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":"src/scene/gsplat-unified/gsplat-director.js"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f23d91e50fdd77c2051a714bf66ef35b468fb418ed562e6bafa94f5515827c"}},{"ruleId":"D2","level":"warning","message":{"text":"create (cognitive 64): create has cognitive complexity 64 (threshold 15). Drivers by points: if/else 19 (50 pts), boolean chains 9, ternaries 2 (5 pts) (nesting depth added 34). 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":"src/framework/components/script/component.js"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"5076c5c01c0a4f87b547ee72df3882ad98763f762b169813f856ba0ad6e00907"}},{"ruleId":"D2","level":"warning","message":{"text":"GlbContainerResource.instantiateRenderEntity (cognitive 61): GlbContainerResource.instantiateRenderEntity has cognitive complexity 61 (threshold 15). Drivers by points: if/else 16 (48 pts), loops 5 (12 pts), ternaries 1 (nesting depth added 39). Most of this is not in the body itself: 1 of the 61 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 141, 101). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-container-resource.js"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed75b4d4a67d8f14e700a8c3e50ba28320e1cb39944d813f4da794119af83db3"}},{"ruleId":"D2","level":"warning","message":{"text":"render-physics.RenderPhysics.postUpdate (cognitive 60): render-physics.RenderPhysics.postUpdate has cognitive complexity 60 (threshold 15). Drivers by points: if/else 15 (48 pts), match/switch 2 (9 pts), boolean chains 3 (nesting depth added 40). Most of this is not in the body itself: 1 of the 60 points is its own statement and the rest belongs to 2 function literals inside it that branch (lines 81, 205). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/physics/render-physics.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f76780d4d2bd06c451b363929a1e63e51628be9409207735c26893688802abc"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatOctreeInstance.applyLodChanges (cognitive 60): GSplatOctreeInstance.applyLodChanges has cognitive complexity 60 (threshold 15). Drivers by points: if/else 17 (47 pts), ternaries 2 (6 pts), boolean chains 5, loops 2 (nesting depth added 34). 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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ad70a0c42b98871fcba5f5c6074a0a4e7844e69a6d10ad285043fb0d0fbb5f"}},{"ruleId":"D2","level":"warning","message":{"text":"start (cognitive 60): start has cognitive complexity 60 (threshold 15). Drivers by points: if/else 26 (52 pts), boolean chains 7, other 1 (nesting depth added 26). Of this number, 56 points are the body\u0027s own statements and 4 belong 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":"src/framework/xr/xr-manager.js"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccd1b452f03906c510ba560c3ba0957053d5d72a547c642995c28c6d307fa20f"}},{"ruleId":"D2","level":"warning","message":{"text":"TagsCache.find (cognitive 59): TagsCache.find has cognitive complexity 59 (threshold 15). Drivers by points: if/else 13 (45 pts), loops 4 (12 pts), boolean chains 2 (nesting depth added 40). 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":"src/core/tags-cache.js"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"446fe6f462bc54025e3defc41d24c04e5f9b3aa120a1cd47cd7e6f01c82c591d"}},{"ruleId":"D2","level":"warning","message":{"text":"Texture.setSource (cognitive 57): Texture.setSource has cognitive complexity 57 (threshold 15). Drivers by points: if/else 22 (40 pts), loops 3 (9 pts), boolean chains 8 (nesting depth added 24). 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":"src/platform/graphics/texture.js"},"region":{"startLine":1257}}}],"partialFingerprints":{"codehealthFindingId/v1":"971344b92f593d822ce9e6a572f92cf9fde15cc30f6ed972e5fbcb7c59b652d2"}},{"ruleId":"D2","level":"warning","message":{"text":"ObjModelParser.parse (cognitive 56): ObjModelParser.parse has cognitive complexity 56 (threshold 15). Drivers by points: if/else 18 (45 pts), loops 4 (10 pts), boolean chains 1 (nesting depth added 33). 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":"scripts/esm/parsers/obj-model.mjs"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"25c1fcd7fd40ed36974051d9240e9cb1572c27e9774817702f844674dd1b4106"}},{"ruleId":"D2","level":"warning","message":{"text":"ResourceLoader.load (cognitive 56): ResourceLoader.load has cognitive complexity 56 (threshold 15). Drivers by points: if/else 19 (45 pts), error handling 2 (6 pts), boolean chains 5 (nesting depth added 30). Of this number, 28 points are the body\u0027s own statements and 28 belong to 2 function literals inside it that branch. 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":"src/framework/handlers/loader.js"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5c0caef4fb1e143dab326adaef7f97e00f83a2f3b680ae2c8f496c56155fdcb"}},{"ruleId":"D2","level":"warning","message":{"text":"ShadowRenderer.cullShadowCastersOmni (cognitive 56): ShadowRenderer.cullShadowCastersOmni has cognitive complexity 56 (threshold 15). Drivers by points: if/else 11 (35 pts), boolean chains 11, loops 6 (10 pts) (nesting depth added 28). Of this number, 54 points are the body\u0027s own statements and 2 belong 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":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd050aa1eb8da3b587717094510d84d6846e26b84f776555cef3583f84f5a2a5"}},{"ruleId":"D2","level":"warning","message":{"text":"draw (cognitive 56): draw has cognitive complexity 56 (threshold 15). Drivers by points: if/else 17 (38 pts), boolean chains 6, ternaries 2 (6 pts), loops 1 (3 pts), other 3 (nesting depth added 27). 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":1339}}}],"partialFingerprints":{"codehealthFindingId/v1":"10e3546b5d2aae46c877eaec3786dec7c3ac81ff7ea1541279333f645127095c"}},{"ruleId":"D2","level":"warning","message":{"text":"instantiateRenderEntity::cloneHierarchy (cognitive 56): instantiateRenderEntity::cloneHierarchy has cognitive complexity 56 (threshold 15). Drivers by points: if/else 13 (45 pts), loops 4 (11 pts) (nesting depth added 39). 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":"src/framework/parsers/glb-container-resource.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"19c3c6e8e28dcbb24c78366d7a75e5b90aa07e90034e3100ac50bd90ac952c86"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 55): update has cognitive complexity 55 (threshold 15). Drivers by points: if/else 11 (18 pts), boolean chains 14, ternaries 4 (12 pts), loops 4 (10 pts), other 1 (nesting depth added 21). 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":"src/framework/handlers/cubemap.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b456f8573e0ea824a702ab4f86199386ffb183fe15e6b0e1a7cc52b4f8074ea"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimController.update (cognitive 54): AnimController.update has cognitive complexity 54 (threshold 15). Drivers by points: if/else 13 (30 pts), loops 6 (19 pts), ternaries 1 (3 pts), boolean chains 2 (nesting depth added 32). 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"7061a5f7567649d319e667bfdd0df317a6ee5653ac040a5f1de3557bd84d9348"}},{"ruleId":"D2","level":"warning","message":{"text":"system.recreateShapes (cognitive 53): system.recreateShapes has cognitive complexity 53 (threshold 15). Drivers by points: if/else 17 (45 pts), boolean chains 4, loops 1 (4 pts) (nesting depth added 31). 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":"src/framework/components/collision/system.js"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b1b8b99278c78a9f72c403e4a3a0a0997bec54e2ed3c31990e0080f257d30e"}},{"ruleId":"D2","level":"warning","message":{"text":"createAnimation (cognitive 52): createAnimation has cognitive complexity 52 (threshold 15). Drivers by points: if/else 12 (25 pts), loops 11 (15 pts), ternaries 4 (7 pts), boolean chains 5 (nesting depth added 20). Of this number, 40 points are the body\u0027s own statements and 12 belong to 3 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"c004c19b5a43689034ccbb9aebad22e40357b9289391878ee466e6dd8fec5ca8"}},{"ruleId":"D2","level":"warning","message":{"text":"AssetRegistry.load (cognitive 51): AssetRegistry.load has cognitive complexity 51 (threshold 15). Drivers by points: if/else 20 (37 pts), boolean chains 9, loops 2 (5 pts) (nesting depth added 20). Of this number, 21 points are the body\u0027s own statements and 30 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/asset/asset-registry.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a60eea5befcb9e6352c83ddf511824200386dcbf7d3f75be5bb0e863bbba12"}},{"ruleId":"D2","level":"warning","message":{"text":"resolveDuplicatedEntityReferenceProperties (cognitive 51): resolveDuplicatedEntityReferenceProperties has cognitive complexity 51 (threshold 15). Drivers by points: if/else 10 (27 pts), loops 4 (13 pts), boolean chains 4, ternaries 1 (4 pts), other 3 (nesting depth added 29). 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":"src/framework/components/script/component.js"},"region":{"startLine":1043}}}],"partialFingerprints":{"codehealthFindingId/v1":"216a8b7e9f715c96a89c22bc79fe915073eb3b02655ab535249db7f94464060e"}},{"ruleId":"D2","level":"warning","message":{"text":"request (cognitive 50): request has cognitive complexity 50 (threshold 15). Drivers by points: if/else 20 (38 pts), loops 2 (5 pts), match/switch 1 (3 pts), boolean chains 2, error handling 1, ternaries 1 (nesting depth added 23). Of this number, 46 points are the body\u0027s own statements and 4 belong to 3 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/net/http.js"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"1110deb3e0e1710e9acb0b65b7e820c789f23f3b0055e3c2c81c9ef0128d931d"}},{"ruleId":"D2","level":"warning","message":{"text":"processParentheses (cognitive 49): processParentheses has cognitive complexity 49 (threshold 15). Drivers by points: if/else 14 (37 pts), loops 4 (6 pts), boolean chains 4, ternaries 1 (2 pts) (nesting depth added 26). 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":"src/core/preprocessor.js"},"region":{"startLine":595}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea2361db3294ce6b843f02587aa348505f7ec5e2e4e3bf3fdba659a2d497610"}},{"ruleId":"D2","level":"warning","message":{"text":"copyRenderTarget (cognitive 48): copyRenderTarget has cognitive complexity 48 (threshold 15). Drivers by points: ternaries 12 (25 pts), if/else 9 (17 pts), boolean chains 3, other 3 (nesting depth added 21). 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":2081}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ace77a8d195501adb2d869e901248c0504c173236c4ab710fc1698a2548fa8d"}},{"ruleId":"D2","level":"warning","message":{"text":"renderForwardInternal (cognitive 48): renderForwardInternal has cognitive complexity 48 (threshold 15). Drivers by points: if/else 11 (23 pts), ternaries 8 (11 pts), boolean chains 6, loops 2 (4 pts), other 4 (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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"44b7f61258c0a8661d8e31f60106f18cdbc6669cd2613dd488e1104fffda4921"}},{"ruleId":"D2","level":"warning","message":{"text":"ParticleSystemComponentSystem.onUpdate (cognitive 47): ParticleSystemComponentSystem.onUpdate has cognitive complexity 47 (threshold 15). Drivers by points: if/else 8 (33 pts), loops 4 (13 pts), boolean chains 1 (nesting depth added 34). 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":"src/framework/components/particle-system/system.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"5127fe591c7210e509a87c4230457889c9b7a4acdfa9fda3879c2586c3cc038a"}},{"ruleId":"D2","level":"warning","message":{"text":"MaterialHandler._bindAndAssignAssets (cognitive 47): MaterialHandler._bindAndAssignAssets has cognitive complexity 47 (threshold 15). Drivers by points: if/else 18 (41 pts), boolean chains 3, loops 3 (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":"src/framework/handlers/material.js"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"b87e747d1c92cca9c21ce4036e49e4c3b4d23af5dc0c821920cbd3c575049639"}},{"ruleId":"D2","level":"warning","message":{"text":"createImages (cognitive 47): createImages has cognitive complexity 47 (threshold 15). Drivers by points: if/else 22 (33 pts), loops 2 (8 pts), boolean chains 4, ternaries 1 (2 pts) (nesting depth added 18). Most of this is not in the body itself: 2 of the 47 points are its own statements and the rest belongs to 14 function items inside it that branch (getGammaTextures::(anonymous), (anonymous)::(anonymous), loadTexture::(anonymous)::continuation, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1358}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf2249b7a84da929895081988f9fc6c8b290fc4f4ceac8cb5eba01216785b4a"}},{"ruleId":"D2","level":"warning","message":{"text":"ShadowRendererDirectional.cull (cognitive 46): ShadowRendererDirectional.cull has cognitive complexity 46 (threshold 15). Drivers by points: if/else 16 (34 pts), loops 6 (10 pts), ternaries 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":"src/scene/renderer/shadow-renderer-directional.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"671b24959e339eea3cfd6e1949b86b48b87f03f13ff07d3970acbe2409fd203d"}},{"ruleId":"D2","level":"warning","message":{"text":"DdsParser.open (cognitive 46): DdsParser.open has cognitive complexity 46 (threshold 15). Drivers by points: if/else 20 (32 pts), ternaries 4 (9 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 18). 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":"src/framework/parsers/texture/dds.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9d5f45000ed93d44730b751c5cd3bdc25e52733950242997d1a84f54f47e69"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateWorldState (cognitive 46): _updateWorldState has cognitive complexity 46 (threshold 15). Drivers by points: if/else 9 (17 pts), loops 9 (17 pts), boolean chains 6, ternaries 2 (6 pts) (nesting depth added 20). Of this number, 34 points are the body\u0027s own statements and 12 belong 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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"8159936f11058410d0d7e3b940b584d486a1cbe3676a124226ac62d1601436fa"}},{"ruleId":"D2","level":"warning","message":{"text":"FrameGraph._compilePasses (cognitive 45): FrameGraph._compilePasses has cognitive complexity 45 (threshold 15). Drivers by points: if/else 12 (32 pts), loops 5 (11 pts), boolean chains 2 (nesting depth added 26). 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":"src/scene/frame-graph.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d57874f594b981394b54dbebad7cacf738158591edf2046264a66dd2c043797"}},{"ruleId":"D2","level":"warning","message":{"text":"draco-worker.DracoWorker (cognitive 45): draco-worker.DracoWorker has cognitive complexity 45 (threshold 15). Drivers by points: loops 11 (21 pts), if/else 9 (11 pts), boolean chains 6, match/switch 4, ternaries 1 (3 pts) (nesting depth added 14). Most of this is not in the body itself: 2 of the 45 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 137, 282, 70, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03746ded71cd4afda05c55bd3eca28147d83eb9ea72c42be6edaff7afb40ab33"}},{"ruleId":"D2","level":"warning","message":{"text":"updateStateFromTransition (cognitive 45): updateStateFromTransition has cognitive complexity 45 (threshold 15). Drivers by points: if/else 15 (28 pts), ternaries 4 (9 pts), loops 4 (7 pts), boolean chains 1 (nesting depth added 21). 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"24005a74d0125d8bd05c89a1cd28228ef775a0462dacd37a7e4c1dcd8c754c6c"}},{"ruleId":"D2","level":"warning","message":{"text":"RigidBodyComponentSystem._cleanOldCollisions (cognitive 44): RigidBodyComponentSystem._cleanOldCollisions has cognitive complexity 44 (threshold 15). Drivers by points: if/else 9 (39 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 32). 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":"src/framework/components/rigid-body/system.js"},"region":{"startLine":790}}}],"partialFingerprints":{"codehealthFindingId/v1":"22fadb973dd0c128017289ac52c9923a1b0c2ba8fc3f8b6dee5cdde08e69bf4d"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.endRenderPass (cognitive 44): WebglGraphicsDevice.endRenderPass has cognitive complexity 44 (threshold 15). Drivers by points: if/else 13 (34 pts), boolean chains 6, loops 2 (4 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1603}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d7d8eb58787cb20d8cffabc932ca82271b732e12c1d8331b8a0e657ea6922d6"}},{"ruleId":"D2","level":"warning","message":{"text":"TextureAtlasHandler.patch (cognitive 44): TextureAtlasHandler.patch has cognitive complexity 44 (threshold 15). Drivers by points: if/else 18 (34 pts), boolean chains 6, ternaries 1 (3 pts), loops 1 (nesting depth added 18). 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":"src/framework/handlers/texture-atlas.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6da8ff58e9c4fdf4a1f1b9a8aab591ea89a19d9bb7d309d9f4877512d2e6c7c"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 44): constructor has cognitive complexity 44 (threshold 15). Drivers by points: other 23, if/else 9 (10 pts), boolean chains 7, ternaries 4 (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":"src/platform/graphics/texture.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"49057cfce232b8f2c1080bcf523c56579d3e95667e15af8537452697d643417b"}},{"ruleId":"D2","level":"warning","message":{"text":"renderForwardLayer (cognitive 44): renderForwardLayer has cognitive complexity 44 (threshold 15). Drivers by points: if/else 12 (22 pts), ternaries 3 (10 pts), other 8, boolean chains 4 (nesting depth added 17). Of this number, 26 points are the body\u0027s own statements and 18 belong to one function literal inside it that branches. 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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":485}}}],"partialFingerprints":{"codehealthFindingId/v1":"febedeb1d61ac166f11d87cae1171b17782c478394b0d4f1ab85969289ec37c2"}},{"ruleId":"D2","level":"warning","message":{"text":"_logRenderActions (cognitive 44): _logRenderActions has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 9 (36 pts), if/else 3 (5 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 30). 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":"src/scene/composition/layer-composition.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"e942eba32ada0a08add522b6b6fe75daf0f6d2cc999e003ec4b36947e690c433"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchManager.prepare (cognitive 43): BatchManager.prepare has cognitive complexity 43 (threshold 15). Drivers by points: if/else 13 (33 pts), boolean chains 6, loops 2 (3 pts), ternaries 1 (nesting depth added 21). Of this number, 40 points are the body\u0027s own statements and 3 belong 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":474}}}],"partialFingerprints":{"codehealthFindingId/v1":"512146f5b4ee22a17d21186a995b862dc4e7056916112b8a3b051a80bd657ed8"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 42): constructor has cognitive complexity 42 (threshold 15). Drivers by points: if/else 17 (20 pts), boolean chains 16, ternaries 2 (4 pts), other 2 (nesting depth added 5). Of this number, 21 points are the body\u0027s own statements and 21 belong to 30 function items inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"a065491e6ddef8780ce629ce1f6ab2f2a9aa71ce28c19db498530b04a84debf0"}},{"ruleId":"D2","level":"warning","message":{"text":"setupForRenderPass (cognitive 42): setupForRenderPass has cognitive complexity 42 (threshold 15). Drivers by points: ternaries 8 (19 pts), if/else 7 (14 pts), boolean chains 7, loops 1, other 1 (nesting depth added 18). 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":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5c464ef3c034b1825814a0ac686fccdeed33ac744178ee5e9d284e872ec08dd"}},{"ruleId":"D2","level":"warning","message":{"text":"assignSplatOffsets (cognitive 42): assignSplatOffsets has cognitive complexity 42 (threshold 15). Drivers by points: if/else 9 (28 pts), loops 3 (9 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 26). 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":"src/scene/gsplat-unified/gsplat-world-state.js"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"274b722ef88f0d83c6b306cda528452b559ec3eb013878887f9aedacaf6e9519"}},{"ruleId":"D2","level":"warning","message":{"text":"HdrParser._readPixels (cognitive 41): HdrParser._readPixels has cognitive complexity 41 (threshold 15). Drivers by points: if/else 8 (21 pts), loops 5 (16 pts), boolean chains 3, ternaries 1 (nesting depth added 24). 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":"src/framework/parsers/texture/hdr.js"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"a20ae698c4b0b0c5d7edac439a164dd1eb1188f7d63b9ccaa29a7c627d4c9308"}},{"ruleId":"D2","level":"warning","message":{"text":"EventHandler.off (cognitive 39): EventHandler.off has cognitive complexity 39 (threshold 15). Drivers by points: if/else 13 (25 pts), loops 5 (12 pts), boolean chains 2 (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":"src/core/event-handler.js"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"a58252364aab86c843111c41b5f0312b85ee54219f835fa961347fd03e65c454"}},{"ruleId":"D2","level":"warning","message":{"text":"Mesh.update (cognitive 39): Mesh.update has cognitive complexity 39 (threshold 15). Drivers by points: if/else 16 (37 pts), boolean chains 2 (nesting depth added 21). 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":"src/scene/mesh.js"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"93555c81789fae47c4e13fe88c2324ffec9f20cdca1020e41ce8590bb6a6fac6"}},{"ruleId":"D2","level":"warning","message":{"text":"Skeleton.addTime (cognitive 39): Skeleton.addTime has cognitive complexity 39 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 4 (12 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 21). 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":"src/scene/animation/skeleton.js"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"22aff2ee7bd6ccd7b8adf92d50f01f57ce4391d52ff7663f4658f0df2fd0ccc7"}},{"ruleId":"D2","level":"warning","message":{"text":"_allocate (cognitive 39): _allocate has cognitive complexity 39 (threshold 15). Drivers by points: if/else 12 (24 pts), loops 3 (8 pts), ternaries 2 (6 pts), boolean chains 1 (nesting depth added 21). 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":887}}}],"partialFingerprints":{"codehealthFindingId/v1":"6621f840b9338d71a6df8d29633426dc47fd17aba86b5f7bb3f01ab912ef5276"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatLodTable.constructor (cognitive 38): GSplatLodTable.constructor has cognitive complexity 38 (threshold 15). Drivers by points: if/else 7 (24 pts), loops 5 (14 pts) (nesting depth added 26). 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":"src/scene/gsplat-unified/gsplat-lod-table.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"d626d051b718aa3786b128ff43da5fd7b4754aea4d2c4fdf7cb85b25cf3c7f9c"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatWorkBufferRenderPass.update (cognitive 38): GSplatWorkBufferRenderPass.update has cognitive complexity 38 (threshold 15). Drivers by points: if/else 11 (29 pts), loops 4 (9 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":"src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"6afe0a49c2a2e0834f33f8401274197e1833478f96729ac4f86181ee9957a080"}},{"ruleId":"D2","level":"warning","message":{"text":"Lightmapper.collectModels (cognitive 38): Lightmapper.collectModels has cognitive complexity 38 (threshold 15). Drivers by points: if/else 15 (31 pts), loops 3 (6 pts), boolean chains 1 (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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2b4b4cabfdec27d1a912e5c7e416e033bef430811fb0608793ab6f190680582"}},{"ruleId":"D2","level":"warning","message":{"text":"khr-lights-punctual.createLights (cognitive 38): khr-lights-punctual.createLights has cognitive complexity 38 (threshold 15). Drivers by points: if/else 8 (31 pts), ternaries 1 (5 pts), boolean chains 2 (nesting depth added 27). Most of this is not in the body itself: 4 of the 38 points are its own statements and the rest belongs to one function literal inside it that branches (line 64). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-lights-punctual.js"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"346b37037265f7cab8e46b9bb3ad809809ffbd47e13dab70f421e6e4db41f1c0"}},{"ruleId":"D2","level":"warning","message":{"text":"createMaterial (cognitive 38): createMaterial has cognitive complexity 38 (threshold 15). Drivers by points: if/else 21 (32 pts), loops 1 (2 pts), match/switch 1 (2 pts), ternaries 1 (2 pts) (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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":531}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f5fcfdfcbea3fcc2808fd290107f99c98182f437121e50723d6019649566f12"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 38): update has cognitive complexity 38 (threshold 15). Drivers by points: if/else 12 (19 pts), loops 7 (12 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 13). Of this number, 28 points are the body\u0027s own statements and 10 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"edced09d2720b531e895b2d957c79374be196510ea65558532ce0af8593816ff"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatOctreeInstance.update (cognitive 37): GSplatOctreeInstance.update has cognitive complexity 37 (threshold 15). Drivers by points: if/else 8 (22 pts), loops 4 (14 pts), boolean chains 1 (nesting depth added 24). 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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":921}}}],"partialFingerprints":{"codehealthFindingId/v1":"edd64bafa7c68413810b3af720111ad1ebc243db393308985aa4cecdc65152f8"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatBudgetBalancer._accumulate (cognitive 37): GSplatBudgetBalancer._accumulate has cognitive complexity 37 (threshold 15). Drivers by points: if/else 5 (15 pts), ternaries 4 (15 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 24). 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":"src/scene/gsplat-unified/gsplat-budget-balancer.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aa5c6368579607cf3d150b6619a9a3e9d1e27eea24278a3e0415eba13cd7dca"}},{"ruleId":"D2","level":"warning","message":{"text":"khr-draco-mesh-compression.createDracoMesh (cognitive 37): khr-draco-mesh-compression.createDracoMesh has cognitive complexity 37 (threshold 15). Drivers by points: if/else 9 (21 pts), loops 3 (9 pts), boolean chains 5, ternaries 1 (2 pts) (nesting depth added 19). Most of this is not in the body itself: 2 of the 37 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 23, 75, 20). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-draco-mesh-compression.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1030a1c242c2cf9fbd2e29e8c481b6b8f7f097d5172f8003a3631438a46bb3e"}},{"ruleId":"D2","level":"warning","message":{"text":"rebuild (cognitive 37): rebuild has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 11 (16 pts), if/else 12 (14 pts), boolean chains 4, loops 3 (nesting depth added 7). 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":553}}}],"partialFingerprints":{"codehealthFindingId/v1":"056970f6e589652340485afa4cdab74709f3324d5c1e247fd084eac76a917ae1"}},{"ruleId":"D2","level":"warning","message":{"text":"MeshInstance.aabb (cognitive 36): MeshInstance.aabb has cognitive complexity 36 (threshold 15). Drivers by points: if/else 13 (27 pts), ternaries 1 (4 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 19). 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":"src/scene/mesh-instance.js"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"20303139d3dfaca3994f589e9af759931e2737ab4c82c3acef971625e5e2ee96"}},{"ruleId":"D2","level":"warning","message":{"text":"glb-parser.createMesh (cognitive 36): glb-parser.createMesh has cognitive complexity 36 (threshold 15). Drivers by points: if/else 16 (31 pts), boolean chains 3, ternaries 1 (2 pts) (nesting depth added 16). Most of this is not in the body itself: 0 of the 36 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 422, 488). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"f878f95188e2f67b5380a25304663eccef3d0d8add7272b41ca9b7792c1c7065"}},{"ruleId":"D2","level":"warning","message":{"text":"CubemapHandler.loadAssets (cognitive 36): CubemapHandler.loadAssets has cognitive complexity 36 (threshold 15). Drivers by points: if/else 17 (29 pts), boolean chains 3, ternaries 1 (3 pts), loops 1 (nesting depth added 14). Of this number, 24 points are the body\u0027s own statements and 12 belong to 3 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/cubemap.js"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c34a61eb2139dd4144693c8b67bca9aa03552667f80732fabe9ac202ea15a08"}},{"ruleId":"D2","level":"warning","message":{"text":"reprojectTexture (cognitive 36): reprojectTexture has cognitive complexity 36 (threshold 15). Drivers by points: ternaries 12 (16 pts), if/else 8 (11 pts), boolean chains 4, other 4, 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":"src/scene/graphics/reproject-texture.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cf9f441e5ef3b8f14ce1fa84554b0b90bcd5191bb5fea0853768897a2f7782"}},{"ruleId":"D2","level":"warning","message":{"text":"XrManipulation.update (cognitive 35): XrManipulation.update has cognitive complexity 35 (threshold 15). Drivers by points: if/else 16 (23 pts), boolean chains 9, loops 1 (2 pts), ternaries 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":"scripts/esm/xr/xr-manipulation.mjs"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"63b6041987fffdbe3d556e97fa834ddb906da11b5e0cabfa620287a1f55ddd2a"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimStateGraph.constructor (cognitive 35): AnimStateGraph.constructor has cognitive complexity 35 (threshold 15). Drivers by points: if/else 6 (20 pts), loops 5 (14 pts), boolean chains 1 (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":"src/framework/anim/state-graph/anim-state-graph.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd117e020a6cd6b7e3e2c5f5246aec5706d656fde2808cd0e1f837dbf6a8c1c3"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementComponent._sync (cognitive 35): ElementComponent._sync has cognitive complexity 35 (threshold 15). Drivers by points: if/else 17 (33 pts), boolean chains 2 (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":"src/framework/components/element/component.js"},"region":{"startLine":2218}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8a23f4cacf17cd0a4bb8293c898093a7fffb0d04962f4926fb0abb63bcfeb69"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.copyRenderTarget (cognitive 35): WebglGraphicsDevice.copyRenderTarget has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (23 pts), ternaries 7 (9 pts), boolean chains 3 (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1321}}}],"partialFingerprints":{"codehealthFindingId/v1":"a905fa6d36df06399125a8c4514b820395216864a308f9c9afe7913c48c3f6d0"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimEvaluator.update (cognitive 35): AnimEvaluator.update has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (26 pts), loops 4 (8 pts), boolean chains 1 (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":"src/framework/anim/evaluator/anim-evaluator.js"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"bba1d1080d1cc8ddcd4a4c4f45cf7071175ceb99334ee1c424a02ab3b652b261"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphNode._sync (cognitive 34): GraphNode._sync has cognitive complexity 34 (threshold 15). Drivers by points: if/else 10 (28 pts), loops 1 (5 pts), boolean chains 1 (nesting depth added 22). 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":"src/scene/graph-node.js"},"region":{"startLine":1550}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7085ed60e951866643b8944d34477e13a11b48b95e7c98f11acc21c4035c95a"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatWorld.cleanupOldWorldStates (cognitive 34): GSplatWorld.cleanupOldWorldStates has cognitive complexity 34 (threshold 15). Drivers by points: if/else 7 (21 pts), loops 5 (12 pts), boolean chains 1 (nesting depth added 21). 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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":898}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b0a9e1931475f8faef11544f431ffebbfb020707410138a6a6622598f886ef8"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimationComponent.update (cognitive 34): AnimationComponent.update has cognitive complexity 34 (threshold 15). Drivers by points: if/else 14 (26 pts), boolean chains 6, loops 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/animation/component.js"},"region":{"startLine":743}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e3ecb5642d0e24138978c129450d55430570a920b745b7e82d84d1132e29dba"}},{"ruleId":"D2","level":"warning","message":{"text":"startRenderPass (cognitive 34): startRenderPass has cognitive complexity 34 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 2 (8 pts), boolean chains 3, loops 1 (2 pts), other 2 (nesting depth added 15). Of this number, 33 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1490}}}],"partialFingerprints":{"codehealthFindingId/v1":"b336aa2f54d89fb60e5321699de97483cf6052e78ff0ca6a9dff17c60c7d0513"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 34): update has cognitive complexity 34 (threshold 15). Drivers by points: if/else 9 (20 pts), error handling 3 (8 pts), loops 4 (5 pts), boolean chains 1 (nesting depth added 17). Of this number, 24 points are the body\u0027s own statements and 10 belong to 4 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-anchors.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"57294d890da823bfa49cde18db05cdb61191ccfc058fd28947ff61c3373a73a8"}},{"ruleId":"D2","level":"warning","message":{"text":"XrMenu._updateRayInteraction (cognitive 33): XrMenu._updateRayInteraction has cognitive complexity 33 (threshold 15). Drivers by points: if/else 10 (24 pts), boolean chains 5, loops 3 (4 pts) (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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"61570febbcf6f9a66e2c2e9f058c663d550338943e165b81dfa54835099c57a8"}},{"ruleId":"D2","level":"warning","message":{"text":"WorldClustersDebug.render (cognitive 33): WorldClustersDebug.render has cognitive complexity 33 (threshold 15). Drivers by points: loops 7 (17 pts), if/else 9 (16 pts) (nesting depth added 17). Of this number, 25 points are the body\u0027s own statements and 8 belong to one function literal inside it that branches. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/lighting/world-clusters-debug.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"da8bb73bcee28d0b650c935dd98bdc1021b443a8acedae60145715027763cbc8"}},{"ruleId":"D2","level":"warning","message":{"text":"Culler.updateLightVisibility (cognitive 33): Culler.updateLightVisibility has cognitive complexity 33 (threshold 15). Drivers by points: if/else 8 (23 pts), loops 6 (7 pts), boolean chains 3 (nesting depth added 16). 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":"src/scene/renderer/culler.js"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc564a35452811e2e84bdf1f70d1bf3bb7da7edb852224476794068dc8b135b"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatComponent.castShadows (cognitive 33): GSplatComponent.castShadows has cognitive complexity 33 (threshold 15). Drivers by points: loops 4 (16 pts), if/else 7 (15 pts), boolean chains 2 (nesting depth added 20). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/gsplat/component.js"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3586abe274c77ab026bdd5ed452c8a542a112e360b5fe2451921d3a65d15259"}},{"ruleId":"D2","level":"warning","message":{"text":"EventHandler.fire (cognitive 32): EventHandler.fire has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (24 pts), boolean chains 4, ternaries 1 (3 pts), loops 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":"src/core/event-handler.js"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"99702a31f180a7cd98b7bf6a017a9cbc45489d30ce53595eb8d94dc6de94d439"}},{"ruleId":"D2","level":"warning","message":{"text":"LightTextureAtlas.subdivide (cognitive 32): LightTextureAtlas.subdivide has cognitive complexity 32 (threshold 15). Drivers by points: loops 4 (20 pts), if/else 6 (11 pts), boolean chains 1 (nesting depth added 21). Of this number, 31 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/lighting/light-texture-atlas.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"40dbfa860ab9abf5d1f7e4df26c70bf71bf66307f5464d537d7da083785eb64f"}},{"ruleId":"D2","level":"warning","message":{"text":"RenderComponent.castShadows (cognitive 32): RenderComponent.castShadows has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (19 pts), loops 3 (11 pts), boolean chains 2 (nesting depth added 21). 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":"src/framework/components/render/component.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"eca592fe5e6e76139a6cfe6039848643f08a55ebcc2a33057562a517dd16b237"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptComponent.scripts (cognitive 32): ScriptComponent.scripts has cognitive complexity 32 (threshold 15). Drivers by points: if/else 8 (27 pts), loops 2 (5 pts) (nesting depth added 22). 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":"src/framework/components/script/component.js"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"76b83f2b33418694725b983e18c32b5451cd28b5f06faf2c24b8d7442e60b9ee"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimEvaluator.addClip (cognitive 32): AnimEvaluator.addClip has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (22 pts), loops 3 (7 pts), boolean chains 3 (nesting depth added 20). 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":"src/framework/anim/evaluator/anim-evaluator.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"12475d5ddfea1c30ed1e82e16979750ee60c481f3f4b82b0440f7d6a4312714f"}},{"ruleId":"D2","level":"warning","message":{"text":"entity.resolveDuplicatedEntityReferenceProperties (cognitive 32): entity.resolveDuplicatedEntityReferenceProperties has cognitive complexity 32 (threshold 15). Drivers by points: if/else 11 (25 pts), loops 3 (7 pts) (nesting depth added 18). 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":"src/framework/entity.js"},"region":{"startLine":870}}}],"partialFingerprints":{"codehealthFindingId/v1":"68d652cadebb336639847de0548888a21c8a9d08db556d85255c10384ac2f7c9"}},{"ruleId":"D2","level":"warning","message":{"text":"computeDistanceRange (cognitive 32): computeDistanceRange has cognitive complexity 32 (threshold 15). Drivers by points: if/else 6 (17 pts), ternaries 5 (11 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 18). 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":"src/scene/gsplat-unified/gsplat-hybrid-renderer.js"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fbd6da8c31f09a6b60fc354940b213a333f8db4f13459492c6f6276cd3c3c96"}},{"ruleId":"D2","level":"warning","message":{"text":"SpriteAnimationClip.sprite (cognitive 31): SpriteAnimationClip.sprite has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (28 pts), boolean chains 3 (nesting depth added 15). 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":"src/framework/components/sprite/sprite-animation-clip.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"e044e66a3ab9a82dfc07ab2deac9afe1e8d3af2c62ec8a21b3c405446fb62428"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptRegistry.add (cognitive 31): ScriptRegistry.add has cognitive complexity 31 (threshold 15). Drivers by points: if/else 13 (22 pts), loops 4 (6 pts), boolean chains 3 (nesting depth added 11). Most of this is not in the body itself: 3 of the 31 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 159, 134). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/script/script-registry.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"036e7560767811accd6dd6e397c1f6c1e22230bae6ae6406e69f950ab52a6c97"}},{"ruleId":"D2","level":"warning","message":{"text":"ShadowRenderer.submitCasters (cognitive 31): ShadowRenderer.submitCasters has cognitive complexity 31 (threshold 15). Drivers by points: if/else 12 (26 pts), ternaries 2 (3 pts), boolean chains 1, loops 1 (nesting depth added 15). Of this number, 23 points are the body\u0027s own statements and 8 belong 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":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"d668966203fc545b72cdc1371fd45da810e54af0cb9afd2c37b837f78a3a3043"}},{"ruleId":"D2","level":"warning","message":{"text":"attachTexture (cognitive 31): attachTexture has cognitive complexity 31 (threshold 15). Drivers by points: if/else 9 (22 pts), boolean chains 6, other 3 (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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ca4d04137f63882d737837b444136c369784d4a7ec80e3e0c4a138b717d207f"}},{"ruleId":"D2","level":"warning","message":{"text":"ShaderGeneratorStandard._addMapDefines (cognitive 30): ShaderGeneratorStandard._addMapDefines has cognitive complexity 30 (threshold 15). Drivers by points: if/else 15 (26 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 13). Of this number, 23 points are the body\u0027s own statements and 7 belong 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":"src/scene/shader-lib/programs/standard.js"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"589e84cff73a904393cfb792a65978c120f8ab3ec50911d0798a141f5cbd0101"}},{"ruleId":"D2","level":"warning","message":{"text":"Renderer.setCameraUniforms (cognitive 30): Renderer.setCameraUniforms has cognitive complexity 30 (threshold 15). Drivers by points: ternaries 11 (17 pts), if/else 7 (12 pts), boolean chains 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":"src/scene/renderer/renderer.js"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"620d09863d88af58965f1c44c2889dc3f2590f34d0d01b0e30baf489c0e242a5"}},{"ruleId":"D2","level":"warning","message":{"text":"GltfAccessor.getData (cognitive 30): GltfAccessor.getData has cognitive complexity 30 (threshold 15). Drivers by points: loops 4 (14 pts), if/else 9 (13 pts), boolean chains 3 (nesting depth added 14). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/gltf-accessor.js"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"d824cf8058d7db37e431bca694e3ff6015519da57ad6b189d6169d8061c8dcd3"}},{"ruleId":"D2","level":"warning","message":{"text":"XrHand.update (cognitive 30): XrHand.update has cognitive complexity 30 (threshold 15). Drivers by points: if/else 12 (26 pts), boolean chains 3, loops 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":"src/framework/xr/xr-hand.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"537048defd9ee6dd669586779a9eaecb10dbea5f7d585fb4f722d59f48b67741"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementInput._onElementSelectEvent (cognitive 30): ElementInput._onElementSelectEvent has cognitive complexity 30 (threshold 15). Drivers by points: if/else 15 (23 pts), boolean chains 5, loops 1 (2 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":"src/framework/input/element-input.js"},"region":{"startLine":837}}}],"partialFingerprints":{"codehealthFindingId/v1":"9351a7fbf8776e7c7383446c128dcee639b889108afdd7639967a4f284a57a68"}},{"ruleId":"D2","level":"warning","message":{"text":"_validateCopy (cognitive 30): _validateCopy has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (12 pts), other 9, boolean chains 7, ternaries 2 (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":"src/platform/graphics/texture.js"},"region":{"startLine":1482}}}],"partialFingerprints":{"codehealthFindingId/v1":"de301ea5fd8cb35e53ee384558fce04730aa51cd5ef7f8c73495bccb6149fca4"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor::read (cognitive 30): constructor::read has cognitive complexity 30 (threshold 15). Drivers by points: if/else 11 (14 pts), loops 4 (14 pts), match/switch 1 (2 pts) (nesting depth added 14). 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":"src/scene/gsplat/gsplat-sog-data.js"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"96bd20af974eda20231c3c224423fdec58860dabefd7baa76434c33c9b241478"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatMesh.buildFromEntity (cognitive 29): GSplatMesh.buildFromEntity has cognitive complexity 29 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 5 (11 pts) (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":"scripts/esm/gsplat/gsplat-mesh.mjs"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ee94eab5358001df23943510a49f2b2829e6958f5741f7a696e0d420c996cc"}},{"ruleId":"D2","level":"warning","message":{"text":"Tags._processArguments (cognitive 29): Tags._processArguments has cognitive complexity 29 (threshold 15). Drivers by points: if/else 10 (23 pts), loops 2 (4 pts), boolean chains 2 (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":"src/core/tags.js"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef5ce5189b7f9c2076ec4e2c88bcbd4f19a260e1b6e5132ebb67dc3bdfc833a4"}},{"ruleId":"D2","level":"warning","message":{"text":"markup.resolveMarkupTags (cognitive 29): markup.resolveMarkupTags has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (19 pts), loops 6 (7 pts), ternaries 1 (3 pts) (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":"src/framework/components/element/markup.js"},"region":{"startLine":376}}}],"partialFingerprints":{"codehealthFindingId/v1":"9646cfe3d11ad553f1c907543e2830b06a4fad52d741daa6ec69a8ad4fa7501b"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelComponent.mapping (cognitive 29): ModelComponent.mapping has cognitive complexity 29 (threshold 15). Drivers by points: if/else 12 (24 pts), boolean chains 2, ternaries 2, loops 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":"src/framework/components/model/component.js"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"a013595cc0c6c65b35b5a4609906e2e380c3ad95f4261f189ce817ce06f4d7da"}},{"ruleId":"D2","level":"warning","message":{"text":"texture._completePartialMipmapChain (cognitive 29): texture._completePartialMipmapChain has cognitive complexity 29 (threshold 15). Drivers by points: loops 7 (19 pts), boolean chains 6, if/else 3 (4 pts) (nesting depth added 13). Most of this is not in the body itself: 10 of the 29 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 121, 105). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/texture.js"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"53766b2083e1916a708a9e748ad6b57b2a00279b843b800a02972ea3facba88a"}},{"ruleId":"D2","level":"warning","message":{"text":"AppBase._parseApplicationProperties (cognitive 29): AppBase._parseApplicationProperties has cognitive complexity 29 (threshold 15). Drivers by points: if/else 14 (19 pts), loops 3 (7 pts), boolean chains 3 (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":"src/framework/app-base.js"},"region":{"startLine":858}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7c7309adba0cab8c3e6a3f13e451d7f95cfe1f85b31d34b650deeffcea4128a"}},{"ruleId":"D2","level":"warning","message":{"text":"_setupLight (cognitive 29): _setupLight has cognitive complexity 29 (threshold 15). Drivers by points: ternaries 11 (16 pts), if/else 6 (7 pts), boolean chains 4, other 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":"src/extras/render-passes/frame-pass-volumetric-fog.js"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"7eb39682f6b2d51a2aeb26e2bf489fa2181783a3bd7ad2d61293675194a80c52"}},{"ruleId":"D2","level":"warning","message":{"text":"play (cognitive 29): play has cognitive complexity 29 (threshold 15). Drivers by points: if/else 11 (19 pts), loops 1 (4 pts), boolean chains 3, ternaries 1 (3 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/animation/component.js"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"06f1ef6444d1f9daadc4aeb3f7672f340363d6bcbc286859dd6911fa386d2710"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatWorld.applyWorkBufferUpdates (cognitive 28): GSplatWorld.applyWorkBufferUpdates has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (18 pts), loops 2 (6 pts), boolean chains 4 (nesting depth added 11). Most of this is not in the body itself: 4 of the 28 points are its own statements and the rest belongs to one function literal inside it that branches (line 969). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":956}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5d96f56a6257140a8cdc823ea2bb95abcebefbf652b9f7bfd055506895a2b4b"}},{"ruleId":"D2","level":"warning","message":{"text":"khr-gaussian-splatting.createGSplatData (cognitive 28): khr-gaussian-splatting.createGSplatData has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (15 pts), loops 5 (10 pts), boolean chains 3 (nesting depth added 11). Of this number, 22 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-gaussian-splatting.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0a4bf6436e8aba9e59c253aaab463caac4be18a1ddac230bd8cbef02de94c3a"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelComponent.onEnable (cognitive 28): ModelComponent.onEnable has cognitive complexity 28 (threshold 15). Drivers by points: if/else 11 (21 pts), boolean chains 4, loops 1 (3 pts) (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":"src/framework/components/model/component.js"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"79afa34f36cbb8d721bf7cc6174b8de336ee165ca9d580fe47df1315b9c542bc"}},{"ruleId":"D2","level":"warning","message":{"text":"ParticleSystemComponentSystem.initializeComponentData (cognitive 28): ParticleSystemComponentSystem.initializeComponentData has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13 (23 pts), boolean chains 3, loops 2 (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":"src/framework/components/particle-system/system.js"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"f032ae5a5c8a3bf533d7c450ca568d060338aaf2b032a387deeab9878c77adf2"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchManager.collectBatchedMeshData (cognitive 28): BatchManager.collectBatchedMeshData has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (22 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 18). 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":597}}}],"partialFingerprints":{"codehealthFindingId/v1":"52c9eb4ef5a8f59053f475f0a68d04a73ee23bd1edcea2695b086ea6a5c9eb53"}},{"ruleId":"D2","level":"warning","message":{"text":"glb-parser.createCameras (cognitive 28): glb-parser.createCameras has cognitive complexity 28 (threshold 15). Drivers by points: if/else 7 (23 pts), ternaries 1 (4 pts), boolean chains 1 (nesting depth added 19). Most of this is not in the body itself: 2 of the 28 points are its own statements and the rest belongs to one function literal inside it that branches (line 1200). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1190}}}],"partialFingerprints":{"codehealthFindingId/v1":"b49e229f3160c7cda43b7f209cec56c394a288a5c7f50bcee137de6195222079"}},{"ruleId":"D2","level":"warning","message":{"text":"basis.prepareWorkerModules (cognitive 28): basis.prepareWorkerModules has cognitive complexity 28 (threshold 15). Drivers by points: if/else 16 (25 pts), boolean chains 2, error handling 1 (nesting depth added 9). Most of this is not in the body itself: 6 of the 28 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 35, 68, 86, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff414f37437c47b9f295a723d454fb6167af9a7fe218a7b7b8f8ca4b27e6a04f"}},{"ruleId":"D2","level":"warning","message":{"text":"MiniStats.postRender (cognitive 28): MiniStats.postRender has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 3 (9 pts), boolean chains 4, ternaries 1 (3 pts) (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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":959}}}],"partialFingerprints":{"codehealthFindingId/v1":"88fb94d4d3f02cfccd7d272ad9b210e5616853b509134595f534919ec86b48b2"}},{"ruleId":"D2","level":"warning","message":{"text":"TextureRenderer.draw (cognitive 28): TextureRenderer.draw has cognitive complexity 28 (threshold 15). Drivers by points: boolean chains 12, ternaries 6 (10 pts), if/else 5 (6 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":"src/extras/renderers/texture-renderer.js"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc0b02afcb97a247424d43fb91225fbe529c94c753a9bdae0797da8808afadaf"}},{"ruleId":"D2","level":"warning","message":{"text":"RenderPassPicker.execute (cognitive 28): RenderPassPicker.execute has cognitive complexity 28 (threshold 15). Drivers by points: if/else 6 (15 pts), ternaries 3 (7 pts), loops 3 (6 pts) (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":"src/framework/graphics/render-pass-picker.js"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c8e91d542cc05d06367f133ea1139380dee5f8e7f6d4308289b5385cb20a7ba"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 28): update has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 2 (4 pts), ternaries 2 (4 pts), boolean chains 3, other 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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a4cda3ed75bda3246deb3b74ec006cde75c1f6f144d76705b5b43efe0371336"}},{"ruleId":"D2","level":"warning","message":{"text":"BasisWorker::transcodeBasis (cognitive 28): BasisWorker::transcodeBasis has cognitive complexity 28 (threshold 15). Drivers by points: if/else 9 (13 pts), ternaries 3 (7 pts), boolean chains 5, loops 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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b3ace4ac8f3a853bd6ded546cbc164d272fce43a841d131c6352829c2e9379f"}},{"ruleId":"D2","level":"warning","message":{"text":"Water._frameUpdate (cognitive 27): Water._frameUpdate has cognitive complexity 27 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 9, ternaries 3 (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."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/water.mjs"},"region":{"startLine":1607}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f49fc3169c0c42966cc0fc73102885e8c84fb196b3864309b84fb9c71c82b2"}},{"ruleId":"D2","level":"warning","message":{"text":"BlockAllocator._defragIncremental (cognitive 27): BlockAllocator._defragIncremental has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 5, loops 3 (4 pts) (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":"src/core/block-allocator.js"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b4e65fbec240d65677510158149ca801e091d9a2735c1bc8b54973491519e1d"}},{"ruleId":"D2","level":"warning","message":{"text":"LightSlotUniforms.appendFormats (cognitive 27): LightSlotUniforms.appendFormats has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15 (27 pts) (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":"src/scene/lighting/light-slot-uniforms.js"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab15956df07d589c770a37730193730d0d4726d9b7dcfc60da67df25a9d8a8d8"}},{"ruleId":"D2","level":"warning","message":{"text":"SkinInstanceCache.removeCachedSkinInstance (cognitive 27): SkinInstanceCache.removeCachedSkinInstance has cognitive complexity 27 (threshold 15). Drivers by points: if/else 7 (27 pts) (nesting depth added 20). 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":"src/scene/skin-instance-cache.js"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb90320afb34f59d13419fdd67242094f808d430e03e6df8f92d3b65357bb2d6"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementInput._getTargetElement (cognitive 27): ElementInput._getTargetElement has cognitive complexity 27 (threshold 15). Drivers by points: if/else 9 (25 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":"src/framework/input/element-input.js"},"region":{"startLine":975}}}],"partialFingerprints":{"codehealthFindingId/v1":"807e6efce441997428892b2ebecce263dcf605acb348b5a95683c9850bed812d"}},{"ruleId":"D2","level":"warning","message":{"text":"JsonStandardMaterialParser.initialize (cognitive 27): JsonStandardMaterialParser.initialize has cognitive complexity 27 (threshold 15). Drivers by points: if/else 14 (22 pts), boolean chains 4, 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":"src/framework/parsers/material/json-standard-material.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"4be1d072dfbd97de4654cd4b513f95941abd6453a4c3e8d09205b9f19b649474"}},{"ruleId":"D2","level":"warning","message":{"text":"Asset.file (cognitive 27): Asset.file has cognitive complexity 27 (threshold 15). Drivers by points: if/else 6 (17 pts), boolean chains 6, loops 1 (3 pts), ternaries 1 (nesting depth added 13). 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":"src/framework/asset/asset.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"551a060eaf2bbccadf59c7ba9433980faadd955c7ee19a5a0545d6fadaec8e67"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimClip._update (cognitive 26): AnimClip._update has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (23 pts), boolean chains 3 (nesting depth added 12). 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":"src/framework/anim/evaluator/anim-clip.js"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"688b6b6a78f6e707ffe8eb895df1e8a3c62eff559f4d63acd6358c3889857613"}},{"ruleId":"D2","level":"warning","message":{"text":"LightTextureAtlas.update (cognitive 26): LightTextureAtlas.update has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 4 (9 pts), boolean chains 3 (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":"src/scene/lighting/light-texture-atlas.js"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"d955e7e6911cee011068468382eeca009b907f0e64361b623a2fa811a630c9bc"}},{"ruleId":"D2","level":"warning","message":{"text":"Renderer.collectLights (cognitive 26): Renderer.collectLights has cognitive complexity 26 (threshold 15). Drivers by points: if/else 5 (21 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 18). 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":"src/scene/renderer/renderer.js"},"region":{"startLine":1238}}}],"partialFingerprints":{"codehealthFindingId/v1":"da76ae452f8a8c87a9ba613fc0d73ee38fde1be35471da322e578da23669a615"}},{"ruleId":"D2","level":"warning","message":{"text":"TextElement.font (cognitive 26): TextElement.font has cognitive complexity 26 (threshold 15). Drivers by points: if/else 14 (23 pts), loops 3 (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":"src/framework/components/element/text-element.js"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"367f3c875a52fe537f0cc71699d2cc700716b9d330b39d9d0f4024bb53b0cc7e"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateMesh (cognitive 26): _updateMesh has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (16 pts), boolean chains 8, ternaries 1 (2 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":"src/framework/components/element/image-element.js"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"1614afcd3e1a0155df03bbb82f54adb91262cca4244540d6508fdcc44b1682a1"}},{"ruleId":"D2","level":"warning","message":{"text":"evaluateNodeDistances (cognitive 26): evaluateNodeDistances has cognitive complexity 26 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 2 (3 pts), boolean chains 2, loops 1, other 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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":503}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3edc07f7d0bd98d743db6b6cd06e3b0afcd7111aba1cf2416246583c99549d"}},{"ruleId":"D2","level":"warning","message":{"text":"collectDirectionalShadowLights (cognitive 26): collectDirectionalShadowLights has cognitive complexity 26 (threshold 15). Drivers by points: if/else 4 (15 pts), loops 3 (9 pts), boolean chains 1, other 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":"src/scene/renderer/culler.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"1827655bc015a54b511ee1a55825fc8433f5438340c8de66aa7738e515a17915"}},{"ruleId":"D2","level":"warning","message":{"text":"BasisWorker::transcodeKTX2 (cognitive 26): BasisWorker::transcodeKTX2 has cognitive complexity 26 (threshold 15). Drivers by points: if/else 9 (11 pts), loops 3 (6 pts), ternaries 2 (5 pts), boolean chains 4 (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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a71faab2cdca13af819e0269592553f3f7c16de9455d7ec4f4b6e51d1fd69e9"}},{"ruleId":"D2","level":"warning","message":{"text":"tween.Tween.initialize (cognitive 25): tween.Tween.initialize has cognitive complexity 25 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 5, boolean chains 2 (nesting depth added 10). Most of this is not in the body itself: 6 of the 25 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 149, 160, 170). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/animation/tween.js"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"016ccc36564bc4b0a22029e1549ec49e3392c1d91760a753f19b51b96b56316d"}},{"ruleId":"D2","level":"warning","message":{"text":"XrControllers.update (cognitive 25): XrControllers.update has cognitive complexity 25 (threshold 15). Drivers by points: if/else 9 (18 pts), loops 2 (4 pts), boolean chains 3 (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":"scripts/esm/xr/xr-controllers.mjs"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"d000b7aeb0bdbad9147121a25dc4fe01f9130d8407255d9d8eaa2996e4a7c686"}},{"ruleId":"D2","level":"warning","message":{"text":"XrNavigation.update (cognitive 25): XrNavigation.update has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 3, 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":"scripts/esm/xr/xr-navigation.mjs"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6b5ef1fe10347c14523e8915b0833ec85013b7b19a9fd9311215ef08e231da"}},{"ruleId":"D2","level":"warning","message":{"text":"BundleRegistry._onAssetRemove (cognitive 25): BundleRegistry._onAssetRemove has cognitive complexity 25 (threshold 15). Drivers by points: if/else 7 (17 pts), loops 3 (8 pts) (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":"src/framework/bundle/bundle-registry.js"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d69a45ad1c8d86bc5bd756cbc9b333c7d1144a233b40684119e5d8e96c432de"}},{"ruleId":"D2","level":"warning","message":{"text":"ply.readPly (cognitive 25): ply.readPly has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (16 pts), loops 4 (5 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 8). Most of this is not in the body itself: 7 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 459, 483, 544, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/ply.js"},"region":{"startLine":450}}}],"partialFingerprints":{"codehealthFindingId/v1":"639e7b32913a8881e11d2d4b115f882a0bf95471a694147abd22be98754eb673"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglShader.finalize (cognitive 25): WebglShader.finalize has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (18 pts), ternaries 2 (4 pts), loops 3 (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":"src/platform/graphics/webgl/webgl-shader.js"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3da0b4d9d41f237bcca28c60c124f6fdfdc6a8066a5ad0e8011e1ddfaa1a761"}},{"ruleId":"D2","level":"warning","message":{"text":"Lightmapper.calculateLightmapSize (cognitive 25): Lightmapper.calculateLightmapSize has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (21 pts), boolean chains 4 (nesting depth added 11). 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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":407}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b82dd32ba1b72c20c0d9028a77f4f23aafb1493463e99ece60405c4ad69a3f2"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementInput._onElementMouseEvent (cognitive 25): ElementInput._onElementMouseEvent has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 4, 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":"src/framework/input/element-input.js"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea8a68f54cb3753bad00e97e5c05074d5a3fa6e61e7ee5bb1f0f385710be30f4"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelHandler.patch (cognitive 25): ModelHandler.patch has cognitive complexity 25 (threshold 15). Drivers by points: if/else 14 (25 pts) (nesting depth added 11). Most of this is not in the body itself: 1 of the 25 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 45, 47, 55). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/model.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0f1c7738f725addad60615245719e49f69abf68207acfa5a35faf065bbd1e7b"}},{"ruleId":"D2","level":"warning","message":{"text":"WebgpuGraphicsDevice.endRenderPass (cognitive 25): WebgpuGraphicsDevice.endRenderPass has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (13 pts), ternaries 2 (8 pts), boolean chains 3, loops 1 (nesting depth added 13). 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":1667}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ceb7c103dcffa6213632c45d100bd42364196fda2f52cbf66ec4b294be24bf7"}},{"ruleId":"D2","level":"warning","message":{"text":"material (cognitive 25): material has cognitive complexity 25 (threshold 15). Drivers by points: if/else 10 (16 pts), ternaries 2 (6 pts), boolean chains 3 (nesting depth added 10). Of this number, 19 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/image-element.js"},"region":{"startLine":1052}}}],"partialFingerprints":{"codehealthFindingId/v1":"6232831a485318a770282b6711afea093fb9a6c1e7f5270a6ccf44f649bdc4c6"}},{"ruleId":"D2","level":"warning","message":{"text":"processAttributes (cognitive 25): processAttributes has cognitive complexity 25 (threshold 15). Drivers by points: if/else 6 (13 pts), ternaries 2 (10 pts), boolean chains 2 (nesting depth added 15). Most of this is not in the body itself: 0 of the 25 points are its own statements and the rest belongs to one function literal inside it that branches (line 452). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-processor-glsl.js"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce39a7147215b44cf0222f5075183c13d0cece0c85760476e8cdcf764ff72b1a"}},{"ruleId":"D2","level":"warning","message":{"text":"createDefinition (cognitive 25): createDefinition has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 7, if/else 6 (7 pts), other 5, loops 2 (4 pts), ternaries 2 (nesting depth added 3). Most of this is not in the body itself: 10 of the 25 points are its own statements and the rest belongs to 3 function items inside it that branch (getDefines, getDefinesWgsl, normalizedOutputTypes). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-definition-utils.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e5678196486ca0ed9e9a2448fc5ee31194ac69de0e4a92b4df4f950cce046e"}},{"ruleId":"D2","level":"warning","message":{"text":"orbit-camera.OrbitCamera._buildAabb (cognitive 24): orbit-camera.OrbitCamera._buildAabb has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 7 (9 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":"scripts/camera/orbit-camera.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"66cc0487ee3380846ada6ae946bf7d53ca944a684d8da27b1bb1e882fba53538"}},{"ruleId":"D2","level":"warning","message":{"text":"VertexFormat.constructor (cognitive 24): VertexFormat.constructor has cognitive complexity 24 (threshold 15). Drivers by points: ternaries 5 (12 pts), if/else 7 (10 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":"src/platform/graphics/vertex-format.js"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b0156041a6cb06eda477f87aab0ee9212eb08091790d3d7903538a3599bc50a"}},{"ruleId":"D2","level":"warning","message":{"text":"Culler.cullLights (cognitive 24): Culler.cullLights has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (22 pts), boolean chains 1, loops 1 (nesting depth added 15). 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":"src/scene/renderer/culler.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"7005eaa310077f5ab266b98cb92e88ff43598b26be4fb853b5ad62398fbee2cd"}},{"ruleId":"D2","level":"warning","message":{"text":"Parser._parseTag (cognitive 24): Parser._parseTag has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (18 pts), loops 2 (3 pts), match/switch 1 (2 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":"src/framework/components/element/markup.js"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"84a842a5ff53295f77506167c588c690e4b0ffa46eb8b9af883999ac935e97d2"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelComponent.castShadows (cognitive 24): ModelComponent.castShadows has cognitive complexity 24 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 3 (8 pts), boolean chains 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":"src/framework/components/model/component.js"},"region":{"startLine":466}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a6c737fda527a19f6d8cd35e6940f8871e7bf234022775f365215be4748377f"}},{"ruleId":"D2","level":"warning","message":{"text":"ShaderProcessorGLSL.processUniforms (cognitive 24): ShaderProcessorGLSL.processUniforms has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16 (22 pts), ternaries 2 (nesting depth added 6). Most of this is not in the body itself: 5 of the 24 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 336, 296, 306, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-processor-glsl.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"05f113ffdc59a7494d58b8658394caf5ecc2f512c50b6b3ec02e3d198bcf9ea0"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.createVertexArray (cognitive 24): WebglGraphicsDevice.createVertexArray has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (19 pts), loops 2 (5 pts) (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1993}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d7fd02a87b2f503a8513fe6fb05605523248c5f3b4dfed8e7c2bd893ac81c28"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.setDepthState (cognitive 24): WebglGraphicsDevice.setDepthState has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (22 pts), boolean chains 2 (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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":3047}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb70efdce4e127086b9348e78ffd7474204bf2d9afa64e2d81447bd3e121670b"}},{"ruleId":"D2","level":"warning","message":{"text":"Controller.isPressed (cognitive 24): Controller.isPressed has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (5 pts), boolean chains 2, match/switch 1 (2 pts) (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. This shape REPEATS in the file: one other method here (Controller.wasPressed) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/input/controller.js"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e5c90b8105eece21af7829c82b564d97f22cea52a8bb13eed564cb89963c6d0"}},{"ruleId":"D2","level":"warning","message":{"text":"Controller.wasPressed (cognitive 24): Controller.wasPressed has cognitive complexity 24 (threshold 15). Drivers by points: if/else 5 (15 pts), loops 2 (5 pts), boolean chains 2, match/switch 1 (2 pts) (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. This shape REPEATS in the file: one other method here (Controller.isPressed) has the same decision points, in the same order, at the same nesting depths \u2014 so this is one pattern written twice rather than two separate problems. Splitting this body alone leaves the other exactly as it is. Where these are variations on one operation, the change that clears both is the shared one: lift the common shape into a single routine the variants call, parameterised by whatever genuinely differs between them, and keep in each method only the part that is not shared."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/input/controller.js"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"98cac30506ab41a37abc13859c6b0d0da4af38bedb89f59b46165fda1cda1092"}},{"ruleId":"D2","level":"warning","message":{"text":"onEnable (cognitive 24): onEnable has cognitive complexity 24 (threshold 15). Drivers by points: if/else 11 (20 pts), boolean chains 3, 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":"src/framework/components/particle-system/component.js"},"region":{"startLine":2140}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1d0e3b53d4be2ed75e6d61cca34cafcc475c63a2969a6199873e39fab9b3df5"}},{"ruleId":"D2","level":"warning","message":{"text":"addTime (cognitive 24): addTime has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (16 pts), ternaries 4 (7 pts), boolean chains 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":1027}}}],"partialFingerprints":{"codehealthFindingId/v1":"767bac61b84b7e3df2835382c7061662ab2035f7b7ba086836e18099e4ca40ef"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 24): constructor has cognitive complexity 24 (threshold 15). Drivers by points: if/else 7 (8 pts), boolean chains 6, other 5, ternaries 2 (4 pts), loops 1 (nesting depth added 3). Most of this is not in the body itself: 8 of the 24 points are its own statements and the rest belongs to 9 function literals inside it that branch (lines 207, 221, 201, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac1fcde7ffe7e97bd81989295d757a8367e19f6ea8d760f81300bc7baba06fe1"}},{"ruleId":"D2","level":"warning","message":{"text":"initGraphs (cognitive 24): initGraphs has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (12 pts), ternaries 2 (7 pts), loops 3, boolean chains 1, other 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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"6132bec2a39d085a82ca2b98269300893a9b317b12450d560f64c3698ec2ecd2"}},{"ruleId":"D2","level":"warning","message":{"text":"initDepthStencil (cognitive 24): initDepthStencil has cognitive complexity 24 (threshold 15). Drivers by points: if/else 10 (18 pts), ternaries 1 (5 pts), boolean chains 1 (nesting depth added 12). 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":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":315}}}],"partialFingerprints":{"codehealthFindingId/v1":"d85bc307c6045a3c228573c7719c9412d1f3a9adc72500364f53893202311075"}},{"ruleId":"D2","level":"warning","message":{"text":"_findTransition (cognitive 24): _findTransition has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 3, match/switch 1 (3 pts) (nesting depth added 8). Of this number, 12 points are the body\u0027s own statements and 12 belong 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a16a1165a8d1c652fa49fdfb843feede4e28a4b834268d4b1b29aa5309609b0"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateEnvOptions (cognitive 24): _updateEnvOptions has cognitive complexity 24 (threshold 15). Drivers by points: if/else 12 (13 pts), boolean chains 7, ternaries 3 (4 pts) (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":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1d642eab9e3fddefb17ac5a13481e9940635cb1105d1bb3b83e5c69e8030e02"}},{"ruleId":"D2","level":"warning","message":{"text":"renderLayerRenderStep (cognitive 24): renderLayerRenderStep has cognitive complexity 24 (threshold 15). Drivers by points: if/else 9 (17 pts), boolean chains 3, other 2, ternaries 2 (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 3 belong 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":"src/scene/renderer/render-pass-forward.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"70e8be2237eac97e58014ebf01bc333f7597741233baf64265ef8e1e81821229"}},{"ruleId":"D2","level":"warning","message":{"text":"load (cognitive 24): load has cognitive complexity 24 (threshold 15). Drivers by points: if/else 14 (18 pts), error handling 2, loops 2, other 1, ternaries 1 (nesting depth added 4). Of this number, 20 points are the body\u0027s own statements and 4 belong to 12 function literals inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, 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":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b806e219da36be52de4fae0b16a74860594c4260eefc63177deb9b85c9fbd8"}},{"ruleId":"D2","level":"warning","message":{"text":"gsplat-mesh.rasterizeTriangle (cognitive 23): gsplat-mesh.rasterizeTriangle has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 7 (10 pts), if/else 7 (9 pts), loops 2 (4 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":"scripts/esm/gsplat/gsplat-mesh.mjs"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"97203dda3084a6e2619227b15958a83f7b8fdea455c4ede0fdc68d4a9e8956a1"}},{"ruleId":"D2","level":"warning","message":{"text":"vat-converter.sampleAnimations (cognitive 23): vat-converter.sampleAnimations has cognitive complexity 23 (threshold 15). Drivers by points: loops 8 (15 pts), if/else 3 (6 pts), boolean chains 1, ternaries 1 (nesting depth added 10). Most of this is not in the body itself: 10 of the 23 points are its own statements and the rest belongs to one function literal inside it that branches (line 231). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/vat/vat-converter.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"14972f6d4120f1be57b5ebb7d33e7445e066e7294309a5c32bdaf5e5a34d64a2"}},{"ruleId":"D2","level":"warning","message":{"text":"XrMenu._checkFingerTouch (cognitive 23): XrMenu._checkFingerTouch has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 4, loops 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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1333}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a24b324d341a920e4907bac563f256f1c9e8f63acf2e640dfcd07923d254d97"}},{"ruleId":"D2","level":"warning","message":{"text":"XrMenu.update (cognitive 23): XrMenu.update has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12 (17 pts), boolean chains 2, loops 1 (2 pts), ternaries 1 (2 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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"4716ba4f5694b78dcdd1ac517e289f1398bfcd34d9b1bd07daf84f9898576f4b"}},{"ruleId":"D2","level":"warning","message":{"text":"StandardMaterialMapTransforms.collectUnapplied (cognitive 23): StandardMaterialMapTransforms.collectUnapplied has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (16 pts), boolean chains 4, ternaries 1 (2 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":"src/scene/materials/standard-material-map-transforms.js"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"1285e159d198ac4b0606bff4dade14ed32f6dc5ab5dd4405c9fafd6670dc09cf"}},{"ruleId":"D2","level":"warning","message":{"text":"VertexIterator.writeData (cognitive 23): VertexIterator.writeData has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 2 (8 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/vertex-iterator.js"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"07084f191d47d7944ebcd021f1c4333a15f0b3572def080cefcf6496fbc8ee87"}},{"ruleId":"D2","level":"warning","message":{"text":"VertexIterator.readData (cognitive 23): VertexIterator.readData has cognitive complexity 23 (threshold 15). Drivers by points: if/else 6 (11 pts), loops 2 (7 pts), ternaries 1 (4 pts), boolean chains 1 (nesting depth added 13). 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":"src/platform/graphics/vertex-iterator.js"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"eec4e5750884950dbc4622756774a84234a815f1985344a9415c6943afd04b65"}},{"ruleId":"D2","level":"warning","message":{"text":"Morph._initTextureBased (cognitive 23): Morph._initTextureBased has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (11 pts), loops 4 (8 pts), ternaries 2 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/morph.js"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"750a5ce99c82d89b6a5138544f11c452ee5e894be14eb88782bd7425e23b4dc4"}},{"ruleId":"D2","level":"warning","message":{"text":"Renderer.updateShaders (cognitive 23): Renderer.updateShaders has cognitive complexity 23 (threshold 15). Drivers by points: if/else 5 (20 pts), boolean chains 2, loops 1 (nesting depth added 15). 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":"src/scene/renderer/renderer.js"},"region":{"startLine":1304}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c5028096b651597639362aea532abafd65c7b490bd237e192aae91e5d6586fe"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.activateShader (cognitive 23): WebglGraphicsDevice.activateShader has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (23 pts) (nesting depth added 13). 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":3152}}}],"partialFingerprints":{"codehealthFindingId/v1":"99713b4b610ccac2759853f9ffe3655d6701d3a694cf99437e3e018ae468b172"}},{"ruleId":"D2","level":"warning","message":{"text":"SpriteComponent._showFrame (cognitive 23): SpriteComponent._showFrame has cognitive complexity 23 (threshold 15). Drivers by points: if/else 16 (19 pts), boolean chains 4 (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":"src/framework/components/sprite/component.js"},"region":{"startLine":881}}}],"partialFingerprints":{"codehealthFindingId/v1":"164021395aee13384339491b2bf1224813fa31bfca7ae680c6005a423942e3fe"}},{"ruleId":"D2","level":"warning","message":{"text":"generateWireframe (cognitive 23): generateWireframe has cognitive complexity 23 (threshold 15). Drivers by points: ternaries 3 (8 pts), loops 3 (7 pts), if/else 3 (6 pts), boolean chains 2 (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":"src/scene/mesh.js"},"region":{"startLine":1102}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc22e7e66928d2a5c84a0be171b76b80b9efd0ca5f43fa39515107783c1cd80f"}},{"ruleId":"D2","level":"warning","message":{"text":"createPrimitive (cognitive 23): createPrimitive has cognitive complexity 23 (threshold 15). Drivers by points: if/else 11 (19 pts), ternaries 2, boolean chains 1, other 1 (nesting depth added 8). Most of this is not in the body itself: 3 of the 23 points are its own statements and the rest belongs to 7 function literals inside it that branch (lines 767, 778, 777, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":757}}}],"partialFingerprints":{"codehealthFindingId/v1":"a02359e60789465311ba85d5a90024a9f36aa7e19406440f02242690aa1bf4fa"}},{"ruleId":"D2","level":"warning","message":{"text":"collectAttributes (cognitive 23): collectAttributes has cognitive complexity 23 (threshold 15). Drivers by points: if/else 8 (18 pts), ternaries 1 (3 pts), boolean chains 1, loops 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":"src/platform/graphics/shader-definition-utils.js"},"region":{"startLine":340}}}],"partialFingerprints":{"codehealthFindingId/v1":"87915dda07a67895d173ed25b780cf13a6924c460e3eb2c2f314308c66530ca1"}},{"ruleId":"D2","level":"warning","message":{"text":"updateClusters (cognitive 23): updateClusters has cognitive complexity 23 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 4 (9 pts), ternaries 2 (4 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/lighting/world-clusters.js"},"region":{"startLine":369}}}],"partialFingerprints":{"codehealthFindingId/v1":"920a731d8e3cbc5b8041dcf160719c37d32af013b6cb1690daa902607f1250e9"}},{"ruleId":"D2","level":"warning","message":{"text":"Frustum.add (cognitive 22): Frustum.add has cognitive complexity 22 (threshold 15). Drivers by points: loops 5 (12 pts), if/else 2 (10 pts) (nesting depth added 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/shape/frustum.js"},"region":{"startLine":245}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe878d07a4b278a0a26b1a024e75b8f51f216739ad8d30422277b321b941e047"}},{"ruleId":"D2","level":"warning","message":{"text":"ply.readCompressedPly (cognitive 22): ply.readCompressedPly has cognitive complexity 22 (threshold 15). Drivers by points: loops 6 (14 pts), if/else 4 (8 pts) (nesting depth added 12). Of this number, 17 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/ply.js"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c22abb3eddf2cb0364e6f88bce5ac593917c1450da2c71689d7fc40b4d1eb2b"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatProjector.dispatch (cognitive 22): GSplatProjector.dispatch has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (11 pts), boolean chains 5, loops 2 (3 pts), ternaries 3 (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":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"c07b765765fb29801a8fb3c38bea321b67e944f11209d472c80d33003fae930a"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatShadowRenderer._cullEntry (cognitive 22): GSplatShadowRenderer._cullEntry has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (10 pts), boolean chains 7, loops 2 (3 pts), ternaries 2 (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":"src/scene/gsplat-unified/gsplat-shadow-renderer.js"},"region":{"startLine":548}}}],"partialFingerprints":{"codehealthFindingId/v1":"d448fcf1a87345a45135abcbbbd78c1865dd5c528e8bccdf0a3438b74771a42d"}},{"ruleId":"D2","level":"warning","message":{"text":"Atlas.upload (cognitive 22): Atlas.upload has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 4 (10 pts) (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":"src/framework/font/canvas-font.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba3bc371de1a11089602dac4dcfcbb1aba98020c90d75615186702d6f677d772"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.setTextureParameters (cognitive 22): WebglGraphicsDevice.setTextureParameters has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12 (16 pts), boolean chains 4, ternaries 1 (2 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1865}}}],"partialFingerprints":{"codehealthFindingId/v1":"522c26da6f2ef614151495576030a55112f4a181c3af197576962d0f8387037e"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice.setBlendState (cognitive 22): WebglGraphicsDevice.setBlendState has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (15 pts), loops 1 (4 pts), boolean chains 3 (nesting depth added 12). Of this number, 19 points are the body\u0027s own statements and 3 belong to one function literal inside it that branches. 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2955}}}],"partialFingerprints":{"codehealthFindingId/v1":"c92759d7fbacc4585d418b36ac442d7a7a74fe4b9c45cd33a6008d11ba4e51b1"}},{"ruleId":"D2","level":"warning","message":{"text":"Lightmapper.renderShadowMap (cognitive 22): Lightmapper.renderShadowMap has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (14 pts), boolean chains 4, loops 1 (4 pts) (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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":832}}}],"partialFingerprints":{"codehealthFindingId/v1":"742ccbbe60f4719afaa5a0244ec03254302ac14b00211af19136f302b299614c"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchManager.generate (cognitive 22): BatchManager.generate has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 4 (6 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":"src/scene/batching/batch-manager.js"},"region":{"startLine":394}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c27618b8533b722468b5a40a13d2a5012c83942b2b07cbe75ebd72843d4110f"}},{"ruleId":"D2","level":"warning","message":{"text":"SpriteComponent.clips (cognitive 22): SpriteComponent.clips has cognitive complexity 22 (threshold 15). Drivers by points: if/else 8 (15 pts), loops 4 (6 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":"src/framework/components/sprite/component.js"},"region":{"startLine":459}}}],"partialFingerprints":{"codehealthFindingId/v1":"65bc0d12c1348193885c8fa93eebd8146c891ec03d5d7d640dcac8f2d56fd1e9"}},{"ruleId":"D2","level":"warning","message":{"text":"SpriteComponentSystem.initializeComponentData (cognitive 22): SpriteComponentSystem.initializeComponentData has cognitive complexity 22 (threshold 15). Drivers by points: if/else 17 (18 pts), boolean chains 2, loops 1 (2 pts) (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":"src/framework/components/sprite/system.js"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"66a5b01929f86a97c6ad3061a947cd0227e7fb6b19509bd3ae533bc9979750ea"}},{"ruleId":"D2","level":"warning","message":{"text":"glb-parser.createVertexBufferInternal (cognitive 22): glb-parser.createVertexBufferInternal has cognitive complexity 22 (threshold 15). Drivers by points: loops 5 (11 pts), if/else 6 (10 pts), boolean chains 1 (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"17039ad407acf468e027e1bb28a22915352117970807ecccf59eeba0e6c395d9"}},{"ruleId":"D2","level":"warning","message":{"text":"clear (cognitive 22): clear has cognitive complexity 22 (threshold 15). Drivers by points: if/else 7 (16 pts), other 4, 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2383}}}],"partialFingerprints":{"codehealthFindingId/v1":"f18ae3b53b3f971323a000d60239f09a2de4b7957afeac399177ac9139298400"}},{"ruleId":"D2","level":"warning","message":{"text":"_parseAssets (cognitive 22): _parseAssets has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 5 (8 pts), boolean chains 2, ternaries 1 (2 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":"src/framework/app-base.js"},"region":{"startLine":1001}}}],"partialFingerprints":{"codehealthFindingId/v1":"400b3c6e0487bcb9b6904a04e947e0a87fc68986ba389d568b55cddf1fcfdbd7"}},{"ruleId":"D2","level":"warning","message":{"text":"_createProjectorCompute (cognitive 22): _createProjectorCompute has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10 (11 pts), ternaries 7, other 3, boolean chains 1 (nesting depth added 1). Of this number, 19 points are the body\u0027s own statements and 3 belong to 12 function items inside it that branch. 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":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":403}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cc21c8894181b83436eeed3c1da27a37e0a703990fece53b86b026b51cbb46f"}},{"ruleId":"D2","level":"warning","message":{"text":"onEnable (cognitive 22): onEnable has cognitive complexity 22 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 8 (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":"src/framework/components/collision/component.js"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"8166c2f3e99b69e6c3a030d2c653a2dd86b3e3aca6f10735dbe4bc143820995d"}},{"ruleId":"D2","level":"warning","message":{"text":"cullMeshInstances (cognitive 22): cullMeshInstances has cognitive complexity 22 (threshold 15). Drivers by points: if/else 4 (14 pts), ternaries 2 (5 pts), boolean chains 2, loops 1 (nesting depth added 13). 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":"src/scene/renderer/culler.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f5df0062bce76cb507e2e36ce636268259f31f6ea0061914945add03cda5f1"}},{"ruleId":"D2","level":"warning","message":{"text":"get (cognitive 22): get has cognitive complexity 22 (threshold 15). Drivers by points: other 7, if/else 4 (6 pts), ternaries 6, loops 2 (3 pts) (nesting depth added 3). Of this number, 21 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"src/platform/graphics/webgpu/webgpu-render-pipeline.js"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e694a68f33f20f4fa75c4a015bb37c763c0818c0f5d7ed2db19cbeb5543c6dc"}},{"ruleId":"D2","level":"warning","message":{"text":"resolve (cognitive 22): resolve has cognitive complexity 22 (threshold 15). Drivers by points: if/else 6 (10 pts), ternaries 2 (6 pts), boolean chains 3, loops 1 (3 pts) (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":"src/platform/graphics/webgl/webgl-render-target.js"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8759520db03c34763c51657b33572d409ac780b66244c78f4c329ff0d833e1e"}},{"ruleId":"D2","level":"warning","message":{"text":"enable (cognitive 22): enable has cognitive complexity 22 (threshold 15). Drivers by points: if/else 5 (17 pts), loops 1 (4 pts), boolean chains 1 (nesting depth added 15). Most of this is not in the body itself: 2 of the 22 points are its own statements and the rest belongs to one function item inside it that branches (onPostprocessing). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/camera/post-effect-queue.js"},"region":{"startLine":282}}}],"partialFingerprints":{"codehealthFindingId/v1":"807a0db6b64026c01fb8f295b9b621582254d14221a1e320f540c449b471512e"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatFlipbook.getNextFrameNumberFromLast (cognitive 21): GSplatFlipbook.getNextFrameNumberFromLast has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (14 pts), ternaries 2 (4 pts), loops 1 (2 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":"scripts/esm/gsplat/gsplat-flipbook.mjs"},"region":{"startLine":322}}}],"partialFingerprints":{"codehealthFindingId/v1":"e030b8fddd21600ce1a29575090c7a96ebb8e558936b7f326e3795dcb1ab7e21"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatText._rebuildFromText (cognitive 21): GSplatText._rebuildFromText has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (16 pts), loops 3 (4 pts), ternaries 1 (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":"scripts/esm/gsplat/gsplat-text.mjs"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"dae404dafee77125b0f407ba6de741e4ad0039ac157884145d8215894526d439"}},{"ruleId":"D2","level":"warning","message":{"text":"BlockAllocator._findFreeBlock (cognitive 21): BlockAllocator._findFreeBlock has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (17 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 12). 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":"src/core/block-allocator.js"},"region":{"startLine":382}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6ac60e5da2df5075cf4b6e5c2a340683f65a73185a19a2d758f3c5ee4864a70"}},{"ruleId":"D2","level":"warning","message":{"text":"BoundingBox.computeMinMax (cognitive 21): BoundingBox.computeMinMax has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (19 pts), loops 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/shape/bounding-box.js"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"63c21e841a0f1d3af2eaef582423b50bf739a6a35c7c9351769ce7113d961622"}},{"ruleId":"D2","level":"warning","message":{"text":"LightSlotUniforms._dispatchDirectional (cognitive 21): LightSlotUniforms._dispatchDirectional has cognitive complexity 21 (threshold 15). Drivers by points: if/else 5 (9 pts), ternaries 2 (8 pts), loops 1 (3 pts), boolean chains 1 (nesting depth added 12). Of this number, 18 points are the body\u0027s own statements and 3 belong 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":"src/scene/lighting/light-slot-uniforms.js"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c034e2839a12e9a48aa91669f7e8fac5891dab86c985178694ab8aaabb17f8f"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatManager.update (cognitive 21): GSplatManager.update has cognitive complexity 21 (threshold 15). Drivers by points: if/else 13 (19 pts), boolean chains 1, ternaries 1 (nesting depth added 6). 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, 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":"src/scene/gsplat-unified/gsplat-manager.js"},"region":{"startLine":649}}}],"partialFingerprints":{"codehealthFindingId/v1":"8de4714a8a586e3246f4d0386855df1a7f5261c6a6f300d1540ee2c8758f50bf"}},{"ruleId":"D2","level":"warning","message":{"text":"RenderPassForward.updateClears (cognitive 21): RenderPassForward.updateClears has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 4 (11 pts), if/else 3 (4 pts), boolean chains 3, loops 1 (3 pts) (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":"src/scene/renderer/render-pass-forward.js"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3a368d585465c811e5be48481c798842d698543052f6074cfa27143b10dd827"}},{"ruleId":"D2","level":"warning","message":{"text":"CameraComponentSystem.initializeComponentData (cognitive 21): CameraComponentSystem.initializeComponentData has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (17 pts), match/switch 1 (3 pts), loops 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":"src/framework/components/camera/system.js"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7c5ee127149a2e1f74d05a9c04058ccda4259c611e1b0eb951a9edd43bc2ca6"}},{"ruleId":"D2","level":"warning","message":{"text":"RenderComponent.materialAssets (cognitive 21): RenderComponent.materialAssets has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 2 (3 pts), ternaries 1 (3 pts) (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":"src/framework/components/render/component.js"},"region":{"startLine":673}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a03b65154363a39b152c97d55811552b4eb9ba3e4904f2722759fc63237e13b"}},{"ruleId":"D2","level":"warning","message":{"text":"XrInputSource.update (cognitive 21): XrInputSource.update has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (20 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":"src/framework/xr/xr-input-source.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"1581d3c115a4b23ae238dcabf3a5e6ccd9bd1671a9f8d67facd0834352a7aab5"}},{"ruleId":"D2","level":"warning","message":{"text":"TextureHandler._getTextureOptions (cognitive 21): TextureHandler._getTextureOptions has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11 (21 pts) (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":"src/framework/handlers/texture.js"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa9b7c27f9a2ad9d84266092ef94accef971f89e805a317f14e40eaacce8b617"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimController._transitionHasConditionsMet (cognitive 21): AnimController._transitionHasConditionsMet has cognitive complexity 21 (threshold 15). Drivers by points: if/else 6 (18 pts), match/switch 1 (2 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":"src/framework/anim/controller/anim-controller.js"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d7886833bb33665cf0ffa71862b33f089d691cb2a17951a7d00ecb05723c5a6"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimationComponent.assets (cognitive 21): AnimationComponent.assets has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (13 pts), ternaries 2 (5 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 13). Of this number, 20 points are the body\u0027s own statements and 1 belongs to one function literal inside it that branches. 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":"src/framework/components/animation/component.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4ed3efca7c45303e616f5b87a5535606b176f6c687f9beb2e4c2a6f90ed1120"}},{"ruleId":"D2","level":"warning","message":{"text":"createNodes (cognitive 21): createNodes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (15 pts), loops 2 (4 pts), boolean chains 1, other 1 (nesting depth added 10). 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, 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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1120}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e98567972d1f1d2b816375009fc807ef7a6cefa3310c8a5cf8596725d8af3b0"}},{"ruleId":"D2","level":"warning","message":{"text":"loadBuffers (cognitive 21): loadBuffers has cognitive complexity 21 (threshold 15). Drivers by points: if/else 12 (15 pts), loops 1 (3 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 6). Most of this is not in the body itself: 2 of the 21 points are its own statements and the rest belongs to 8 function literals inside it that branch (lines 1606, 1583, 1592, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1574}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd6dfc9d8313ebe73c76a22530e3201e54ce0f17bb633606681f622bbed15ac5"}},{"ruleId":"D2","level":"warning","message":{"text":"buildResourceFormats (cognitive 21): buildResourceFormats has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (9 pts), ternaries 2 (6 pts), boolean chains 4, loops 1, other 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":"src/platform/graphics/webgpu/webgpu-shader-processor-wgsl.js"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"841f925e1e7f2bded90504ef78f8c6c90036c263c54c6c3130f056b754de3f9b"}},{"ruleId":"D2","level":"warning","message":{"text":"_resolveEntityScriptAttribute (cognitive 21): _resolveEntityScriptAttribute has cognitive complexity 21 (threshold 15). Drivers by points: if/else 7 (12 pts), ternaries 2 (7 pts), loops 1 (2 pts) (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":"src/framework/components/script/component.js"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b1854a3ced939c2d72e9b3e8d70abf02a004ea2c487fa5b584ad3a935bbd14"}},{"ruleId":"D2","level":"warning","message":{"text":"writeNodes (cognitive 21): writeNodes has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 3 (nesting depth added 9). Most of this is not in the body itself: 1 of the 21 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 680, 708, 722). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":678}}}],"partialFingerprints":{"codehealthFindingId/v1":"6328a057d1fa5d75a4343321e3a00b0cd1d8c80c67faa68cbc398c7cf59007ea"}},{"ruleId":"D2","level":"warning","message":{"text":"_drag (cognitive 21): _drag has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 3 (11 pts), if/else 2 (6 pts), match/switch 1 (2 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":"src/extras/gizmo/translate-gizmo.js"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"d44f1586d4b0d9df5302d827e9a60ce7e1be27bb6144a1c9ae191ab0b960573e"}},{"ruleId":"D2","level":"warning","message":{"text":"_drag (cognitive 21): _drag has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 3 (11 pts), if/else 2 (6 pts), match/switch 1 (2 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":"src/extras/gizmo/scale-gizmo.js"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfd30d9b1b533f93143f9c98858d55cc56f83801c1bf8fa7ce391f97b395d3b7"}},{"ruleId":"D2","level":"warning","message":{"text":"removeEffect (cognitive 21): removeEffect has cognitive complexity 21 (threshold 15). Drivers by points: if/else 9 (17 pts), ternaries 1 (3 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":"src/framework/components/camera/post-effect-queue.js"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d1a05610b03b7103212fa7328a7021c3f4d8a61d7a61a7c50e3dccebace9035"}},{"ruleId":"D2","level":"warning","message":{"text":"BindGroup._revalidate (cognitive 20): BindGroup._revalidate has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (10 pts), ternaries 2 (6 pts), boolean chains 2, loops 2 (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":"src/platform/graphics/bind-group.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"66045c3164db60eba7f873aaa462e484bb6d3337fdd0dd556b3e7de7feb557cd"}},{"ruleId":"D2","level":"warning","message":{"text":"StandardMaterialMapTransforms.update (cognitive 20): StandardMaterialMapTransforms.update has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 4, ternaries 1 (2 pts), 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":"src/scene/materials/standard-material-map-transforms.js"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"61b8864d948c3be9db99a3c1fac0e8f6be1f623ba7f8ee6052d0e775fd49f804"}},{"ruleId":"D2","level":"warning","message":{"text":"MeshInstance.getMaterialBindGroup (cognitive 20): MeshInstance.getMaterialBindGroup has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (9 pts), loops 4 (6 pts), boolean chains 5 (nesting depth added 4). Of this number, 16 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/mesh-instance.js"},"region":{"startLine":1749}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05aae63a22e2175b73437a30a7239dccd9e3f499766677300f429a690e2adb4"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGraphicsDevice._multiDrawLoopFallback (cognitive 20): WebglGraphicsDevice._multiDrawLoopFallback has cognitive complexity 20 (threshold 15). Drivers by points: loops 4 (12 pts), if/else 6 (8 pts) (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2112}}}],"partialFingerprints":{"codehealthFindingId/v1":"1aaf2738d154265e35630e1d8a61d58297266044f460eeb0221f4e62acdbafb7"}},{"ruleId":"D2","level":"warning","message":{"text":"basis.basisInitialize (cognitive 20): basis.basisInitialize has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (10 pts), boolean chains 7, loops 1 (3 pts) (nesting depth added 4). Of this number, 14 points are the body\u0027s own statements and 6 belong to one function literal inside it that branches. 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":"src/framework/handlers/basis.js"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a87a68ad436a5f7d6cdbfb19ea3e851c4bdba2b419c70982cbfe4e6e2bb68f3"}},{"ruleId":"D2","level":"warning","message":{"text":"TextureAtlasHandler._onAssetChange (cognitive 20): TextureAtlasHandler._onAssetChange has cognitive complexity 20 (threshold 15). Drivers by points: if/else 8 (17 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 10). 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":"src/framework/handlers/texture-atlas.js"},"region":{"startLine":186}}}],"partialFingerprints":{"codehealthFindingId/v1":"7480f99e0345738b3bff42199d997535f27f7514417531f47a4609999b0db2c8"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptAttributes.add (cognitive 20): ScriptAttributes.add has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (11 pts), ternaries 1 (4 pts), loops 1 (3 pts), boolean chains 2 (nesting depth added 7). Most of this is not in the body itself: 4 of the 20 points are its own statements and the rest belongs to one function literal inside it that branches (line 350). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/script/script-attributes.js"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbafcbe71f0e43b69378168ae56cfedbe5f1886a774762b2c4436449bc827509"}},{"ruleId":"D2","level":"warning","message":{"text":"WireRenderer._writePoints (cognitive 20): WireRenderer._writePoints has cognitive complexity 20 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 5 (6 pts), ternaries 2 (3 pts), boolean chains 1 (nesting depth added 8). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/renderers/wire-renderer.js"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"00048d153bfcb81565d8a8ce38025052b9c3c7bde5274249d7e1be5b3533c4d2"}},{"ruleId":"D2","level":"warning","message":{"text":"initFromGpuDevice (cognitive 20): initFromGpuDevice has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 9, boolean chains 4, if/else 3 (4 pts), other 3 (nesting depth added 1). Of this number, 19 points are the body\u0027s own statements and 1 belongs to one function item inside it that branches. 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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":765}}}],"partialFingerprints":{"codehealthFindingId/v1":"266caa57402220246f157c74aa70ebe0c615680e63e9d6a57f94440961ef277e"}},{"ruleId":"D2","level":"warning","message":{"text":"init (cognitive 20): init has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9, boolean chains 6, error handling 1 (2 pts), ternaries 2, loops 1 (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":"src/framework/app-base.js"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"1dcce0d05b8df656824b6ea13264f4fc3ccdde084db29be41b4d7b043fbc9d82"}},{"ruleId":"D2","level":"warning","message":{"text":"getRenderableHdrFormat (cognitive 20): getRenderableHdrFormat has cognitive complexity 20 (threshold 15). Drivers by points: if/else 4 (12 pts), boolean chains 5, match/switch 1 (2 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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":1905}}}],"partialFingerprints":{"codehealthFindingId/v1":"00491564f0785a3ee9c018b5f6f9ad99310a8993ffdb2d7a86662a15f61885b7"}},{"ruleId":"D2","level":"warning","message":{"text":"applySettings (cognitive 20): applySettings has cognitive complexity 20 (threshold 15). Drivers by points: other 20. 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":"src/scene/gsplat-unified/gsplat-params.js"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"39882bc09e68d50b6d358f16024b126aac0d23bb1605cd9dd28bff38da17741a"}},{"ruleId":"D2","level":"warning","message":{"text":"getSampler (cognitive 20): getSampler has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), boolean chains 7, ternaries 1 (2 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":"src/platform/graphics/webgpu/webgpu-texture.js"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"80f247217000a07e166d0b17f3174850a0e2cd4d8b4ebc4820d4249e69481ed3"}},{"ruleId":"D2","level":"warning","message":{"text":"_execute (cognitive 20): _execute has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 3 (7 pts), loops 1, other 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":"src/scene/graphics/radix-sort/compute-radix-sort-multipass.js"},"region":{"startLine":455}}}],"partialFingerprints":{"codehealthFindingId/v1":"a35afa1825fa7d90b6cb80e896e7b8c94aa1b00e9d65e444747fed16f48c8fd3"}},{"ruleId":"D2","level":"warning","message":{"text":"load (cognitive 20): load has cognitive complexity 20 (threshold 15). Drivers by points: if/else 5 (9 pts), other 4, ternaries 2 (4 pts), boolean chains 2, error handling 1 (nesting depth added 6). Of this number, 18 points are the body\u0027s own statements and 2 belong 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":"src/framework/parsers/ply.js"},"region":{"startLine":591}}}],"partialFingerprints":{"codehealthFindingId/v1":"773306d317604a233614de732b0f74c7fcb2ea3b9c2745007a6ccc2054dd1c8a"}},{"ruleId":"D2","level":"warning","message":{"text":"getRenderInfo (cognitive 20): getRenderInfo has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (13 pts), ternaries 2 (4 pts), boolean chains 1, loops 1, other 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":"src/scene/gsplat-unified/gsplat-work-buffer.js"},"region":{"startLine":239}}}],"partialFingerprints":{"codehealthFindingId/v1":"2af687751287516125bbc19362e4c9fbfda6fb1dd3249cc1ef70dc4684ebec6a"}},{"ruleId":"D2","level":"warning","message":{"text":"_intersectsRay (cognitive 20): _intersectsRay has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 7, boolean chains 1 (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":"src/core/shape/bounding-box.js"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff646e64d765ff9712887a8c9572c037023dff6e8aa9340fd855a8bf83d990bf"}},{"ruleId":"D2","level":"warning","message":{"text":"AnnotationManager.initialize (cognitive 19): AnnotationManager.initialize has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (15 pts), loops 2, boolean chains 1, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 5 of the 19 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 889, 918, 825, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/annotations.mjs"},"region":{"startLine":812}}}],"partialFingerprints":{"codehealthFindingId/v1":"680031a41503fc01e15e1269a3f8fea9bcc409ddbf45e134d41f71865a5d71de"}},{"ruleId":"D2","level":"warning","message":{"text":"Tags._has (cognitive 19): Tags._has has cognitive complexity 19 (threshold 15). Drivers by points: if/else 6 (14 pts), loops 2 (4 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":"src/core/tags.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e5b46df198ea41be0468d6be839edc470b3bcbf0b718a4230ec69afa5eae5f0"}},{"ruleId":"D2","level":"warning","message":{"text":"GraphicsDevice.initCapsDefines (cognitive 19): GraphicsDevice.initCapsDefines has cognitive complexity 19 (threshold 15). Drivers by points: if/else 19. 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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d8bdbe82b79775c2d447f3d6556edcc22ddd6818dd81164dc8892f4b44ac6b5"}},{"ruleId":"D2","level":"warning","message":{"text":"ply.readGeneralPly (cognitive 19): ply.readGeneralPly has cognitive complexity 19 (threshold 15). Drivers by points: loops 5 (13 pts), if/else 2 (3 pts), match/switch 1 (3 pts) (nesting depth added 11). Of this number, 13 points are the body\u0027s own statements and 6 belong to one function literal inside it that branches. To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/ply.js"},"region":{"startLine":392}}}],"partialFingerprints":{"codehealthFindingId/v1":"bec4efca11252a91d6d143db5cd2e8678738f19cc3b1b1c073f24f561493aeaf"}},{"ruleId":"D2","level":"warning","message":{"text":"ComponentSystem.initializeComponentData (cognitive 19): ComponentSystem.initializeComponentData has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 2, loops 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":"src/framework/components/system.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0b0603857e3cdcb60a21635ca10dd3aad517b633482462eb5f6ac0a8cd77be9"}},{"ruleId":"D2","level":"warning","message":{"text":"ModelComponent.model (cognitive 19): ModelComponent.model has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10 (15 pts), boolean chains 2, 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":"src/framework/components/model/component.js"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dabbbc185592dd353fe314507766a0dffe076fa1db8195115653e70940b6bd8"}},{"ruleId":"D2","level":"warning","message":{"text":"XrView._updateDepth (cognitive 19): XrView._updateDepth has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 4, ternaries 1 (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":"src/framework/xr/xr-view.js"},"region":{"startLine":278}}}],"partialFingerprints":{"codehealthFindingId/v1":"a31a2b8b6211a25db234c33ed88e1d26d0289efbfdfeff4f6db14cbb69ea69f9"}},{"ruleId":"D2","level":"warning","message":{"text":"XrManager.update (cognitive 19): XrManager.update has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (17 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":"src/framework/xr/xr-manager.js"},"region":{"startLine":1022}}}],"partialFingerprints":{"codehealthFindingId/v1":"50b0701308708beffa71fb3a3a0a2183471aac824ed62591d18b7937513c0eea"}},{"ruleId":"D2","level":"warning","message":{"text":"ext-mesh-gpu-instancing.createInstancing (cognitive 19): ext-mesh-gpu-instancing.createInstancing has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 9). Most of this is not in the body itself: 0 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 12). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/ext-mesh-gpu-instancing.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d216c00b578a0b34490c70594ae2853b398f12b2926deecf2807854c1b46b0"}},{"ruleId":"D2","level":"warning","message":{"text":"GlbContainerResource.createModel (cognitive 19): GlbContainerResource.createModel has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (12 pts), loops 3 (6 pts), ternaries 1 (nesting depth added 10). Of this number, 16 points are the body\u0027s own statements and 3 belong 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":"src/framework/parsers/glb-container-resource.js"},"region":{"startLine":312}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d557d83c5744c28339f4cc841e83a13c24c7d6ee0197d66c93aba017afa6d3"}},{"ruleId":"D2","level":"warning","message":{"text":"UsdzExporter.buildMaterial (cognitive 19): UsdzExporter.buildMaterial has cognitive complexity 19 (threshold 15). Drivers by points: if/else 5 (8 pts), ternaries 5 (8 pts), boolean chains 3 (nesting depth added 6). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to one function literal inside it that branches (line 470). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/usdz-exporter.js"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"7da3914e6afa8d503c91851f3bdb2c923b65d358d070177930b1aef37b07b653"}},{"ruleId":"D2","level":"warning","message":{"text":"RotateGizmo._drag (cognitive 19): RotateGizmo._drag has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (14 pts), if/else 1 (2 pts), match/switch 1 (2 pts), loops 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":"src/extras/gizmo/rotate-gizmo.js"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"ffb4c2a981711c339400fc3f19630720c9edcd64029d44ea7cc7a0e532198070"}},{"ruleId":"D2","level":"warning","message":{"text":"OutlineRenderer.getMeshInstances (cognitive 19): OutlineRenderer.getMeshInstances has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 3 (5 pts), boolean chains 4 (nesting depth added 8). Of this number, 11 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/renderers/outline-renderer.js"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"e65a8ead91bc8a7c3fc59283e5ced52d4c04b5170d3d6989a6b3f2d2d80b7304"}},{"ruleId":"D2","level":"warning","message":{"text":"graphics-device-create.createGraphicsDevice (cognitive 19): graphics-device-create.createGraphicsDevice has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (12 pts), boolean chains 3, ternaries 1 (3 pts), loops 1 (nesting depth added 6). Of this number, 14 points are the body\u0027s own statements and 5 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/graphics-device-create.js"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea8b165d3e325d71a12f9d5fbee7971b7a03b05859d0b1026d5681d8c681b163"}},{"ruleId":"D2","level":"warning","message":{"text":"layers (cognitive 19): layers has cognitive complexity 19 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 4 (7 pts), boolean chains 2 (nesting depth added 9). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/component.js"},"region":{"startLine":721}}}],"partialFingerprints":{"codehealthFindingId/v1":"0cfbe9fe907b94e919d3895a70f94e09a0d66edf7197fff4b42e26878c6df114"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatImage._rebuildFromImage (cognitive 18): GSplatImage._rebuildFromImage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 3 (4 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":"scripts/esm/gsplat/gsplat-image.mjs"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"d61703985ac50ab56693bf5caa336bfd096c1901ce09899a43aeacd6bb70d79f"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatLines.postUpdate (cognitive 18): GSplatLines.postUpdate has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (7 pts), loops 4 (7 pts), ternaries 1 (4 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":"scripts/esm/gsplat/gsplat-lines.mjs"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"a46b49d75eacd0042aa3bb81d027cdf30cbf844b9ff4e914de2cd9029b118559"}},{"ruleId":"D2","level":"warning","message":{"text":"LightsBuffer.addLightData (cognitive 18): LightsBuffer.addLightData has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (12 pts), boolean chains 4, loops 1 (2 pts) (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":"src/scene/lighting/lights-buffer.js"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfdd1fee73dfbfaa8ae656d6d1c02ae4ca765861b5dd2638fb3ce4934557fe85"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglShader.link (cognitive 18): WebglShader.link has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (14 pts), loops 2 (4 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":"src/platform/graphics/webgl/webgl-shader.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd44e215034035d8f3ba7931b72318c149c18a935358df6dc3cb658de474d832"}},{"ruleId":"D2","level":"warning","message":{"text":"BatchManager._collectAndRemoveMeshInstances (cognitive 18): BatchManager._collectAndRemoveMeshInstances has cognitive complexity 18 (threshold 15). Drivers by points: loops 5 (9 pts), if/else 3 (7 pts), boolean chains 2 (nesting depth added 8). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/batching/batch-manager.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"b55e9ffb8c4f8571c482cc5dbe68e2dfa28628f4490f09a66f590a4e668e6dc2"}},{"ruleId":"D2","level":"warning","message":{"text":"JobQueue.init (cognitive 18): JobQueue.init has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (15 pts), boolean chains 2, loops 1 (nesting depth added 4). Most of this is not in the body itself: 6 of the 18 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 32, 31). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-decoder.js"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5a8ed5ea0628bfe9e39daceabba2c915963619516d4af23b3c7207eb939b18b"}},{"ruleId":"D2","level":"warning","message":{"text":"AnimComponent.loadAnimationAssets (cognitive 18): AnimComponent.loadAnimationAssets has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (14 pts), loops 2 (3 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":"src/framework/components/anim/component.js"},"region":{"startLine":480}}}],"partialFingerprints":{"codehealthFindingId/v1":"81526b265f5a99f3d62d8b59aea50a229f490f2a8902fb4e6595aa92b74a2e5e"}},{"ruleId":"D2","level":"warning","message":{"text":"WebgpuXrBridge.beginFrame (cognitive 18): WebgpuXrBridge.beginFrame has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (10 pts), error handling 2 (5 pts), boolean chains 2, 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":"src/platform/graphics/webgpu/webgpu-xr-bridge.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"7080550c353232e0ab847322befbf8c8bc3eec982c2819da732998a110d42396"}},{"ruleId":"D2","level":"warning","message":{"text":"WebgpuGraphicsDevice.createDevice (cognitive 18): WebgpuGraphicsDevice.createDevice has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8 (12 pts), loops 1 (3 pts), ternaries 2, boolean chains 1 (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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"4411085ea02bc69bf690d679ac898734111a8f53836aefae5c2fa596f2f53b14"}},{"ruleId":"D2","level":"warning","message":{"text":"readTextureAsync (cognitive 18): readTextureAsync has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6, loops 2 (5 pts), other 5, error handling 1, ternaries 1 (nesting depth added 3). Most of this is not in the body itself: 7 of the 18 points are its own statements and the rest belongs to 4 function items inside it that branch ((anonymous)::(anonymous), (anonymous), release, \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2607}}}],"partialFingerprints":{"codehealthFindingId/v1":"541e882a51da1b381af117492466f37009b8a71c2f7347ceab6f18e812027866"}},{"ruleId":"D2","level":"warning","message":{"text":"frameStart (cognitive 18): frameStart has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (11 pts), other 5, ternaries 1 (2 pts) (nesting depth added 3). Most of this is not in the body itself: 0 of the 18 points are its own statements and the rest belongs to 7 function items inside it that branch ((anonymous)::(anonymous), (anonymous)::(anonymous), (anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/graphics-device.js"},"region":{"startLine":1780}}}],"partialFingerprints":{"codehealthFindingId/v1":"66468f3636e6ba4bd23ad6176e39bc6182e588b12776a6ccd7e7f726a052d5e0"}},{"ruleId":"D2","level":"warning","message":{"text":"createBufferViews (cognitive 18): createBufferViews has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (16 pts), boolean chains 1, loops 1 (nesting depth added 7). Of this number, 11 points are the body\u0027s own statements and 7 belong to 7 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1761}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e197dec2b0af34d1cff8cc07685d229de842c69be48472bee96e76f964e7cbd"}},{"ruleId":"D2","level":"warning","message":{"text":"renderForwardPrepareMaterials (cognitive 18): renderForwardPrepareMaterials has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 2, other 2, 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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":203}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8496905cdc3267e52b23a395ad1014edfcfcbd36c54f5e1b0bcbed68ca66224"}},{"ruleId":"D2","level":"warning","message":{"text":"type (cognitive 18): type has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (14 pts), boolean chains 4 (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":"src/framework/components/sprite/component.js"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"f82f4c7c6dd399540eef39c0d64bcddaf56052c0573394837696618936593140"}},{"ruleId":"D2","level":"warning","message":{"text":"createCalculator::calculateSizesOnAxisB (cognitive 18): createCalculator::calculateSizesOnAxisB has cognitive complexity 18 (threshold 15). Drivers by points: if/else 5 (9 pts), loops 4 (6 pts), ternaries 1 (3 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":"src/framework/components/layout-group/layout-calculator.js"},"region":{"startLine":202}}}],"partialFingerprints":{"codehealthFindingId/v1":"6294f89412cde1df85ffac3fc4e4f4a433d071c90e348b8916db440d8f12afed"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateTexOptions (cognitive 18): _updateTexOptions has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (12 pts), boolean chains 5, other 1 (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":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"0770c8750193bb82247a7c0b9b4993ff40f3e0b1bb181cf6634a58cb56cd90bc"}},{"ruleId":"D2","level":"warning","message":{"text":"_updateMaterialOptions (cognitive 18): _updateMaterialOptions has cognitive complexity 18 (threshold 15). Drivers by points: boolean chains 17, ternaries 1. Of this number, 16 points are the body\u0027s own statements and 2 belong to one function item inside it that branches. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":219}}}],"partialFingerprints":{"codehealthFindingId/v1":"70e907c730174510eb0ae1d26b4adabf00161832551e6414220667b8f33c3568"}},{"ruleId":"D2","level":"warning","message":{"text":"UnifiedSortWorker::computeEffectiveDistanceRangeLinear (cognitive 18): UnifiedSortWorker::computeEffectiveDistanceRangeLinear has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 6 (12 pts), if/else 3 (5 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":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":179}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2eb73a317c2f7feb07d386772b6b7dd0b31169a3867ae9d396114328bc2af1d"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatVaryings._generateChunks (cognitive 17): GSplatVaryings._generateChunks has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 5 (10 pts), loops 2 (4 pts), if/else 2 (3 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":"src/scene/gsplat-unified/gsplat-varyings.js"},"region":{"startLine":233}}}],"partialFingerprints":{"codehealthFindingId/v1":"9124c2c0154615cc87cd799f2d7c77c6dd876d4fb200ac59e7cb4ef6623785ba"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatOctree.flushRequests (cognitive 17): GSplatOctree.flushRequests has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (13 pts), loops 2 (4 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-octree.js"},"region":{"startLine":629}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4d4afb6bed3f95b755f647614b8e865465a0a1bcf5dba5c4e55c92a592fdc91"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatWorld.reconcile (cognitive 17): GSplatWorld.reconcile has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (12 pts), loops 4 (5 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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf51c19b12f50c857cb56ab3857347d6f2997590aceabd3f70292c0ed2def39"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatLayerData.updateConfiguration (cognitive 17): GSplatLayerData.updateConfiguration has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (10 pts), ternaries 4 (6 pts), boolean chains 1 (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":"src/scene/gsplat-unified/gsplat-director.js"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"83d5786112a515ee2459648d1d4a363d0635d9ecd714b8f1d5ba64341954c221"}},{"ruleId":"D2","level":"warning","message":{"text":"ammo-physics-shape.getTriMesh (cognitive 17): ammo-physics-shape.getTriMesh has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 4 (7 pts), loops 1 (2 pts) (nesting depth added 8). Of this number, 11 points are the body\u0027s own statements and 6 belong 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":"src/framework/physics/ammo/ammo-physics-shape.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"c482b00b33d36c7e2a39d955097ce5aee05c69763e5663b46d38a97b9bc471b7"}},{"ruleId":"D2","level":"warning","message":{"text":"MouseEvent.constructor (cognitive 17): MouseEvent.constructor has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12 (14 pts), boolean chains 3 (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":"src/platform/input/mouse-event.js"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"03ce211329ed64ea90b0c952b1b92d3e8f8ca03dfe4202a5a85ab8551a0a7b92"}},{"ruleId":"D2","level":"warning","message":{"text":"draco-decoder.initializeWorkers (cognitive 17): draco-decoder.initializeWorkers has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (10 pts), ternaries 3 (4 pts), boolean chains 2, loops 1 (nesting depth added 4). Of this number, 11 points are the body\u0027s own statements and 6 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-decoder.js"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"18bc13db341aef77f04236a92a0e36e708c0839acb73b90922a778948f10af92"}},{"ruleId":"D2","level":"warning","message":{"text":"GltfExporter.collectResources (cognitive 17): GltfExporter.collectResources has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (13 pts), boolean chains 4 (nesting depth added 3). Most of this is not in the body itself: 0 of the 17 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 173, 223, 181). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"57ec918bf54933370a9178c93fcee6d2869dfb3639f917163f036e3c5bece086"}},{"ruleId":"D2","level":"warning","message":{"text":"usdz-exporter.skinVertices (cognitive 17): usdz-exporter.skinVertices has cognitive complexity 17 (threshold 15). Drivers by points: loops 4 (10 pts), if/else 3 (7 pts) (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/usdz-exporter.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea104543d131d0f973c74fd9b05eddb7edad60ce7f184cc6ce3761519de7a2a"}},{"ruleId":"D2","level":"warning","message":{"text":"Gizmo._getSelection (cognitive 17): Gizmo._getSelection has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (9 pts), loops 3 (6 pts), boolean chains 2 (nesting depth added 8). Of this number, 14 points are the body\u0027s own statements and 3 belong 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":"src/extras/gizmo/gizmo.js"},"region":{"startLine":614}}}],"partialFingerprints":{"codehealthFindingId/v1":"124faaeb2fba22fbb076e85a91c1073150d731d5cdd25edf40df47b2946a101c"}},{"ruleId":"D2","level":"warning","message":{"text":"outlineColor (cognitive 17): outlineColor has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (8 pts), ternaries 4, boolean chains 3, loops 1 (2 pts) (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":"src/framework/components/element/text-element.js"},"region":{"startLine":2056}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f30d9bc157be594ef97d30bc3b3728ad5f4d39441050503cf0bf5d28b943182"}},{"ruleId":"D2","level":"warning","message":{"text":"_prepareUniformBuffer (cognitive 17): _prepareUniformBuffer has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 2 (4 pts), boolean chains 3, other 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":"src/scene/materials/material.js"},"region":{"startLine":1223}}}],"partialFingerprints":{"codehealthFindingId/v1":"13e2b525a2d8fefcd23789dce37ce46a914fd6d0f03804960ccba639a60e3504"}},{"ruleId":"D2","level":"warning","message":{"text":"writeMaterials (cognitive 17): writeMaterials has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 2 (nesting depth added 7). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to one function literal inside it that branches (line 639). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f897403f32ed0dc588bd77dd9a9c2804a7fd2d0174d7c2edfb11fd400801f2"}},{"ruleId":"D2","level":"warning","message":{"text":"updateSubStat (cognitive 17): updateSubStat has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (8 pts), if/else 4 (5 pts), boolean chains 2, 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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":922}}}],"partialFingerprints":{"codehealthFindingId/v1":"10ea9b88b773dfe2c6740b590a761b1ea3330d34e9cd9f044714da1d897bedc0"}},{"ruleId":"D2","level":"warning","message":{"text":"_writeLine (cognitive 17): _writeLine has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 7 (13 pts), boolean chains 2, if/else 1, loops 1 (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":"src/extras/renderers/wide-line-renderer.js"},"region":{"startLine":948}}}],"partialFingerprints":{"codehealthFindingId/v1":"6686a7d9ebaf8e6d4126981efd759afcbf2dec70394d0787d5e49637445f9587"}},{"ruleId":"D2","level":"warning","message":{"text":"load::_opened (cognitive 17): load::_opened has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (13 pts), boolean chains 2, 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":"src/framework/asset/asset-registry.js"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d9d72757adaaf6145043246fd30e7e39735cdd10621211b7f100d006155b041"}},{"ruleId":"D2","level":"warning","message":{"text":"sort (cognitive 17): sort has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 2 (3 pts), boolean chains 2, loops 1, other 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":"src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe2203296cd59332f294b61a13184c78a470525c4c725b22c3a06a2af3aa323"}},{"ruleId":"D2","level":"warning","message":{"text":"sortIndirect (cognitive 17): sortIndirect has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 4 (10 pts), if/else 2 (3 pts), boolean chains 2, loops 1, other 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":"src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"2039b4f5bf11eb0d22fcbaa43d0d2316f5857e0a72fd84bc7af39f03d5d76dd2"}},{"ruleId":"D2","level":"warning","message":{"text":"stripUnusedColorAttachments (cognitive 17): stripUnusedColorAttachments has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 1 (3 pts), boolean chains 1, other 1 (nesting depth added 10). Of this number, 16 points are the body\u0027s own statements and 1 belongs to 2 function literals inside it that branch. 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":"src/core/preprocessor.js"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1d74a00e016e075d94060bc3f5add29c5a8183e7751418dad56947d7b605b85"}},{"ruleId":"D2","level":"warning","message":{"text":"initColor (cognitive 17): initColor has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (11 pts), ternaries 2 (4 pts), boolean chains 1, other 1 (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":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":460}}}],"partialFingerprints":{"codehealthFindingId/v1":"464ee61f9330db5f1cc730f6bddd7e9044f04fdd3c958e159ddfb1c797e1764f"}},{"ruleId":"D2","level":"warning","message":{"text":"calcSpawnPosition (cognitive 17): calcSpawnPosition has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7 (9 pts), ternaries 4 (8 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":"src/scene/particle-system/cpu-updater.js"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"180f7cad5cf3af0ba0a89c2743798700bd21727877d053503e9ca89fd2995b6a"}},{"ruleId":"D2","level":"warning","message":{"text":"BasisWorker::chooseTargetFormat (cognitive 17): BasisWorker::chooseTargetFormat has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8 (16 pts), ternaries 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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"c977a4a36a3c72b744727fee71aa4c53636e1be812e60411e82eb0518e818b72"}},{"ruleId":"D2","level":"warning","message":{"text":"createShader (cognitive 17): createShader has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 6 (12 pts), boolean chains 4, if/else 1 (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":"src/scene/shader-lib/shader-utils.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"16b53e69c76b66dd8ed57cc52f43bb8cdced37927468ba40ccf41d66929d4cd7"}},{"ruleId":"D2","level":"warning","message":{"text":"applyAllocations (cognitive 17): applyAllocations has cognitive complexity 17 (threshold 15). Drivers by points: if/else 4 (8 pts), loops 2 (5 pts), boolean chains 2, ternaries 2 (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":"src/scene/gsplat-unified/gsplat-world-state.js"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d1f974f728267674674f8139873ebcdd81f836f4d6a16ea0215e6f1b9bee8ac"}},{"ruleId":"D2","level":"warning","message":{"text":"GSplatTrees._rebuild (cognitive 16): GSplatTrees._rebuild has cognitive complexity 16 (threshold 15). Drivers by points: loops 9 (13 pts), if/else 2, boolean chains 1 (nesting depth added 4). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/gsplat/gsplat-trees.mjs"},"region":{"startLine":348}}}],"partialFingerprints":{"codehealthFindingId/v1":"530061fcf2a2f2a7cafefd7682304389ebd538643ee9d6db021eb726b3aec67b"}},{"ruleId":"D2","level":"warning","message":{"text":"XrNavigation._computeArcHit (cognitive 16): XrNavigation._computeArcHit has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 3 (7 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":"scripts/esm/xr/xr-navigation.mjs"},"region":{"startLine":604}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd54e0f8794a94cf31de5e72ca706fd0efe4005cbe038acc988cf455023fb587"}},{"ruleId":"D2","level":"warning","message":{"text":"MeshInstanceStorage._uploadDirtySlots (cognitive 16): MeshInstanceStorage._uploadDirtySlots has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 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":"src/platform/graphics/mesh-instance-storage.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"669fe4afefb9f9f60409efc00e3e35ba8a44d4467f1a912d748c19efac5ff929"}},{"ruleId":"D2","level":"warning","message":{"text":"StandardMaterialMapTransforms._updateIds (cognitive 16): StandardMaterialMapTransforms._updateIds has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (10 pts), loops 2 (4 pts), boolean chains 2 (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":"src/scene/materials/standard-material-map-transforms.js"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"85986bfeabffc8257153e563ba51d93edd4f6b95c0c499cfea385beb144d484c"}},{"ruleId":"D2","level":"warning","message":{"text":"SphereGeometry.constructor (cognitive 16): SphereGeometry.constructor has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (10 pts), loops 4 (6 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":"src/scene/geometry/sphere-geometry.js"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"45232d8e5aec8aef6d01e75e9c7ddccdb132b595e45fc31ba179598682b002f8"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageRenderable.setUnmaskDrawOrder (cognitive 16): ImageRenderable.setUnmaskDrawOrder has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (13 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 6). Most of this is not in the body itself: 6 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 169). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/image-element.js"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6b75380524bc831d54147ccc3eb3304b311b7e0169f2cd2e2c5887fc5559dd6"}},{"ruleId":"D2","level":"warning","message":{"text":"ImageElement.texture (cognitive 16): ImageElement.texture has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (15 pts), boolean chains 1 (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":"src/framework/components/element/image-element.js"},"region":{"startLine":1142}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d26142171e47d4fb6e136abb002a434fc41207a0797289521d2431e341db5c9"}},{"ruleId":"D2","level":"warning","message":{"text":"AssetReference._bind (cognitive 16): AssetReference._bind has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9 (16 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":"src/framework/asset/asset-reference.js"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"9ffeaa3cb48e40a2efb647480d58acfc8c6a641b7323beba4df61aa1aa307780"}},{"ruleId":"D2","level":"warning","message":{"text":"RenderComponent.rootBone (cognitive 16): RenderComponent.rootBone has cognitive complexity 16 (threshold 15). Drivers by points: if/else 8 (14 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":"src/framework/components/render/component.js"},"region":{"startLine":775}}}],"partialFingerprints":{"codehealthFindingId/v1":"39671ea494dc275cba6909b172a010d3dbf54a4cd9a82e39d3a69871caec4f21"}},{"ruleId":"D2","level":"warning","message":{"text":"WebglGpuProfiler.request (cognitive 16): WebglGpuProfiler.request has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), loops 1 (4 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":"src/platform/graphics/webgl/webgl-gpu-profiler.js"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"5691d1c8aca314d5994a26dddf90e9b9c4cec033a2a3afc7a9c8b136e08a6897"}},{"ruleId":"D2","level":"warning","message":{"text":"Lightmapper.postprocessTextures (cognitive 16): Lightmapper.postprocessTextures has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 2 (8 pts), loops 3 (6 pts), boolean chains 1, if/else 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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":883}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d39493a8e9aa06609e683fd7d029b2c00c9355a6587ff850641313e7170ea78"}},{"ruleId":"D2","level":"warning","message":{"text":"SoundComponentSystem.onUpdate (cognitive 16): SoundComponentSystem.onUpdate has cognitive complexity 16 (threshold 15). Drivers by points: if/else 3 (9 pts), loops 2 (6 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":"src/framework/components/sound/system.js"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68b7a566d89a81e1eb8db9f423ee94b76ccbc55f278d3ca76f9b96afdbb7f1c"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptHandler._loadModule (cognitive 16): ScriptHandler._loadModule has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 2, loops 1 (nesting depth added 7). Most of this is not in the body itself: 3 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 135). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/script.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"1354c485d672ecb3c20cf976dd608453cdce5e1539e338fff7d05e8514599f77"}},{"ruleId":"D2","level":"warning","message":{"text":"CoreExporter.textureToCanvas (cognitive 16): CoreExporter.textureToCanvas has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), boolean chains 5, loops 1 (3 pts), ternaries 1 (nesting depth added 4). Of this number, 14 points are the body\u0027s own statements and 2 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/core-exporter.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbecb656ef7fb07823696bfe0507f11586793a5b7d2f25764bb6b5a4558e28f4"}},{"ruleId":"D2","level":"warning","message":{"text":"RotateGizmo._setNodeRotations (cognitive 16): RotateGizmo._setNodeRotations has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (13 pts), boolean chains 2, 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":"src/extras/gizmo/rotate-gizmo.js"},"region":{"startLine":607}}}],"partialFingerprints":{"codehealthFindingId/v1":"81ecbf3574b9371edc12d6d11473e62575f151152565f24af29194b17aa9970d"}},{"ruleId":"D2","level":"warning","message":{"text":"WordAtlas.constructor (cognitive 16): WordAtlas.constructor has cognitive complexity 16 (threshold 15). Drivers by points: loops 7 (10 pts), if/else 2 (6 pts) (nesting depth added 7). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/mini-stats/word-atlas.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"a871cfb8acdbeefb99ea7009489b82912b8f58e5fad0083f4388261498a61734"}},{"ruleId":"D2","level":"warning","message":{"text":"ResourceLine.equals (cognitive 16): ResourceLine.equals has cognitive complexity 16 (threshold 15). Drivers by points: if/else 16. 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":"src/platform/graphics/webgpu/webgpu-shader-processor-wgsl.js"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"56667eb6559e60aa4e29810081691a8931d645ba076d49c3a4431a99e932e529"}},{"ruleId":"D2","level":"warning","message":{"text":"shadowColor (cognitive 16): shadowColor has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (7 pts), ternaries 4, boolean chains 3, loops 1 (2 pts) (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":"src/framework/components/element/text-element.js"},"region":{"startLine":2137}}}],"partialFingerprints":{"codehealthFindingId/v1":"63972817cef80a8dd6f00dab54bf7b2938c68108bea0d7d58f965537fab9abec"}},{"ruleId":"D2","level":"warning","message":{"text":"destroy (cognitive 16): destroy has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, loops 2 (3 pts), error handling 1 (2 pts) (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":"src/framework/app-base.js"},"region":{"startLine":1811}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0082b8db12c06d71af00a028af219e7ea6c03d8fc7a2c53611d624ce2e1f9dd"}},{"ruleId":"D2","level":"warning","message":{"text":"update (cognitive 16): update has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, boolean chains 3, other 1, ternaries 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":"src/extras/render-passes/camera-frame.js"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4416c7fb98536ed394c5280d3c4893996817de4913c210fee94f6eac3dd1785"}},{"ruleId":"D2","level":"warning","message":{"text":"constructor (cognitive 16): constructor has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (6 pts), boolean chains 4, if/else 3 (4 pts), loops 2 (nesting depth added 4). Most of this is not in the body itself: 4 of the 16 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 200, 180). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-octree.js"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"49ae3fcdd5f64e13e201d0578941e5ca1d5a3be60d4432e798c213a7989fb848"}},{"ruleId":"D2","level":"warning","message":{"text":"setTheme (cognitive 16): setTheme has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (9 pts), loops 4, boolean chains 3 (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":"src/extras/gizmo/transform-gizmo.js"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"dce04cef29439fe30f1387e89aad40be4d1327d6b47d9e22b6db7b89df190848"}},{"ruleId":"D2","level":"warning","message":{"text":"watchUnbundled (cognitive 16): watchUnbundled has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6, boolean chains 5, ternaries 2 (3 pts), other 2 (nesting depth added 1). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to 14 function items inside it that branch (update, queue, rebuild::(anonymous), \u2026). Those helpers are already separate functions, so extracting the branching again is not available. To reduce it, move them out of the body to the enclosing scope, where each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/esbuild-build-target.mjs"},"region":{"startLine":556}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5bcbd830837b1bb4c235cea136e196a752cef30f3e752a1133f48a0c8e9128"}},{"ruleId":"D2","level":"warning","message":{"text":"add::set (cognitive 16): add::set has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (7 pts), ternaries 1 (4 pts), loops 1 (3 pts), boolean chains 2 (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":"src/framework/script/script-attributes.js"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6505112fbb94e2eeba8655bf803877bebbf2ba69019f509609cc123d6cdfb30"}},{"ruleId":"D2","level":"warning","message":{"text":"UnifiedSortWorker::computeEffectiveDistanceRangeRadial (cognitive 16): UnifiedSortWorker::computeEffectiveDistanceRangeRadial has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 3 (9 pts), if/else 2 (4 pts), loops 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":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"3692d617491c8c373a89d27dcd00e0810e76ea98ecefd4c9791f720a424e5de7"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WebglGraphicsDevice: ClassTooLong \u2014 1576 significant lines (blank, comment-only and punctuation-only lines excluded), 86 methods. The bar is 400 significant lines; this is 1176 over it, 3.94\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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bfb81b97978dc1cba6594280984b95714add2e02a90c7e9501b58d0587954b9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TextElement._updateMeshes: MethodTooLong \u2014 _updateMeshes runs 385 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 285 over it, 3.85\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":"src/framework/components/element/text-element.js"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"229cdb98e982ae2916ec0490144a76a7e48e20f56afc7eb1de0a261d9c19dcd6"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WebglGraphicsDevice.constructor: MethodTooLong \u2014 constructor runs 349 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 249 over it, 3.49\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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d081463858e0f1d55c31f7f3c710b17ca83173485627420758996b4cde38d2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WebglTexture.initialize: MethodTooLong \u2014 initialize runs 339 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 239 over it, 3.39\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"798cdfa910773810a7454838669ea73859117f7e0fe68166d9125f801263c02a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webgl/webgl-graphics-device.js: FileTooLong \u2014 1667 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 95% of them inside a single declaration: WebglGraphicsDevice (144-3264). The bar is 1500 significant lines; this is 167 over it, 1.11\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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7c14b6f6d287af076976615d5d265ef5d9f85225c670fa57b4a87805420a8e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: TextElement: ClassTooLong \u2014 1325 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 925 over it, 3.31\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":"src/framework/components/element/text-element.js"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"1711d9f6d6d0ca34cd5d581eb00d0bde3595a881231a236f52134a09f99ca87e"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: layout-calculator.createCalculator: FunctionTooLong \u2014 createCalculator runs 313 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 213 over it, 3.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/layout-group/layout-calculator.js"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"eed4dda34152d66d8f8fc5936d425d9cdd832f540bb707651683436426473c30"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: basis-worker.BasisWorker: FunctionTooLong \u2014 BasisWorker runs 289 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 189 over it, 2.89\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":"src/framework/handlers/basis-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"33cde193f8678f88f6f77d485acfae09ab0e533202b4ebba6af08edc374b67e2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WebglGraphicsDevice: TooManyMethods \u2014 86 methods. The bar is 30 methods; this is 56 over it, 2.87\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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f625d335d05550badf79c4e80307361ff60b83a06309fc1e57f114a9cd7aa5a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: element/text-element.js: FileTooLong \u2014 1425 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: TextElement (154-2365). The bar is 500 significant lines; this is 925 over it, 2.85\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":"src/framework/components/element/text-element.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10337e0e8e25bfc11531d79da9d64c273ab9bc3daf594b96188c6fcc9e44269b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WebglTexture.upload: MethodTooLong \u2014 upload runs 274 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 174 over it, 2.74\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":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7d85a20f87e97f9969f65467199ddf094e8996534efcf669f0486d68b9fcba0"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ElementComponent: ClassTooLong \u2014 1043 significant lines (blank, comment-only and punctuation-only lines excluded), 42 methods. The bar is 400 significant lines; this is 643 over it, 2.61\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":"src/framework/components/element/component.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"404d8ce3714227077e81f00668c69d61c1818d6a32908b116d568121891847c7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: WebgpuGraphicsDevice: TooManyMethods \u2014 77 methods. The bar is 30 methods; this is 47 over it, 2.57\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a6d9a16594cfa3aa886635b7708fe386b530310e63bb829342a59048b8543b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WebgpuGraphicsDevice: ClassTooLong \u2014 940 significant lines (blank, comment-only and punctuation-only lines excluded), 77 methods. The bar is 400 significant lines; this is 540 over it, 2.35\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"f468cb9093c58a0112eba77bbea7543dd2966860d3b28c349285bc81c28dfde0"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: TextElement._updateText: MethodTooLong \u2014 _updateText runs 233 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 133 over it, 2.33\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":"src/framework/components/element/text-element.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcc7f2db7f8b030a333873592914282395cc51dd888aaf71f9c879b94d3c40e6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ScrollViewComponent: TooManyMethods \u2014 68 methods. The bar is 30 methods; this is 38 over it, 2.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/scroll-view/component.js"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ba2d0e21199287edff483a31616374ce2746cd7ba9e3f3995e7e971a79c691"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: parsers/glb-parser.js: FileTooLong \u2014 1105 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 605 over it, 2.21\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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a14279a719d030d809cc905a2136d6c8e08a8c06101e41784cf1d5738f9884"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: element/component.js: FileTooLong \u2014 1068 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: ElementComponent (100-3006). The bar is 500 significant lines; this is 568 over it, 2.14\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":"src/framework/components/element/component.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5532e34b0fecd5ff2f5f2443c1e643d2a258399082038132ee3a0450f36f064f"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ParticleCPUUpdater.update: MethodTooLong \u2014 update runs 213 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 113 over it, 2.13\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/particle-system/cpu-updater.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c2b69d789e357aed94327192677f6f004cb5a32ae78ebcaeb7cada16969b395"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gsplat-sort-worker.SortWorker: FunctionTooLong \u2014 SortWorker runs 206 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 106 over it, 2.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sort-worker.js"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"170a85d0242a3f9bbb78352804cd10cdbfe3bc1a5ef497ca658bbeaf15352354"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: draco-worker.DracoWorker: FunctionTooLong \u2014 DracoWorker runs 203 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 103 over it, 2.03\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":"src/framework/parsers/draco-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c26b53959e591ae7877cc459bbf7d6cc0a3799a1cf1e706964437704bbab5172"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: gsplat-unified-sort-worker.UnifiedSortWorker: FunctionTooLong \u2014 UnifiedSortWorker runs 201 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 101 over it, 2.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":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"55e7f42f700a9601f95b825238d3b0e11d854e2d6d746bccb511ffcc2bc8d956"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GraphNode: TooManyMethods \u2014 60 methods. The bar is 30 methods; this is 30 over it, 2.00\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graph-node.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2be684f9268c5498c433e8eac78ecada466ebeb86e872372f2b9fe59f03e72f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webgpu/webgpu-graphics-device.js: FileTooLong \u2014 989 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: WebgpuGraphicsDevice (68-2212). The bar is 500 significant lines; this is 489 over it, 1.98\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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd056f916cab200f2c0186765f2818e6753db3d1dd42b11d401da1e25a6edb7c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GraphicsDevice: TooManyMethods \u2014 59 methods. The bar is 30 methods; this is 29 over it, 1.97\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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"af5806909608e42f4a04b1b8e1e1809f0c61f695fba6831c3555b99ee4ed9562"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ParticleSystemComponent: ClassTooLong \u2014 745 significant lines (blank, comment-only and punctuation-only lines excluded), 47 methods. The bar is 400 significant lines; this is 345 over it, 1.86\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":"src/framework/components/particle-system/component.js"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"7749517b732fbdd3c5078d78d188b1db389ce3ed1d8428ccdba2fec31d7802be"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AppBase: TooManyMethods \u2014 55 methods. The bar is 30 methods; this is 25 over it, 1.83\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":"src/framework/app-base.js"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5711b705b566224ccfb087d314986bfecc625e284c1c8593f42a9671e8c858a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SSAOEffect.constructor: MethodTooLong \u2014 constructor runs 178 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 78 over it, 1.78\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/posteffects/posteffect-ssao.js"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"884515c1584b62c03d7fca1735512ec9e6111765d08de84c1a594a122392a921"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ButtonComponent: TooManyMethods \u2014 50 methods. The bar is 30 methods; this is 20 over it, 1.67\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":"src/framework/components/button/component.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9851df6d53fcd4147d5b0aacd20adf3488ebba36ce094faed2bb775081ddacd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: WebglTexture: ClassTooLong \u2014 654 significant lines (blank, comment-only and punctuation-only lines excluded), 10 methods. The bar is 400 significant lines; this is 254 over it, 1.64\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":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac9b8b194c5e0a6c6afd2ccd2ee6d017816a0f4f3485c4b98a81d804fc2c557"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: element/image-element.js: FileTooLong \u2014 815 significant lines (blank, comment-only and punctuation-only lines excluded), about 80% of them inside a single declaration: ImageElement (280-1390). The bar is 500 significant lines; this is 315 over it, 1.63\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":"src/framework/components/element/image-element.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed6526197a02855b881fe44694a19a61923feaa77656cb34a9fdb378f5618e95"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ConeBaseGeometry.constructor: MethodTooLong \u2014 constructor runs 163 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 63 over it, 1.63\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":"src/scene/geometry/cone-base-geometry.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a8a38df8876bbbfec99623fef5cffbf03d38acb8b35e4c1d7c17e4944f52066"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AppBase: ClassTooLong \u2014 649 significant lines (blank, comment-only and punctuation-only lines excluded), 55 methods. The bar is 400 significant lines; this is 249 over it, 1.62\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":"src/framework/app-base.js"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"be56515049799260c2a95b4254a2e6ede7aa61fefbd436e82da1fae5d655a5fc"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ImageElement: ClassTooLong \u2014 648 significant lines (blank, comment-only and punctuation-only lines excluded), 46 methods. The bar is 400 significant lines; this is 248 over it, 1.62\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":"src/framework/components/element/image-element.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e44a0d319547ba83c565dceeb0c510764c7fcaba0c2b69ed72759262d65361"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ParticleEmitter: ClassTooLong \u2014 646 significant lines (blank, comment-only and punctuation-only lines excluded), 20 methods. The bar is 400 significant lines; this is 246 over it, 1.62\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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"436314ba267cb2b484d7081869f4efe5575a1144e04e531cf761c47a739ddac7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: particle-system/particle-emitter.js: FileTooLong \u2014 807 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 80% of them inside a single declaration: ParticleEmitter (226-1166). The bar is 500 significant lines; this is 307 over it, 1.61\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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54e472c78d9180ec8c2b6f57f0f27d787b35ae38cc2b3ee64504a58d78226c9b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: materials/standard-material.js: FileTooLong \u2014 795 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 295 over it, 1.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":"src/scene/materials/standard-material.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3f47f8e6d51371df34e7b2c2ee3bd3a1158dd41f09bacf15f21df1226593577"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Mat4: ClassTooLong \u2014 635 significant lines (blank, comment-only and punctuation-only lines excluded), 36 methods. The bar is 400 significant lines; this is 235 over it, 1.59\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":"src/core/math/mat4.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c456e85eaf912ae3d043d68bcfbccd0f3c70be8703537996f64606114d86e6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ParticleSystemComponent: TooManyMethods \u2014 47 methods. The bar is 30 methods; this is 17 over it, 1.57\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/particle-system/component.js"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"07ec7d28b4d4aa261b56ac5fff38e541af0c4965fe10f510305432da9d7ffd1c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Preprocessor._preprocess: MethodTooLong \u2014 _preprocess runs 154 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 54 over it, 1.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":"src/core/preprocessor.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"40ac744f0f9fd31bae3dbcbc12062eb412fe4ef51ff500119831976470ab1caf"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: RenderTarget.constructor: MethodTooLong \u2014 constructor runs 154 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 54 over it, 1.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":"src/platform/graphics/render-target.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"d79791713758e810e37d2544ab6ebc7bd59c2b46690542d126ea12f1e0da8a49"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ImageElement: 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":"src/framework/components/element/image-element.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"6747f30f00442788359373ecdd49173d63b1d98f464ce3a962b29886516b76b2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: esm/water.mjs: FileTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 258 over it, 1.52\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":"scripts/esm/water.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf3146a32427c1e7530988c2ad4ffec15b409cc9bdb73994e19bdf8e2d80b96"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: particle-system/component.js: FileTooLong \u2014 757 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: ParticleSystemComponent (137-2401). The bar is 500 significant lines; this is 257 over it, 1.51\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":"src/framework/components/particle-system/component.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"838a29c591088f6b48e5090a693ab1da48ba24f7e8c616d798ff85325d032766"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Light: ClassTooLong \u2014 602 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. The bar is 400 significant lines; this is 202 over it, 1.51\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":"src/scene/light.js"},"region":{"startLine":138}}}],"partialFingerprints":{"codehealthFindingId/v1":"577f19c6f558f1dcaf363932e588ab04a2af3d991420face0e03a701717e2deb"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ScrollViewComponent: ClassTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded), 68 methods. The bar is 400 significant lines; this is 171 over it, 1.43\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":"src/framework/components/scroll-view/component.js"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d674db5b7dcdd4139b90d07257344060930588a5a072d1426652ab11fedc801"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Lightmapper: ClassTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded), 29 methods. The bar is 400 significant lines; this is 171 over it, 1.43\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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"11484b91494d4d0433234901591457aa75198b23f0282fa9f31fffede2f0c1e5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: framework/app-base.js: FileTooLong \u2014 702 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: AppBase (130-2120). The bar is 500 significant lines; this is 202 over it, 1.40\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":"src/framework/app-base.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a165f95cc59b3d153dcac7d6346aeeaa304c21b702febb7077fb96916a16834f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ElementComponent: TooManyMethods \u2014 42 methods. The bar is 30 methods; this is 12 over it, 1.40\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":"src/framework/components/element/component.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c77a1c5e2f223955294b73c4435809138cbd56059b6beb0a527f4d360b0d3d8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: XrMenu: ClassTooLong \u2014 556 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 156 over it, 1.39\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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa13515f307f189edc2133ce65829feb44f5017fabd9a1030395d5a0e2d328fa"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Renderer: ClassTooLong \u2014 555 significant lines (blank, comment-only and punctuation-only lines excluded), 38 methods. The bar is 400 significant lines; this is 155 over it, 1.39\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":"src/scene/renderer/renderer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"df64595e07db158de7d63d3bd5e66aa51141351855e524e394c878a6c392f453"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: BatchManager.create: MethodTooLong \u2014 create runs 138 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 38 over it, 1.38\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":"src/scene/batching/batch-manager.js"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"114e9c4546040ef89a5be85310f03cc4700199a181c3044620b80e3f24467ef6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webgl/webgl-texture.js: FileTooLong \u2014 688 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: WebglTexture (62-909). The bar is 500 significant lines; this is 188 over it, 1.38\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":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a2074f6b165af8b2e6040c919276f8b19615bc02fa653f908870f380a391e3a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GltfExporter: ClassTooLong \u2014 550 significant lines (blank, comment-only and punctuation-only lines excluded), 18 methods. The bar is 400 significant lines; this is 150 over it, 1.38\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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f19fd5b16d46fb5ae946a230d9df6364533bb21d7d88a2d12bec15901efa9e3"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: glb-parser.createAnimation: FunctionTooLong \u2014 createAnimation runs 137 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":670}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ea30c18c400c7216b76b4000bcd3bf6d710d17fe54664107e7018e9d698c9cb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: graphics/constants.js: FileTooLong \u2014 676 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 176 over it, 1.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":"src/platform/graphics/constants.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd91efe8d6dd87f85b4e24eb6881e5e9452abe54238c9e7331a4ef1e8738f484"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ElementComponentSystem.getImageElementMaterial: MethodTooLong \u2014 getImageElementMaterial runs 135 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 35 over it, 1.35\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/system.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"95128ff430c7d2fe5a69da63973b0ed17208d9108aea507ef6fdae697d528db6"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GraphicsDevice: ClassTooLong \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded), 59 methods. The bar is 400 significant lines; this is 135 over it, 1.34\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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"737b3fa18abf9b0ada7f0f91ce22213a5210fff6cb718bf34ab9e6372ccb3305"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scene/light.js: FileTooLong \u2014 668 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: Light (138-1265). The bar is 500 significant lines; this is 168 over it, 1.34\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":"src/scene/light.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a9e42f33f9d594118341885e58a638d45f81ad8f36f0c0e875388848ad2732c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Vec2: TooManyMethods \u2014 40 methods. The bar is 30 methods; this is 10 over it, 1.33\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":"src/core/math/vec2.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f3288b1abdb8d09e3babc58f8206fe356a74785dda1c3c4641da6c6eec9c1e"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MeshInstance: ClassTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. The bar is 400 significant lines; this is 133 over it, 1.33\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":"src/scene/mesh-instance.js"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fafe5b4244271d716ed1bab56a85c5abcd7d41cd8b61d3332e858b1a948f5a3"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Camera: ClassTooLong \u2014 527 significant lines (blank, comment-only and punctuation-only lines excluded), 27 methods. The bar is 400 significant lines; this is 127 over it, 1.32\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/camera.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fa7380fd357539d0856359e4192671dbe1065a7d60723b7da92b26d62eae2ba"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exporters/gltf-exporter.js: FileTooLong \u2014 657 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 84% of them inside a single declaration: GltfExporter (145-1160). The bar is 500 significant lines; this is 157 over it, 1.31\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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ca4d5c24a943c262c2580d2b388936fcd9384a42c182c95fe2eba5961f81079"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webgpu/webgpu-shader-processor-wgsl.js: FileTooLong \u2014 650 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 61% of them inside a single declaration: WebgpuShaderProcessorWGSL (474-1343). The bar is 500 significant lines; this is 150 over it, 1.30\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":"src/platform/graphics/webgpu/webgpu-shader-processor-wgsl.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f058f9e57b93288fa8bd9c8d4e58c697ee7c244d979be7d7e610661a63b16a8"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Texture: ClassTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), 24 methods. The bar is 400 significant lines; this is 118 over it, 1.30\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":"src/platform/graphics/texture.js"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b0c0d50c6fb93f9539e2229c7f888f2361cbb057e777457eb5bad2956ca1437"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: MiniStats: ClassTooLong \u2014 518 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. The bar is 400 significant lines; this is 118 over it, 1.30\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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbb500ee758d05af5ce6dfe6a0928a19fb76f53b27d1a5228362bf6250cdbbca"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: math/mat4.js: FileTooLong \u2014 645 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: Mat4 (48-1343). The bar is 500 significant lines; this is 145 over it, 1.29\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":"src/core/math/mat4.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"176a7cdb2d0a124be01f8d587a8bbeb341cfaf25d817e2b8b9938fa0295e4232"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: renderer/renderer.js: FileTooLong \u2014 641 significant lines (blank, comment-only and punctuation-only lines excluded), about 87% of them inside a single declaration: Renderer (156-1442). The bar is 500 significant lines; this is 141 over it, 1.28\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":"src/scene/renderer/renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39de5c4945a806ef251c1c13a43ca88f81bd72ffe9ecb9f9762b9ac028da553a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ElementComponentSystem.initializeComponentData: MethodTooLong \u2014 initializeComponentData runs 128 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 28 over it, 1.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":"src/framework/components/element/system.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"499d332433cfbf27be0162fe9c3bd5b9aa19e63f976ed7ecb64d8d30123486a5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: XrMenu: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"507d6cda3b049c4980092c43aa46193420eb89c3dc6e64cf0953cdbb27defc6e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TextElement: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/text-element.js"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"274996c86704fbc2b0aae50e6fe1b000fa0eda333438d8d05dd720bf1d11fddc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Renderer: TooManyMethods \u2014 38 methods. The bar is 30 methods; this is 8 over it, 1.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/renderer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ffbf024f7c084250c6aca54fdc11973af1aaf9e491bdde19f53df262d44a92"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: lightmapper/lightmapper.js: FileTooLong \u2014 620 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: Lightmapper (66-1165). The bar is 500 significant lines; this is 120 over it, 1.24\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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"02991ba6129da87baf467144500b36976d2b45c37adbcb8cb9f56808e9f4edc8"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: standard-material._defineMaterialProps: FunctionTooLong \u2014 _defineMaterialProps runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\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":"src/scene/materials/standard-material.js"},"region":{"startLine":2216}}}],"partialFingerprints":{"codehealthFindingId/v1":"d039257ff0d03fa2b0d8337ae7308a5435b00885b8eb91c549c8d0e2da3b2e30"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Vec3: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/math/vec3.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6aca3302f76fbdb2e9e11b8a86dbedce6f05decd1c2f5a185087947707c3a3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NullGraphicsDevice: TooManyMethods \u2014 37 methods. The bar is 30 methods; this is 7 over it, 1.23\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/null/null-graphics-device.js"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"903158fd3481903d4448920958ac8ad42d424188e9deafc65fcf224aa8411972"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scene/mesh-instance.js: FileTooLong \u2014 601 significant lines (blank, comment-only and punctuation-only lines excluded), about 89% of them inside a single declaration: MeshInstance (285-1892). The bar is 500 significant lines; this is 101 over it, 1.20\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":"src/scene/mesh-instance.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"829f405e97eafd338c5aa0b797bcc8c452fdcafeeb87e2fb097a72eab955a198"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Mat4: TooManyMethods \u2014 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/math/mat4.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b8357277803ee3ab159ba3ddeca3623aa087d9fc507cf6ef90fa9b0705b3919"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ModelComponent: ClassTooLong \u2014 480 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 80 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/model/component.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"795c22896b8c93db846cccc9c78276505e51b95489db497c0c5ea5a8dc2ffa5b"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WebglGraphicsDevice.draw: MethodTooLong \u2014 draw runs 120 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":2148}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0e89fcdb17679d9eaad60a8fc3f1df993b2eeb9518852fcde48ff415f180e6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: input/element-input.js: FileTooLong \u2014 598 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units), about 79% of them inside a single declaration: ElementInput (356-1219). The bar is 500 significant lines; this is 98 over it, 1.20\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":"src/framework/input/element-input.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b73a5e2eaea15f66d6bb74877907b8bc8d1a469b7d7e41c4d1aaa91968395074"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: renderers/wide-line-renderer.js: FileTooLong \u2014 597 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 97 over it, 1.19\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":"src/extras/renderers/wide-line-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f0463755c93698fd77cb23bc08d0c1791701a7013e4c9ab83615393d176064"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ElementInput: ClassTooLong \u2014 475 significant lines (blank, comment-only and punctuation-only lines excluded), 34 methods. The bar is 400 significant lines; this is 75 over it, 1.19\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/input/element-input.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1f92b7b68eb5ee5b503726dbec4fbd24fb92cf52ee483bb218ffbcad6883d25"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GraphNode: ClassTooLong \u2014 470 significant lines (blank, comment-only and punctuation-only lines excluded), 60 methods. The bar is 400 significant lines; this is 70 over it, 1.18\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graph-node.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"80b02b30a503d30be7345599f771c5629ccae833427f99e16458d4d8eafe0017"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scroll-view/component.js: FileTooLong \u2014 582 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: ScrollViewComponent (59-1366). The bar is 500 significant lines; this is 82 over it, 1.16\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/scroll-view/component.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"377a180f452a475e24568e8253f3e72aa554b9be9e76af27a371b17e5b8a367d"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: BatchManager: ClassTooLong \u2014 460 significant lines (blank, comment-only and punctuation-only lines excluded), 23 methods. The bar is 400 significant lines; this is 60 over it, 1.15\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/batching/batch-manager.js"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cb1a69acb2eae48849d744bba2bd1434b4d78d7c7001c383ee87cc77bfa96d6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: graphics/graphics-device.js: FileTooLong \u2014 571 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: GraphicsDevice (58-1979). The bar is 500 significant lines; this is 71 over it, 1.14\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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5d3a5f4fb73597a33c670d29b02524c6a1b50e87bb3dd2cb5b0b4d3dc06df3a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: gsplat-unified/gsplat-world.js: FileTooLong \u2014 570 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: ALLOCATOR_GROW_MULTIPLIER (56-1322). The bar is 500 significant lines; this is 70 over it, 1.14\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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff07028532dd80f432788eff6056bc9b18e10f141d331716f0274edaba8821b2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Lightmapper.bakeInternal: MethodTooLong \u2014 bakeInternal runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"963056904759c2d873373d75b4606c0bdc9709bea87a4d7c66a4c4514d669510"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: ParticleEmitter.constructor: MethodTooLong \u2014 constructor runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/scene/particle-system/particle-emitter.js"},"region":{"startLine":242}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a45b379bbd4ee941309f7471d7d70cc41f076a36be2d8482bdd34b896fe8aed"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: xr/xr-menu.mjs: FileTooLong \u2014 568 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: XrMenu (88-1620). The bar is 500 significant lines; this is 68 over it, 1.14\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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d61abd2a6c6bebe8cd4df4bf2966b8c3f9289ebe7a4d3461409f0ac041c08d74"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AnimComponent: 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":"src/framework/components/anim/component.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d95dc07148c26dc1cff585c11b9094544082a4ad02d70f1c630c987edc9ee35"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ModelComponent: 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":"src/framework/components/model/component.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"449909d3f5d6f7ad25a15c16324a98f5f211f60bf9b3eea04b7466a4bcab3554"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ElementInput: 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":"src/framework/input/element-input.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf31836bd227eec87c2748de453d9687afc1c2ab6b5cef7dc05792b8db24ddbd"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ScriptComponent: ClassTooLong \u2014 452 significant lines (blank, comment-only and punctuation-only lines excluded), 29 methods. The bar is 400 significant lines; this is 52 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":"src/framework/components/script/component.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"616a7301d8c737e5af0607421f366cab19eda0a2fb7f2ebfa41e8b0827024d15"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scene/camera.js: FileTooLong \u2014 554 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: Camera (47-1164). The bar is 500 significant lines; this is 54 over it, 1.11\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":"src/scene/camera.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acd69d46d6cb74cbfa8ba4e53958c68c2eb26dcadda90307a92fc215b64a4484"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mini-stats/mini-stats.js: FileTooLong \u2014 552 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: MiniStats (120-991). The bar is 500 significant lines; this is 52 over it, 1.10\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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e9e33bbb4e8095719ff1111fed03dcbf50e3a5083de542210233c5c5549a994"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Vec4: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\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":"src/core/math/vec4.js"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1f2bcc39e0a77c26ca0a36b6d50f99ba551abd45b27753380a8c29ca6b37dff"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Material: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\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":"src/scene/materials/material.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"329fb4c5c310cf708952f506af91c05394db5033bdaebbd828d5ba9b24a61ae3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MeshInstance: TooManyMethods \u2014 33 methods. The bar is 30 methods; this is 3 over it, 1.10\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":"src/scene/mesh-instance.js"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e26982584b92c3aedfa0dbb970658f70bc3502165e7998508931aac3d87603a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GSplatWeather.initialize: MethodTooLong \u2014 initialize runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/gsplat/gsplat-weather.mjs"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d0a48bcb7be4c98d36f28a5c35687cf447adcf9c4c7c3726acbfd3194267bfb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SogBundleParser.load: MethodTooLong \u2014 load runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d8a4833038e67725c468c4d63c0024b340d1535d39c6ef167d8492b9c89c41a"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: DdsParser.open: MethodTooLong \u2014 open runs 110 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 10 over it, 1.10\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/dds.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"253cc8ccb70673d3cedda80e48c72cbb5062e50796f3f220bbcade944c520a0b"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: SpriteComponent: ClassTooLong \u2014 436 significant lines (blank, comment-only and punctuation-only lines excluded), 21 methods. The bar is 400 significant lines; this is 36 over it, 1.09\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":"src/framework/components/sprite/component.js"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2386dd2b5f10fad8a812ba7d5f7bdfca13a15f6c5c8fe2091eceffff78feda4"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GSplatProjector.dispatch: MethodTooLong \u2014 dispatch runs 109 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ea9a6321a7628240342896ff97d7bf5958a3df0b3c4f78349ab6148d5c8f9a"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ButtonComponent: ClassTooLong \u2014 435 significant lines (blank, comment-only and punctuation-only lines excluded), 50 methods. The bar is 400 significant lines; this is 35 over it, 1.09\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":"src/framework/components/button/component.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"56256d3e1f6e6385566cda337a1337e7172c54b8530fee55042776c00a31c557"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: graphics/texture.js: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: Texture (70-1612). The bar is 500 significant lines; this is 43 over it, 1.09\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/texture.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9666eee34468cbe3c1281363916ca8b02245297183fae827e9ac4bd4f750e9c4"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: StandardMaterial: ClassTooLong \u2014 432 significant lines (blank, comment-only and punctuation-only lines excluded), 14 methods. The bar is 400 significant lines; this is 32 over it, 1.08\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material.js"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb6bb44270f4d00b793119edc82dc7e222086f7a079372c07ce0bfda25b4339e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: GltfExporter.writeStandardMaterial: MethodTooLong \u2014 writeStandardMaterial runs 108 significant lines (blank, comment-only and punctuation-only lines excluded) 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":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"536b78abc5b38f41f548cd5b3aa5aad54e041c78b49010a6480752b1a572ac5f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: render-passes/frame-pass-volumetric-fog.js: FileTooLong \u2014 538 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 38 over it, 1.08\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":"src/extras/render-passes/frame-pass-volumetric-fog.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af8cb70b8c0a5c1abb6e45ba89e578749bc9a734c2a9c22d9bfc331ff65dcb9e"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: WorldClustersDebug.render: MethodTooLong \u2014 render runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\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":"src/scene/lighting/world-clusters-debug.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"3873b3e2a04219c5be6c79a063ed669baf6d4893d0818970b687c8e01491856f"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: RenderComponent: ClassTooLong \u2014 418 significant lines (blank, comment-only and punctuation-only lines excluded), 31 methods. The bar is 400 significant lines; this is 18 over it, 1.05\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":"src/framework/components/render/component.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ae73f89068eb880af4014bdcde494fa25b5edf33755d8f977e5653a3f34a7e1"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AnnotationManager: ClassTooLong \u2014 417 significant lines (blank, comment-only and punctuation-only lines excluded), 19 methods. The bar is 400 significant lines; this is 17 over it, 1.04\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":"scripts/esm/annotations.mjs"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"573ef64e3ad298d39502796ab8ad249ebd0909cb287d8276b87c2b4d83e278d9"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: ElementComponentSystem: ClassTooLong \u2014 417 significant lines (blank, comment-only and punctuation-only lines excluded), 13 methods. The bar is 400 significant lines; this is 17 over it, 1.04\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":"src/framework/components/element/system.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdc688cb36171cc9a09827c57023ea57f6c530070c6b79ef9515f6ec0daa468d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: RenderComponent: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\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":"src/framework/components/render/component.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a4ec611457d5e5366dae536256c253d4fae10485ddef45abc9a23f1f71b5b3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LayerComposition: TooManyMethods \u2014 31 methods. The bar is 30 methods; this is 1 over it, 1.03\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":"src/scene/composition/layer-composition.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f59c2bd985ac3938cbbad6c94de38f334c70a96c2199be92cad8f3a9cb85e8a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: utils/esbuild-build-target.mjs: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 16 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":"utils/esbuild-build-target.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc2e17323c83b6932315b55ae3fe4d3f1e03dd589e03d4257ac515467dcc4c22"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: CameraFrame.postUpdate: MethodTooLong \u2014 postUpdate runs 103 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 3 over it, 1.03\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":"scripts/esm/camera-frame.mjs"},"region":{"startLine":802}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4c37c3458cbd629deca7574c88651daaef57a935dcaa1f5a783274c9355b506"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: GSplatHybridRenderer: ClassTooLong \u2014 411 significant lines (blank, comment-only and punctuation-only lines excluded), 25 methods. The bar is 400 significant lines; this is 11 over it, 1.03\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":"src/scene/gsplat-unified/gsplat-hybrid-renderer.js"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df1f85ac9340f4f4221144e60b4212ee031d15629b54521f20aa0374d61b80e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: scene/graph-node.js: FileTooLong \u2014 511 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: GraphNode (122-1866). The bar is 500 significant lines; this is 11 over it, 1.02\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":"src/scene/graph-node.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"085b5acc2c1de7a8b8795ed6eda0bc6bec992963885835c1441c37cf97daa53c"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: vat-converter.sampleAnimations: FunctionTooLong \u2014 sampleAnimations runs 102 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 2 over it, 1.02\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":"scripts/esm/vat/vat-converter.mjs"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"72740429bb801db6c8e5190f237825b54fb935e4c530d681ca8a80a8a1efc785"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: Material: ClassTooLong \u2014 406 significant lines (blank, comment-only and punctuation-only lines excluded), 33 methods. 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":"src/scene/materials/material.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5a2d965d884b79afa70edafda17ca865fb6cb7e84e445f3570ae3270dfc9ba2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: batching/batch-manager.js: FileTooLong \u2014 501 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: BatchManager (66-954). The bar is 500 significant lines; this is 1 over it, 1.00\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/batching/batch-manager.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"292deb842e9aaa108cd8c9ded68e44340281db79422b558d7e6ae17e395a78ad"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CollisionComponentSystem (LCOM4 10): CollisionComponentSystem\u0027s methods fall into 10 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 10 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":"src/framework/components/collision/system.js"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"7496d02e908b93d118245887c0bbeb24d5f4e25066d4896bf20a9b9271c79092"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: GraphNode (LCOM4 7): GraphNode\u0027s methods fall into 7 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 7 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":"src/scene/graph-node.js"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"60d3de584fdacb76d2f2b8cfacd3ef4f0890d5596d623f375125fc520036f7c2"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ElementComponent (LCOM4 6): ElementComponent\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":"src/framework/components/element/component.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef28930c560320a86418ef5bd1464ba3092b5cdd7307c3db39b862c84920e45f"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ScreenComponentSystem (LCOM4 6): ScreenComponentSystem\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":"src/framework/components/screen/system.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"4aa1f99b4fc595047ec1619931adba5eb496e768c49e47e4c65002e1216cb569"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Layer (LCOM4 6): Layer\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":"src/scene/layer.js"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"ede1ba53834c8bfb3b707f5f1a96f4bec2a388c6f73c5cb225656f47c6cc73c2"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Renderer (LCOM4 5): Renderer\u0027s methods fall into 5 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 5 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":"src/scene/renderer/renderer.js"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"84649e8c56386906a5c3e38df1e9fddbb1fddd3d59e6fca1eaea4e935c694b31"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: JointComponentSystem (LCOM4 5): JointComponentSystem\u0027s methods fall into 5 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 5 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":"src/framework/components/joint/system.js"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b078328e03f2872343ad13ce9bee9a3e2a0f54c0e30da5a6af1cca705c8f541"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Camera (LCOM4 5): Camera\u0027s methods fall into 5 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 5 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":"src/scene/camera.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"a473a3b45e0eaba0456ce2db8af151fba6714a816ce8564703850f4244bc0a61"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: RotateGizmo (LCOM4 5): RotateGizmo\u0027s methods fall into 5 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 5 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":"src/extras/gizmo/rotate-gizmo.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"6fc832782bfd99277e02c2a44bcb8f151aff667eb0d3ef1be185ca32105d9f7c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ShareDialog (LCOM4 4): ShareDialog\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":"examples/src/app/components/ShareDialog.mjs"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73a10ab27a2c304a322bb662b6aef646d4570413a6d86369d0297fcfa195e3c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Scene (LCOM4 4): Scene\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":"src/scene/scene.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad9d4bc586b19ff4ba291c88d3cf31a2ea45854bec236aac323443ad8a1e8717"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: GSplatCompressedData (LCOM4 4): GSplatCompressedData\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":"src/scene/gsplat/gsplat-compressed-data.js"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"7532a97129c4856198640b85d8fbfdd43c0a22d2708ef6b29c22d23f3f5d196a"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: CollisionComponent (LCOM4 4): CollisionComponent\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":"src/framework/components/collision/component.js"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"09b5b31a95465d383e773f293734027f147eb19f46e276274944f997bf7807d7"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ImageElement (LCOM4 4): ImageElement\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":"src/framework/components/element/image-element.js"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c3ccecb2652c932a58f256cb09675cbb921c3be2996e7baac115f22e187b235"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: WebglTexture (LCOM4 4): WebglTexture\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":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"b25526062782346eeddd2fd973341c3e54bf3d4ee21b2e673fcd94bd2d3f7119"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: TranslateGizmo (LCOM4 4): TranslateGizmo\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":"src/extras/gizmo/translate-gizmo.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc92c65dee21128ed6fc3e2cab4050bf76e6e2c56b4fb059e99f8272d6da5a3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/core/read-stream.js: 4.6% line coverage (8/174)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/read-stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a10634b2ae5a14abbc5108bb1eda3de649fab0d8f1e6d855bce4a5ca74739c8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/core/ref-counted-key-cache.js: 15.3% line coverage (15/98)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/ref-counted-key-cache.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"732d034331f9c38b63c943dc4d2e05d9cb412b55145c8d7e57268ba924162871"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/core/tags-cache.js: 32.9% line coverage (53/161)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/tags-cache.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a49d7da58b4f63a8b5ad4d5f8e5cb1391f8e905303de6995c5e3e84e8b23537e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/core/shape/tri.js: 22.2% line coverage (34/153)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/shape/tri.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"58869c341ac7e0b53c554936461566a03c2d34d39618fd60fc43bc00e0c25f67"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/exporters/core-exporter.js: 26.3% line coverage (44/167)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/core-exporter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24e8c5aac7fea2070ed043b41fe37e398e7d39ff20d360db4172c6d3c8eaaf7f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/exporters/gltf-exporter.js: 24.0% line coverage (279/1162)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ad3016a842cab33fa4539dd4a294f9a9674bfab27e04e449016012f2e05fb31"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/gizmo.js: 7.6% line coverage (58/762)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/gizmo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"344411ea4413a14399145f9a990ba468561a71d31f49ce234d2857183ecb96a8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/mesh-line.js: 22.2% line coverage (22/99)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/mesh-line.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be0c30dcdabd40df090a39696c86778fcf71b9ad020e8adc4e27f8032e7dee63"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/rotate-gizmo.js: 8.7% line coverage (70/805)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/rotate-gizmo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59dea912cc00361842fbae2b94041fbb1c9e01203ef4cb3750fa5e47ec1ea05f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/scale-gizmo.js: 10.3% line coverage (62/600)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/scale-gizmo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29e499d77d81980fea6076829bcae580cee04657c216e7713862419abf603fe6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/transform-gizmo.js: 7.9% line coverage (63/800)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/transform-gizmo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7ef495e9ff741d7de6793ff225ad5e49876ff3d72b529bb579fd3b8d5826169"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/translate-gizmo.js: 10.5% line coverage (63/601)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/translate-gizmo.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d38c57fb96061ea0f56f481536f17519c764143d930efb691608e851fcc6113e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/tri-data.js: 20.0% line coverage (18/90)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/tri-data.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d839822132b4abdaca48f7233d15634b661f92955aa7138d821ed37bd120a47"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/view-cube.js: 3.5% line coverage (15/430)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/view-cube.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fd7fba2cd04ea89467973ad8e7fa8d51b684f025e65560d21a1e22b36e56efa"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/arc-shape.js: 10.1% line coverage (22/218)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/arc-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"acadd45253164bcca7234948397f745faae3149570f7e99717d304a973aa05fa"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/arrow-shape.js: 11.4% line coverage (30/264)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/arrow-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cc45a1fff3c48efd0dfd5e3c4507ae71fad4f87b414d67c6848f9dc51bcd93d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/box-shape.js: 21.5% line coverage (17/79)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/box-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"13892d1289435e3ada0b7eadadbaa64be2da25bf54c6b5b49fd719e2973981bb"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/boxline-shape.js: 10.7% line coverage (29/272)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/boxline-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b01205e94a75b6070186c32185b7287b8b99fcc53b0786cb5ec2063e6832cbf0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/plane-shape.js: 14.0% line coverage (22/157)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/plane-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"833d53149df345e1e35dc10da7d85f2043d566ac0404fa3e0f767d0184cfb6e6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/shape.js: 13.2% line coverage (42/318)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e5e8883f5e96f06da49810bba290a75f9d6196808161e4e8ac5b799e55e610"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/gizmo/shape/sphere-shape.js: 20.5% line coverage (17/83)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/sphere-shape.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b60f030d2000384dc65332c2d491f579d2cff2cc4e37dedb13f6f3c365ca59d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/input.js: 29.9% line coverage (89/298)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/input.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ed1de221095e9ae786e55c5493cfa5ffcc7a6290798e99b7ba32fa5424af320"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/pose.js: 9.5% line coverage (20/210)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/pose.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b11ee2185c7c68a167cbe46f21626b2005be4c6c47d27d7dfdedfc7f33aaec"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/utils.js: 20.0% line coverage (5/25)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"092e910bc89f7d4c52a2ec2b2137e5dd44aa2e11d909e56fbd7db7f444a982cf"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/controllers/fly-controller.js: 25.0% line coverage (29/116)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/controllers/fly-controller.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8abd5d10de61238d60d4757ec30e22e9e125dcd7516cd03c9b6b8b63d8485f25"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/controllers/focus-controller.js: 23.1% line coverage (27/117)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/controllers/focus-controller.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0af4183b05711ae372a29f15f18304e773e7157b350d616c9de05d337aba3d22"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/controllers/orbit-controller.js: 16.5% line coverage (26/158)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/controllers/orbit-controller.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ab0b30184459a31f454f0236c6e0badd50ef4eaef8038a1ab2f327e4411e78"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/dual-gesture-source.js: 13.6% line coverage (38/280)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/dual-gesture-source.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fda621c723206f55d9d055d05caf386b0fbe87f22c6dbb7cb2ad38732457dbf"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/gamepad-source.js: 35.4% line coverage (35/99)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/gamepad-source.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c313c5cf81883aa824b676edbc6db6eb3c0df463cc908d239164fc916e7cf89"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/keyboard-mouse-source.js: 19.9% line coverage (72/361)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/keyboard-mouse-source.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ee90d32669d8fdcd98e9e10b814fcece40c5b0f7d04ac280c75e1955be95f8e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/multi-touch-source.js: 11.7% line coverage (24/205)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/multi-touch-source.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25cb58433743bab4e498490149748efc6b040f32e28cf2481409d8f324f6889e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/single-gesture-source.js: 9.4% line coverage (21/224)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/single-gesture-source.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33a555142da5e21949b880394b4eeb7f36bfc79a7e2b4d7b4fda52c45801e09e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/input/sources/virtual-joystick.js: 10.8% line coverage (8/74)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/virtual-joystick.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e77274a8d70becf2919fc4cf92f601aa04ee7ca92dfa8751a0fbd3226eac9055"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/mini-stats/render2d.js: 43.9% line coverage (130/296)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/mini-stats/render2d.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"37d93c048a7d94a058b63c4fc6136516e036b11dc24168d1dcc94fd2068a04e0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/mini-stats/word-atlas.js: 35.2% line coverage (43/122)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/mini-stats/word-atlas.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa33468bff4e5608dcc4c515bcbae4e81a7b4a71e18c5b4c2f598e38c18cd9ef"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/render-passes/frame-pass-volumetric-fog.js: 13.9% line coverage (141/1011)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/frame-pass-volumetric-fog.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"97496e9e442b347ca381bdefb3053cbb63b549bb1ebc57ff537b6d0f111b30de"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/render-passes/render-pass-depth-aware-blur.js: 34.5% line coverage (20/58)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/render-pass-depth-aware-blur.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3094cffc9c035977b95294d16b1c2f412a16a358a9b356ac9ee190defb36bf6"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/extras/render-passes/render-pass-ssao.js: 11.8% line coverage (26/220)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/render-pass-ssao.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"954ff8e6a032a2ca37732c8d7a010c897c09a7fdf1de76783e39a7fcafc1a444"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/components/camera/post-effect-queue.js: 38.3% line coverage (151/394)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/camera/post-effect-queue.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"04752a41e8534791a901f13ded587eefa2557329361815dfe8101ada9c07a118"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/components/element/text-element.js: 22.5% line coverage (532/2367)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/text-element.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17963be7878fea5c9267c8b185d637edff1c3b512a60f00abf58bf919a7be10b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/font/font.js: 30.3% line coverage (33/109)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/font/font.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"95101a7c48236ebf08b9d4c25c06523c266c3dd84324972d572195f035eb3175"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/graphics/picker.js: 33.8% line coverage (186/550)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/graphics/picker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb9a4e03965dfba7877928c27c250e312f01766f0ad652d27a27bd511d4bf9b5"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/graphics/render-pass-picker.js: 12.1% line coverage (25/207)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/graphics/render-pass-picker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e715f6c8fa5d7c03f1a399627c304d2a1cb87d7a2ad03f8d9d6d4fa96f55d73a"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/graphics/scene-depth-reader.js: 10.9% line coverage (61/562)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/graphics/scene-depth-reader.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fd08e1b76078f3b67513dba8878617befeb5734e328f81985fcb4f35cd777e7"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/gsplat/gsplat-processor.js: 21.1% line coverage (106/503)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/gsplat/gsplat-processor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ff832761c7259e9153d76f5bb184429eb8ef17f287238f89a5126a909df65bc"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/handlers/basis-worker.js: 1.1% line coverage (5/471)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10c573e3768be0d32c1a68fffd0238de8704e5a5072d20b236f8d7a5148bba86"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/handlers/basis.js: 29.4% line coverage (105/357)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5477dadd9a544e855a717a8f431b3ab53b4fbe325537f2ba6dfe114f48e859a0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/handlers/container.js: 36.3% line coverage (81/223)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/container.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03cfa10fc2f8cf69f59d20d794800834155dd15aa7dd7741a30b5ad5dbbd221d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/handlers/texture-atlas.js: 36.4% line coverage (86/236)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/texture-atlas.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b16e5bedc161178ee89613710c1da0916f0db302593542367d463502c43009"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/bake-light-ambient.js: 33.9% line coverage (19/56)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/bake-light-ambient.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"08aec2670fbe996c589b80dcaf83d26e773045611f5d50dd13a012fc709ff727"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/bake-light-simple.js: 36.2% line coverage (17/47)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/bake-light-simple.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"54f3db483413162966e0b269646fad22a0ddd246b0973f0ff57c3f6ef17be466"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/bake-light.js: 23.3% line coverage (20/86)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/bake-light.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"334b08e2edc8bc5f7c5b22994864cc7dbbf5df51da4877d0df930b8ebe0f3afe"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/lightmap-filters.js: 20.1% line coverage (27/134)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/lightmap-filters.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3bd5c7869cef28cb17198340d77693f409a5ef4efee6b9e3e7898ecc23417083"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/lightmapper.js: 28.1% line coverage (328/1167)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbaafa6f71e14e7528298b3b6a7bdeaf1892b4494dcf85a934d4ac3980d5f90d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/lightmapper/render-pass-lightmapper.js: 41.2% line coverage (14/34)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/lightmapper/render-pass-lightmapper.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d56b977c2e4d1b9896da0926b1c8b3d4694ab529612ffe4e5fd0dad947e14532"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/draco-decoder.js: 23.5% line coverage (65/277)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-decoder.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a93374b90e467a2bf0bbbfafba78eac0c3d54fdd6bd65fcd156625de83fb0b9c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/draco-worker.js: 1.3% line coverage (4/320)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b187c0badf5c67b96e9520f36fc2218010c9ca145ca8dbc673918509419b66"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/ply.js: 19.9% line coverage (129/647)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/ply.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7874d5aeb8ebc90e965ebd45922f6a72bef2580e870c44997e4a19658c27332"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/ext-mesh-gpu-instancing.js: 22.2% line coverage (16/72)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/ext-mesh-gpu-instancing.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c692747b7a3d35084765481fb086b94bc25a6c060d458f98b63bd21ac847e80c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-draco-mesh-compression.js: 14.8% line coverage (18/122)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-draco-mesh-compression.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c0e6976c40f5f1ed3051be2c23aa108bfd18c3de452f9d7bea0f73c5d362a93"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-gaussian-splatting.js: 30.0% line coverage (54/180)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-gaussian-splatting.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"524db552e7886d521fad710e95ff80ad02f524c428cb9c44308a7e905097ece2"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-anisotropy.js: 32.1% line coverage (9/28)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-anisotropy.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ecb614cb03438cc449bb203d8d4136e026a3266dd904cd590938509b783dc41"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-clearcoat.js: 17.0% line coverage (8/47)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-clearcoat.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f2995b3563eff4ed05272e3ed1654271fb2107cf8101ed85ad9f630cdec0d5c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-iridescence.js: 24.2% line coverage (8/33)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-iridescence.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbedfca04421be56f929ed76ae1a21738d1014b46f41c65491a081e0a4c71c17"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-pbr-specular-glossiness.js: 18.3% line coverage (11/60)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-pbr-specular-glossiness.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0cd8e97e8c4667d879e28223d892d6ab7d7f2d359e5c3076449b9855d27158f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-sheen.js: 32.4% line coverage (11/34)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-sheen.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f69b3894e012e42a85bfcbfe308ed62999818d23e8d98fb48d0d454e2630d37"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-specular.js: 28.2% line coverage (11/39)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-specular.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d43eee4816875adfc2108e43c53a73fe2acfadfc945574c73ee38a923b3db24"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-transmission.js: 42.9% line coverage (9/21)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-transmission.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c58ec7e991998353c348f60689fe115323c69142cb142fa94f2d930effb1609"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-unlit.js: 21.4% line coverage (6/28)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-unlit.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a6dd315f06ac8912e29b0031ac9f0cbf5815ba713554fa71b8e8107f5f436b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-variants.js: 48.4% line coverage (15/31)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-variants.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a7c4809febb064a834061411264caf8d7db820c1924f06dc4d35597461ce28"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/glb/extensions/khr-materials-volume.js: 33.3% line coverage (9/27)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/glb/extensions/khr-materials-volume.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"70eb4892985f581c651152d84ed0dbad26b568b73cde70b5706aeacab17b9d59"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/texture/basis.js: 37.3% line coverage (28/75)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/basis.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6576c7d5816ad496134d575d0da3c0fb59c40e722a48878eee8e9f978edfa950"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/texture/dds.js: 17.6% line coverage (30/170)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/dds.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52948beb7a3bfec5091300ed862aa3076473204494f36bfde2e46a26cc7c43bc"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/texture/hdr.js: 18.3% line coverage (36/197)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/hdr.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7150ebe1832b3aaddb63c25197867d37a712de40c241de9f1447080cddc0487"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/texture/ktx.js: 34.5% line coverage (59/171)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/ktx.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3724a8833a15a61e38a9014373719640537b5c792b05b48befc544c4f65812f0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/parsers/texture/ktx2.js: 26.5% line coverage (40/151)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/texture/ktx2.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c487041d052a2d71ba708f2fb02c1f44b468e9ee7dd6bac5273f7b7a793c321"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/physics/ammo/ammo-physics-joint.js: 30.0% line coverage (132/440)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/physics/ammo/ammo-physics-joint.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea145f0e025a270ed5371b271b1c1ff6eb73be0110adfc40e30bd80b40bd6ec0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/script/script-type.js: 42.1% line coverage (53/126)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/script/script-type.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c0c95347a2f4a8d63631e2d81a74e9ca029000178d6c5c1327845b5ca77fa9c"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/xr/xr-anchor.js: 13.3% line coverage (36/270)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-anchor.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00426669f40aa8e605b707fddbabc020961080a45cd44894fc9694f774a1ed4d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/xr/xr-finger.js: 14.9% line coverage (13/87)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-finger.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0eed1e31ca59d58041bc42bcfd3dd26c1244de7356f869cfe94fcd366678e6f3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/xr/xr-hand.js: 9.9% line coverage (31/313)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-hand.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"29eedc38a8d89e2756e75b124fcc0d506744514bcf319ffe32ec97925df37c42"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/framework/xr/xr-joint.js: 10.9% line coverage (25/229)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-joint.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dac818fba5d013bdcca44e524c786d39328f2e4f14cf62fc4e51643164449fc8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/texture-view.js: 22.3% line coverage (21/94)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/texture-view.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e193451c2d3ad3b8805468bd0d3e5fae47fdd5c436e4a761174830e64111c76f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-bind-group.js: 41.0% line coverage (16/39)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-bind-group.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"99462ae3963b005a262cdfa9c8f02694cb2a397d51fa5c80a4443b6da9380837"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-graphics-device.js: 42.6% line coverage (1391/3266)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b702dbf41afdc068ae6b93e8058416ae89f8dc31e8cd948beb898ac528334b5"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-render-target.js: 27.5% line coverage (140/510)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-render-target.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0b7acd12cdb881e173b832b33ddacc91f78214f2fa187ec9944454a8d90f9d5"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-shader-input.js: 43.2% line coverage (32/74)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-shader-input.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3d8ae673e1960fe18a353976bf9c8a29cad86ba365f1698859a8af228dddaea"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-shader.js: 7.0% line coverage (38/540)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-shader.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"81a87ab0b70cea5a94b7b0d6e5b8910aedcbcacea5b41bf0b504fd000c45206f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-texture.js: 6.3% line coverage (57/911)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a3f52bc9fae7b943ad108f5289ae3587a0767638930cad18ed1fbdeb55f69a3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-upload-stream.js: 7.0% line coverage (16/230)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-upload-stream.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9ce0168d64552fce75ca8710e6a4e226f6c381f5bff1ee95f13b825df4896d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-xr-bridge.js: 5.2% line coverage (17/325)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-xr-bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d04954b2ffd581707e083a777e63c6d32c8f875a04e5bb519ac695f484952e8"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgl/webgl-xr-msaa-copy.js: 25.6% line coverage (53/207)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-xr-msaa-copy.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8c40ccefbfc1a0ae3f33245f4b55d42fb2580604a4ebc41076a2c8a663556a3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-clear-renderer.js: 31.1% line coverage (41/132)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-clear-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4035b8643f51759dc5ac525e51ed8ebab4afe6b280883fd1b31f9c2108c0c9a2"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-dynamic-buffer.js: 9.7% line coverage (6/62)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-dynamic-buffer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf548e238cb55a4dbdbb43f1bb34030317ffa49affe1a075c2c62bee93d224e1"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-dynamic-buffers.js: 37.4% line coverage (43/115)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-dynamic-buffers.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9a9d7c432fdd99673425ad3c78c3fb6477603052d9a8ea8809a453b7649d173"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-mipmap-renderer.js: 12.0% line coverage (20/167)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-mipmap-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5efe2cbe4bc67e3a9ba36202b62623465fa6a376ce7edd6b730863fb0158582b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-query-set.js: 6.0% line coverage (9/150)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-query-set.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"152babd552e284d5702e46aa3929ee64228eb6d7efa26b45ac0a2691961d074e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-render-target.js: 42.0% line coverage (277/659)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"92a4de4fb956ef481b31bba1d1bbc3d40a854d2e6b21bdef5f1e95f69ef3dd54"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-resolver.js: 10.0% line coverage (19/190)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-resolver.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"342402a7b23016526cabb53ceb8f9661e5909774506d5a061e1a437a7fb88705"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-texture.js: 37.0% line coverage (271/732)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-texture.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"642c9431b9fcfea0dc5fd5caed81fecae283afb15dbfc244b81001e6e32d2c97"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-vertex-buffer-layout.js: 49.6% line coverage (57/115)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-vertex-buffer-layout.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"279b51257b26abba3d4b4a09becc1c33ad591326d3d3b631023bd9c412794db4"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/graphics/webgpu/webgpu-xr-bridge.js: 4.8% line coverage (17/353)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-xr-bridge.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b5440fc73d202bdf2bc0c111e34d494626df6ba44715ecd8a64f82ff413608"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/input/controller.js: 4.9% line coverage (21/427)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/input/controller.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b29b0bb9f792c727afa563c0fc15dc9aa1cce6116844a01f5f5496946f96ff24"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/input/touch-event.js: 33.3% line coverage (53/159)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/input/touch-event.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ec420e1b221e171b5263743723e144f627df3b20d16760758e8c8bdf19cabe1"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/platform/sound/instance3d.js: 12.3% line coverage (28/227)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/sound/instance3d.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86a2698637cd2b3dd6e77f053880b257e354376b2f9a163cd6161fa371b151d5"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/sprite.js: 47.3% line coverage (189/400)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/sprite.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d218233ffc40885df8995288013cd3bcd2c6716c2dab1b378493e84751565dc"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/batching/skin-batch-instance.js: 24.5% line coverage (12/49)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/batching/skin-batch-instance.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"435b54ad7e6a5b0254373bb23141472fedb27d6ace3a4c8c286914d2f2c58678"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/compress/compress-utils.js: 48.6% line coverage (34/70)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/compress/compress-utils.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"454f6557346fbdc98cc61d5f1bd038d1cfe5611450f1dc8f6e96f315c0775c18"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/compress/decompress.js: 38.0% line coverage (27/71)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/compress/decompress.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bed4638e0422b593ac6ff7041f6b02a3417ff0ef66acd5d28de055da20d0345"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/graphics/env-lighting.js: 32.3% line coverage (100/310)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/env-lighting.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"43e227bd683a33eb3f69fa032679594eb9c80226a233c529b3319ea2db393267"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/graphics/fisheye-projection.js: 11.2% line coverage (14/125)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/fisheye-projection.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a1b72c6ca0ab103e23d0bde19017337e49d8dedb95c5a6bae917deb01ebc2c5"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/graphics/frame-pass-color-grab.js: 12.0% line coverage (17/142)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/frame-pass-color-grab.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d7aecbf54bbfbe2e0510b56f0ad7b40146c858ea67fa966ff6062253ef4528b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/graphics/frame-pass-depth-grab.js: 11.3% line coverage (17/151)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/frame-pass-depth-grab.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a806ade70867a4af37773770660841d670d6e1acf77a4d9ccdbd61bfb8fde4f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/graphics/reproject-texture.js: 36.9% line coverage (192/520)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/reproject-texture.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e48637d409985a1201d99719b7a98010810493af8d4df05d8563590565a1ebe4"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-compressed-data.js: 5.2% line coverage (19/368)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-compressed-data.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"015beab3f16048a5640f435a90b53fd60a1e19cd584f499c6616f9cb7b019589"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-compressed-resource.js: 31.0% line coverage (39/126)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-compressed-resource.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3377747cbfe6322fc740b1b4e88e7b2a9a752b370c47dc5dd692fcb24d3757f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-container.js: 33.3% line coverage (68/204)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-container.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f87c7b64b02a7c7dbc6b0534e884614d974eca1e7873d4fecd4848d23e18f3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-data.js: 7.5% line coverage (37/494)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-data.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea834d345a8740bd625cb6aa00e34023a2455c32c3cc1d968698c23b3e442ab"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-instance.js: 10.5% line coverage (25/238)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-instance.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03c50165817d63e1ce5634960608232028aaf9c2e2cda4b7dfddd244a2f3fc41"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-resource-base.js: 7.9% line coverage (30/378)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-resource-base.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be6bdb096d08e2d5bd98ecedc1d01c555093cf3724fbcc61f7047d73edd78c6f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-resource.js: 8.1% line coverage (21/260)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-resource.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"50a26a19fef2f9ebf133f07fdd2c12f75618cd97a2cb009c504963d871fdb1a7"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-sog-data.js: 48.3% line coverage (271/561)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sog-data.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20466c0c92412a8fdd33a7a98ee57b160e90a03e3d600bb910d67840c2281a10"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-sog-resource.js: 29.7% line coverage (47/158)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sog-resource.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e076e30c14ba5037c21bf5007178986e1ae67f6ef4f001fd7deb71f54c14bfa"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-sort-worker.js: 1.0% line coverage (3/315)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-sort-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7960a742c644c0b19255b102483fc23295c0e184e92cba2e0f8ccef801bafd04"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat/gsplat-streams.js: 8.5% line coverage (17/201)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat/gsplat-streams.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"65e92a760bdaba04c25d17ea42355781b8f0d701ab553076250741cdaef0cfda"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-frustum-culler.js: 11.3% line coverage (28/247)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-frustum-culler.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14895fb585ed6d2ee6d7e3921c45a8950faa6579c364f002fd415b335c6f2062"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-hybrid-renderer-scratch.js: 38.9% line coverage (28/72)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-hybrid-renderer-scratch.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f76f82b8633d4334870037782deb1a142a04753ef3915943b6eaa0829b7434"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-hybrid-renderer.js: 26.6% line coverage (259/974)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-hybrid-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"38ab885c8a9cdb4c372f9a8d27cf95aaeae12a21144a0bbfa622dfcc1b7cbc3d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-info.js: 8.0% line coverage (42/527)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-info.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"80dde22a479684949fd89cadf74e7bf5e26f2fc5bc89bb5dfe97c6db2d9aab4f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-interval-compaction.js: 9.4% line coverage (47/502)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-interval-compaction.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be086df8516dd9f760472e915c6975996c1c99a03ced9a3d63d98293cbca545d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-interval-data.js: 42.6% line coverage (23/54)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-interval-data.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a02f9646af77880ecf75c4cefe18f8d597c834e7b05f55c1d9104eb079e673d0"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-manager.js: 8.9% line coverage (78/874)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-manager.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14d91be07cc9f6e8a8424658f958a8bb78726db4419d5168ff2de9a32e74d6c3"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-octree.resource.js: 8.4% line coverage (7/83)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-octree.resource.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"afe51b1dde43c5f1dbdb2ffc6a1e8a505fe3fe9b31c0eec0a291ccfc8e18451b"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-placement-state-tracker.js: 21.7% line coverage (13/60)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-placement-state-tracker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"119196dedf17059df5d1757d12e52ab2618352acab0959ec0a31da8bb4b0a1dc"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-projector.js: 10.0% line coverage (85/852)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b357ac005bfc802a1ed4f5ffbebbc1b4df66942b44d9619f9c4a5ed25dfc69c1"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-quad-renderer.js: 5.3% line coverage (26/489)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-quad-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7182ad32d7d0069ce6bbde0ab34a9f14bf855f620410da8fdeb0670254b6803e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-renderer.js: 18.5% line coverage (51/275)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6013e5082e8898b2e6c1ac0611e9271bfdf15765a0224b06f3ad57d6f3397c2"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-shadow-renderer.js: 15.7% line coverage (134/856)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-shadow-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2fd2bc137a06f16fa78b8cdedaf8ccb400bf6ecae53b188466c760f055fb109"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-sort-bin-weights.js: 39.2% line coverage (58/148)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-sort-bin-weights.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d56e57c80ae1edb2e8ddc1eaad613f24f56dea79fd59b94460bae4545f4ac27"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-unified-sort-worker.js: 0.5% line coverage (2/379)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-unified-sort-worker.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32821a85eb48973a9a4df0e25d14097420a736e4cb91dcac674757efb50379c4"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-unified-sorter.js: 6.5% line coverage (16/247)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-unified-sorter.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"83b8944465bae3b9698b62575a41444d253cef90b54cc85d26fb3e4ded759590"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js: 9.7% line coverage (35/359)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e822fc79286384186e8c1654317b4ce3993be472ad6fa61cae7fc6026505641"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-work-buffer.js: 9.8% line coverage (44/448)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-work-buffer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10fbcfc6d6d830a3227e33ad94981632849f407010f25293a17ea3c65eb9c8e1"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-world-state.js: 4.4% line coverage (16/360)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-world-state.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cb3d97dbcf59109a957c518919ae6fcdb5e63b370dad3c8b839da84d2716638"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/gsplat-unified/gsplat-world.js: 10.7% line coverage (142/1324)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f42146a1a3e1de92df9628d97d20792401b15df19acc145769b40650e62d22e"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/renderer/frame-pass-multi-view.js: 29.0% line coverage (38/131)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/frame-pass-multi-view.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c4e71c0b7a53a3d8ca83788bee08cd1be9880d12a8de1016552a4e7e192805f"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/skybox/sky-geometry.js: 42.5% line coverage (17/40)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/skybox/sky-geometry.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62dbb9e49d8856c6d53342d73e614890d30f459eb03d440bd7d8af188c7ef85d"}},{"ruleId":"D8","level":"warning","message":{"text":"Low coverage: src/scene/skybox/sky-mesh.js: 20.0% line coverage (23/115)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/skybox/sky-mesh.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e71a67fe50c395c2d9205e40b9e8bd434457d565b5c0c415fb5a438d153c1872"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: fires a drag:end event when dragging ends via touchend and stops firing drag:move events: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":211}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf2badb3801a4b3dd5521aca51088ceac7b69889ccde44d8620c696a6b472bae"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: fires a drag:end event when dragging ends via touchcancel and stops firing drag:move events: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"005bc81fe63d5cb7fea062f5bf0c87b8b75d72839b217984b495e54f4b3e9375"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes ancestral rotation in coordinate conversion: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"54b2563c4a1b24e9aa008f8f63f77e70f39700d3d315519609f0a41579c96692"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes ancestral scale in coordinate conversion: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":276}}}],"partialFingerprints":{"codehealthFindingId/v1":"042602b7aab07502acf54ccd4a42a9dc5ac371f94fee8b58d2e340dbdda37c2d"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes camera rotation in coordinate conversion: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":285}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e3dfb0a2c253868e4aba1b397685fec7edf1130ae9679ec8b9e6f5b0a9d1c13"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: includes screen scale in coordinate conversion and disables perspective when using screen space: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba657efab9709c88b6b66ae39c9fbacbedb3aaf43a0927c267427ee21f0cdfb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: supports an element that is a direct child of a screen space screen: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff6a054fdbf31bfef2b518b4325a8e0750a37be02b748a86215a25873e4ccf9b"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows dragging to be constrained to the X axis: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"37e70b9aad526dd8e8b57287f7a2ef06b3c4e8d4a2570f0222a255c5f9b91acb"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: allows dragging to be constrained to the Y axis: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e31431f28fe25cf048b6050d6cccb01c6b332a1153e3dc20443a358592b50fa"}},{"ruleId":"D10","level":"warning","message":{"text":"No assertions: takes device pixel ratio into account: This method\u0027s body runs code, and no assertion call was recognised in it. Recognised by name: Assert*, *Should*/ShouldBe*, Verify, Expect, Throws, Record, Received/DidNotReceive, MustHaveHappened/MustNotHaveHappened, EnsureSuccessStatusCode and *AndEnsure* \u2014 so verification routed through a helper of your own naming, through a base-class or callback object whose members hold the assertions, or through a harness that fails by throwing under some other name, is not visible to this check and is not counted here. Read it as \u0027no assertion this check knows how to see\u0027, and if that is right, add one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"test/framework/components/element/element-drag-helper.test.mjs"},"region":{"startLine":337}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c4f387d7ccb3085056eb8a7e6b23ab04357cd35bd74939722cc4473e823212"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/webgl/webgl-graphics-device.js: src/platform/graphics/webgl/webgl-graphics-device.js changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 47 in WebglGraphicsDevice.constructor at line 227. 3 of those changes were fix/bug commits, and the other 28 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/webgl/webgl-graphics-device.js\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":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"da5341e1531c4c1ab8c597c6f20d6e1d56f3f7ded81656fed7f4ea7074b96845"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/renderer/shadow-renderer.js: src/scene/renderer/shadow-renderer.js changed 21 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 58 in ShadowRenderer.cullShadowCastersOmni at line 292. 5 of those changes were fix/bug commits, and the other 16 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/renderer/shadow-renderer.js\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":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d9783aa527c7e55f2b4c8f2c01a5ff452baa0f04d16b2f6d82fae7bdbc53c0c"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/render-target.js: src/platform/graphics/render-target.js changed 12 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 67 in RenderTarget.constructor at line 356. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/render-target.js\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":"src/platform/graphics/render-target.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4fdec2cfdade8c13ec6710255790b0c31aa745ddd66131e8fd7121b1f1799c9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/element/text-element.js: src/framework/components/element/text-element.js changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 85 in TextElement._updateMeshes at line 863. 5 of those changes were fix/bug commits, so the churn is repair rather than feature work. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/element/text-element.js\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":"src/framework/components/element/text-element.js"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"a069802cc356ea38a5e4bb03f29de78a70ee4006560a1fd7ad1b4b8d918bb145"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/webgpu/webgpu-graphics-device.js: src/platform/graphics/webgpu/webgpu-graphics-device.js changed 31 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in WebgpuGraphicsDevice.draw at line 1339. 9 of those changes were fix/bug commits, and the other 22 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/webgpu/webgpu-graphics-device.js\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":"src/platform/graphics/webgpu/webgpu-graphics-device.js"},"region":{"startLine":1339}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3dd85c7bc5732e36ca50762c2ccd6f42409a2665ad5842577be4cf6b5bb444"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/renderer/forward-renderer.js: src/scene/renderer/forward-renderer.js changed 24 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in ForwardRenderer.renderForwardInternal at line 281. 2 of those changes were fix/bug commits, and the other 22 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/renderer/forward-renderer.js\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":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"11c415f272911860ff72f6be00b046034422dd1c7f075a983221bc0dffde21a4"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/app-base.js: src/framework/app-base.js changed 30 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in AppBase.init at line 567. 2 of those changes were fix/bug commits, and the other 28 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/app-base.js\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":"src/framework/app-base.js"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa93a5f3c109b9d58a8405af059e235255d49e1071034f68eb30b3cb22b243a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/element/system.js: src/framework/components/element/system.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 84 in ElementComponentSystem.initializeComponentData at line 105. 1 of those changes was a fix/bug commit, and the other 5 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/element/system.js\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":"src/framework/components/element/system.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"45e3c90c6af5f0f3bb0386e7b781b7e7acd0ba7f87ee8a9a37e229da3e7f4092"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/graphics-device.js: src/platform/graphics/graphics-device.js changed 25 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in GraphicsDevice.initCapsDefines at line 840. 2 of those changes were fix/bug commits, and the other 23 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/graphics-device.js\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":"src/platform/graphics/graphics-device.js"},"region":{"startLine":840}}}],"partialFingerprints":{"codehealthFindingId/v1":"9316e9fda13edead0e606b0cff3eaa7997904371624322b28b506462741f9dc9"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/renderer/renderer.js: src/scene/renderer/renderer.js changed 26 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Renderer.setCameraUniforms at line 468. 4 of those changes were fix/bug commits, and the other 22 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/renderer/renderer.js\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":"src/scene/renderer/renderer.js"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"027539acedca5950cc476f30275093710246c794013b363dd165b311d838bde7"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/shader-lib/programs/standard.js: src/scene/shader-lib/programs/standard.js changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 42 in ShaderGeneratorStandard.createShaderDefinition at line 355. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/shader-lib/programs/standard.js\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":"src/scene/shader-lib/programs/standard.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"30bb1d0415b846075754d58a125994cda49ce9b1e8e024c80f9e0eba831fe0df"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/mesh-instance.js: src/scene/mesh-instance.js changed 23 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in MeshInstance.getMaterialBindGroup at line 1749. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/mesh-instance.js\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":"src/scene/mesh-instance.js"},"region":{"startLine":1749}}}],"partialFingerprints":{"codehealthFindingId/v1":"41460eb2c0c29275b2be35298646968132af13950995253ec4dcc9044e50e48b"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/texture.js: src/platform/graphics/texture.js changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in Texture.setSource at line 1257. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/texture.js\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":"src/platform/graphics/texture.js"},"region":{"startLine":1257}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c8ce196fab697751d5af9f50fa68feaa308a4ddd1cc8cd0465d9c00f91b1c4d"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/extras/mini-stats/mini-stats.js: src/extras/mini-stats/mini-stats.js changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 40 in MiniStats.rebuildGeometry at line 770. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/extras/mini-stats/mini-stats.js\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":"src/extras/mini-stats/mini-stats.js"},"region":{"startLine":770}}}],"partialFingerprints":{"codehealthFindingId/v1":"201d5f4ec47bd68bce721199739813ec1ab7a663f551a898c6cac9c0f12ff269"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/materials/standard-material-options-builder.js: src/scene/materials/standard-material-options-builder.js changed 18 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in StandardMaterialOptionsBuilder._updateTexOptions at line 145. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/materials/standard-material-options-builder.js\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":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":145}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4974f8bf2301c3130fc9dcd8fd73770cbaa2da471db7708b12c37af97af7e83"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/gsplat-unified/gsplat-world.js: src/scene/gsplat-unified/gsplat-world.js changed 10 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 28 in GSplatWorld.update at line 462. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/gsplat-unified/gsplat-world.js\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":"src/scene/gsplat-unified/gsplat-world.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec43982dc3251018b6baec3a3fafd6220ea4388d76826340b2c0861b2054aec2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/collision/system.js: src/framework/components/collision/system.js changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 22 in system.recreateShapes at line 329. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/collision/system.js\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":"src/framework/components/collision/system.js"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"7cd1a1915061c467c9c6d5263c67a8fbdb81e2d5a4a1243337a478f8afd1b695"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/batching/batch-manager.js: src/scene/batching/batch-manager.js changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 34 in BatchManager.create at line 677. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/batching/batch-manager.js\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":"src/scene/batching/batch-manager.js"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e7b94cea77a46ac891c0dd5c1001aaac7bc4c5470a853cc6a88513ba0c4693"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/asset/asset-registry.js: src/framework/asset/asset-registry.js changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 29 in AssetRegistry.load at line 462. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/asset/asset-registry.js\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":"src/framework/asset/asset-registry.js"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"1743d2d597637edb7cfe9f75aacd1072daab70566b0b2e9dd842d0351d91b0d0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/extras/render-passes/frame-pass-camera-frame.js: src/extras/render-passes/frame-pass-camera-frame.js changed 11 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in FramePassCameraFrame.needsReset at line 442. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/extras/render-passes/frame-pass-camera-frame.js\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":"src/extras/render-passes/frame-pass-camera-frame.js"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1b2ab3e73d2d74c2cb17cf62d85b3c75b88a22d924baaeb2b0f04509ba98b1e"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/lightmapper/lightmapper.js: src/framework/lightmapper/lightmapper.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 33 in Lightmapper.bakeInternal at line 932. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/lightmapper/lightmapper.js\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":"src/framework/lightmapper/lightmapper.js"},"region":{"startLine":932}}}],"partialFingerprints":{"codehealthFindingId/v1":"877f9d7969545374887d09e529732f362c4b4b7ba1a8a89fa7ef46c240d721a3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/script/component.js: src/framework/components/script/component.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 31 in ScriptComponent.create at line 769. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/script/component.js\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":"src/framework/components/script/component.js"},"region":{"startLine":769}}}],"partialFingerprints":{"codehealthFindingId/v1":"a61659fd0e92f2de082252728e45f90b5ffe524bc6c2e75feeff5b6542b3a3aa"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/gsplat-unified/gsplat-director.js: src/scene/gsplat-unified/gsplat-director.js changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in GSplatDirector.update at line 349. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/gsplat-unified/gsplat-director.js\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":"src/scene/gsplat-unified/gsplat-director.js"},"region":{"startLine":349}}}],"partialFingerprints":{"codehealthFindingId/v1":"d777f6dfac4deebf558fb55da2fe570e81005fc7f7d3a2159c0a965518ef67f3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/gsplat-unified/gsplat-octree-instance.js: src/scene/gsplat-unified/gsplat-octree-instance.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 24 in GSplatOctreeInstance.applyLodChanges at line 634. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/gsplat-unified/gsplat-octree-instance.js\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":"src/scene/gsplat-unified/gsplat-octree-instance.js"},"region":{"startLine":634}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb03ef47b1d825f7fde28153a86dde0ffb12cd6d50b2861f405786ff31b697d3"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/gsplat-unified/gsplat-budget-balancer.js: src/scene/gsplat-unified/gsplat-budget-balancer.js changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 35 in GSplatBudgetBalancer.balance at line 85. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/gsplat-unified/gsplat-budget-balancer.js\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":"src/scene/gsplat-unified/gsplat-budget-balancer.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"91f40073921efc7f1e682044150a3bb34d130e76b5e32210b2e6ef2bb8927486"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/esm/xr/xr-menu.mjs: scripts/esm/xr/xr-menu.mjs changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 23 in XrMenu._updateRayInteraction at line 1548. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- scripts/esm/xr/xr-menu.mjs\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":"scripts/esm/xr/xr-menu.mjs"},"region":{"startLine":1548}}}],"partialFingerprints":{"codehealthFindingId/v1":"2aa601ee761b9ba749a71d8be884c166c4dba85736dc72d56abfaa9ecfa121a0"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/collision/component.js: src/framework/components/collision/component.js changed 8 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in CollisionComponent.onEnable at line 807. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/collision/component.js\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":"src/framework/components/collision/component.js"},"region":{"startLine":807}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fb4145321bd7129a55ba23eeb69583f8d912de7d91842fbfa4bfa50e36935eb"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/renderer/render-pass-forward.js: src/scene/renderer/render-pass-forward.js changed 9 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in RenderPassForward.renderLayerRenderStep at line 346. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/renderer/render-pass-forward.js\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":"src/scene/renderer/render-pass-forward.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"2327409025eca775f6e1675b9083ba9260e296ccb9cb071a299d500566c0fad1"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/gsplat-unified/gsplat-projector.js: src/scene/gsplat-unified/gsplat-projector.js changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 19 in GSplatProjector.dispatch at line 646. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/gsplat-unified/gsplat-projector.js\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":"src/scene/gsplat-unified/gsplat-projector.js"},"region":{"startLine":646}}}],"partialFingerprints":{"codehealthFindingId/v1":"23a8bcf7c6d46faaaff8be1007c7dbc7b5741f50708cbd47266e238ee51260ac"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/extras/render-passes/render-pass-compose.js: src/extras/render-passes/render-pass-compose.js changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 37 in RenderPassCompose.frameUpdate at line 378. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/extras/render-passes/render-pass-compose.js\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":"src/extras/render-passes/render-pass-compose.js"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"83663ca7c8b420afa64338f11bcd3ec9badb367e7f9bd3ea84b7eba9d5c3d3be"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/parsers/sog-bundle.js: src/framework/parsers/sog-bundle.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in SogBundleParser.load at line 188. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/parsers/sog-bundle.js\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":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"81694a5607f4d6f501b905addef53dc26b1f64a67598341f9b7baf784eeff223"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: scripts/esm/xr/xr-navigation.mjs: scripts/esm/xr/xr-navigation.mjs changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in XrNavigation.initialize at line 408. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- scripts/esm/xr/xr-navigation.mjs\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":"scripts/esm/xr/xr-navigation.mjs"},"region":{"startLine":408}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1de6cf8f4cb7345efe221196d840a46148cdeaf2b3f1066a5c9a15ac6c4506f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/components/element/image-element.js: src/framework/components/element/image-element.js changed 7 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in ImageElement.material at line 1052. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/components/element/image-element.js\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":"src/framework/components/element/image-element.js"},"region":{"startLine":1052}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9d7247a6476d010462f83793466f7207f05378576018b5fbc9a9c7c41f1764"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/extras/render-passes/camera-frame.js: src/extras/render-passes/camera-frame.js changed 6 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in CameraFrame.update at line 637. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/extras/render-passes/camera-frame.js\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":"src/extras/render-passes/camera-frame.js"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b272dec1a81216de22d04fc69c0d08ab87a405db638791cabe66793b141d648"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/parsers/glb-parser.js: src/framework/parsers/glb-parser.js changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in glb-parser.createMesh at line 418. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/parsers/glb-parser.js\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":"src/framework/parsers/glb-parser.js"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"475a58f644043f028855db5ee72365ab4972d8b414367897553bba33212091c2"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/script/script-registry.js: src/framework/script/script-registry.js changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 21 in ScriptRegistry.add at line 107. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/script/script-registry.js\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":"src/framework/script/script-registry.js"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"118af07bcc20f50ce59367f3440d9c3422f62a8ad09df03501b28e8b3ccf6bba"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/webgpu/webgpu-render-target.js: src/platform/graphics/webgpu/webgpu-render-target.js changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 27 in WebgpuRenderTarget.setupForRenderPass at line 578. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/webgpu/webgpu-render-target.js\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":"src/platform/graphics/webgpu/webgpu-render-target.js"},"region":{"startLine":578}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e25660dba834cfe388e54d4fc297c76665e13b246ee2e4f42b180ab96287522"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/framework/handlers/material.js: src/framework/handlers/material.js changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 20 in MaterialHandler._bindAndAssignAssets at line 173. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/handlers/material.js\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":"src/framework/handlers/material.js"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb52531aaedb7ac77deb8124f479950fdf7d171bc849f4b72efd9a422b1737fc"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/shader-processor-glsl.js: src/platform/graphics/shader-processor-glsl.js changed 5 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 16 in ShaderProcessorGLSL.processUniforms at line 289. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/shader-processor-glsl.js\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":"src/platform/graphics/shader-processor-glsl.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a6e95d1defa4b2f4ae2f70ebd4a2d9dec21c49432b06d98e3c2f9d17ea8ac3f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/renderer/culler.js: src/scene/renderer/culler.js changed 4 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in Culler.updateLightVisibility at line 342. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/renderer/culler.js\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":"src/scene/renderer/culler.js"},"region":{"startLine":342}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b224157cb0e12b9fb698a02c825315c34e7be42ebf56512c67ea0d3192c4c28"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/platform/graphics/shader-definition-utils.js: src/platform/graphics/shader-definition-utils.js changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 17 in ShaderDefinitionUtils.createDefinition at line 88. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/platform/graphics/shader-definition-utils.js\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":"src/platform/graphics/shader-definition-utils.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"f191285bf24330b6362775069ee37f31e33cfa7bc02c3400428a2c8d18591e66"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/graphics/reproject-texture.js: src/scene/graphics/reproject-texture.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 25 in reproject-texture.reprojectTexture at line 391. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/graphics/reproject-texture.js\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":"src/scene/graphics/reproject-texture.js"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"90258ba4ce196330fbc3efb10a1885d2a43d5cc601614770d558a1f3b4b0c87f"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: examples/src/examples/materials/parallax-terrain.example.mjs: examples/src/examples/materials/parallax-terrain.example.mjs changed 3 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in parallax-terrain.example.app.on(\u0022update\u0022) at line 347. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- examples/src/examples/materials/parallax-terrain.example.mjs\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":"examples/src/examples/materials/parallax-terrain.example.mjs"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"c072212e30bf8bb60d6c8bc038db072ee035ac96c79e6f54575e7852c5c76dea"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/scene/materials/standard-material-map-transforms.js: src/scene/materials/standard-material-map-transforms.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 18 in StandardMaterialMapTransforms.update at line 182. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/scene/materials/standard-material-map-transforms.js\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":"src/scene/materials/standard-material-map-transforms.js"},"region":{"startLine":182}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4c0f219795213d4e31c9cf398320e9e5020018034f0d48b0a1b9cc19428a196"}},{"ruleId":"D15","level":"warning","message":{"text":"Hotspot: src/extras/exporters/core-exporter.js: src/extras/exporters/core-exporter.js changed 2 times in last 90 days, and the most complex body those changes touched has cyclomatic complexity 15 in CoreExporter.textureToCanvas at line 39. 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-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/extras/exporters/core-exporter.js\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":"src/extras/exporters/core-exporter.js"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"51f7d8c82667c2310dbe98b022f5bb4991db8666211e2794822104f3e6ab0ba0"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: src/framework/parsers/sog.js: src/framework/parsers/sog.js changed 4 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 10 (its worst body is SogParser.loadTextures at line 127), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201CFix SOG parsers throwing when a load completes after app teardown (#9232)\u201D; \u201CFix sog streaming re-load returning destroyed textures from loader cache (#9039)\u201D; \u201CFix crash when unloading sog assets still referenced by the unified world (#9035)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- src/framework/parsers/sog.js\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":"src/framework/parsers/sog.js"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad79821a2ed89ce97774c4cfd4548c7774e296ba0f43226f685ac1dbfde07f2a"}},{"ruleId":"D15","level":"warning","message":{"text":"Repeated repair: examples/src/examples/gaussian-splatting/depth-of-field.example.mjs: examples/src/examples/gaussian-splatting/depth-of-field.example.mjs changed 3 times in last 90 days and 3 of those changes were fix/bug commits, so repair is the majority of this file\u0027s churn. Its max cyclomatic complexity is 4 (its worst body is depth-of-field.example.onFrameReady at line 170), UNDER the 15 threshold, so this is deliberately not filed as a churn \u00D7 complexity hotspot \u2014 the difficulty here is in the behaviour the file has to get right, not in its control flow, and refactoring it for complexity would be the wrong move. The repairs counted were: \u201Cfix(examples): Apply settings once the initial values are set (#9640)\u201D; \u201Cfix(examples): Restore the depth prepass in the gaussian splat depth-of-field example (#9639)\u201D; \u201Cfix: Render gaussian splat crop and depth-of-field examples without MSAA (#9634)\u201D. Each one is a case this code did not handle. Before the next change lands here, check that every one of them is pinned by a test that fails without its fix; where the same area keeps coming back, the durable fix is usually at the interface that keeps being misused rather than at the line that was last corrected. Counted over 2026-07-03..2026-10-01, the 90 days ending at the analysed commit. Reproduce with \u0060git log --since=\u00272026-07-03 15:52:16 \u002B01:00\u0027 --until=\u00272026-10-01 15:52:16 \u002B01:00\u0027 --full-history --no-merges -- examples/src/examples/gaussian-splatting/depth-of-field.example.mjs\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":"examples/src/examples/gaussian-splatting/depth-of-field.example.mjs"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"91a94e84577ab4d3151f2f2c507abfd41cd556344aeeec5f5a2e2ca3bc324809"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #1: If anonymized user #1 becomes unavailable, 148 significant file(s) lose their only recent owner: src/platform/graphics/webgpu/webgpu-graphics-device.js, src/platform/graphics/graphics-device.js, src/scene/renderer/renderer.js, src/framework/lightmapper/lightmapper.js, src/scene/gsplat-unified/gsplat-octree-instance.js, src/extras/render-passes/frame-pass-camera-frame.js, src/extras/render-passes/frame-pass-volumetric-fog.js, src/scene/gsplat-unified/gsplat-params.js (\u002B140 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ea3cd8e2ae07ef021f0c3f4c9f05c6c1d7fc5a5662889a694db205ab66f5c351"}},{"ruleId":"D16","level":"note","message":{"text":"Off-boarding risk: anonymized user #2: If anonymized user #2 becomes unavailable, 51 significant file(s) lose their only recent owner: src/framework/components/joint/component.js, src/framework/components/rigid-body/system.js, src/framework/input/element-input.js, src/framework/components/collision/component.js, src/framework/xr/xr-input-source.js, src/framework/physics/ammo/ammo-physics-world.js, src/extras/exporters/usdz-exporter.js, src/framework/physics/physics-world.js (\u002B43 more). Pair on, review, or document these before any departure."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dcf5fc5427425d644513b255764aa283479c3dc64ab0fe74265288d5c95439e3"}},{"ruleId":"D16","level":"note","message":{"text":"Further sole-owners (lower concentration): 1 other contributor(s) are each the sole owner of a small amount of code below the off-boarding threshold \u2014 folded into the bus-factor score and metrics (200 single-owned of 609 analysed files in total, counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 609 of the 1258 production source files in this repository met that bar). They are anonymized user #3 (1 file(s)) \u2014 spread or document their files in the same way, at lower priority than the named off-boarding risks above."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6eac528f2429e724e1a97ed868f79eefbcf1888dab4af9a9e673429369bb5b2f"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no project overview: The README begins with a long licensing/banner section, then links to the user manual, API reference, examples, blog, forum, and multilingual README; it does not state what the PlayCanvas Engine is or what it does. State the engine\u0027s purpose (WebGPU/WebGL2 3D game/engine) in a one-line overview above the license section."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"66dbf18d06aa983c06246108610908ba99aae6784280b3aacd1a6655733d71be"}},{"ruleId":"D19","level":"note","message":{"text":"Documentation: no contributor guidance: The README does not guide contributors on how to submit pull requests or add new docs. Add a short contributing section covering PR guidelines, documentation contribution process, and code of conduct."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"620f29787918fa3406ae55cb63eefa1b50410845435c4e47bda852816aaea084"}},{"ruleId":"D26","level":"note","message":{"text":"Projects may be oversized for their cohesion: 1 of 1 project(s) overshoot their size bounds, lowering Project Cohesion to 0.0/10. The most over is \u0060(repository root)\u0060 (244720 LoC, 851 public types across 104 directories). Review these for cohesion \u2014 draw the boundary inside the module first (group each responsibility into its own package or directory and keep the cross-boundary members non-public), since splitting a published package moves types between packages and breaks consumers."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d5a94650dc74886a0f1f08eb9fb6775f1fc395279ef7e901c970c9d26f767a72"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"574b29ef4220c98a4cc4fa5ec6643f3dc55e6fcb058d899010587e04797312c8"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"de11edd5fcad589b6567a75b75a172cffa22d37bf926fa120ccff323351a427e"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"78132e7d138d4d3de96e862805f070f26295525311506f04e89b45c6fb3be9f1"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"42634fc3cb4565c7bd77c7169490b22c0cfadedab9ac4873d72fa771d7bfc999"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"672f4f3141e30f619ab8a3e2daa1c3d5a62b78abc9fc9210f891b376c1b22235"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"92705bd7cfb9fec41ea6d5c8b5b71fa3c112639102462456995dfba9601c1924"}},{"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":"4f32e8f3fbf7570a6be9670d21e5c6b43cdac618ba5bf8a556a1c427f087797e"},"taxa":[{"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":"c49bf0b0730d3020684ac9c845363042cc513a1fb2562c65ea557d145d16e17e"},"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":"6db8af06ffdaa01051efea4cfa31f92a1393b91d3053d5948099069340a32378"},"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":"967f8cb3bb11323de3bd4a836e5ecaafba9097f6d735a86af64d7ab27ded0c3c"},"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":"69a74eda72b2c5aa06d62f0d6cda6554c53d8c9f4afdac482d6e5ece058c8c23"},"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":"0595c9531a191c321ecfff0ed183f51b507367091ac8155e0c76d1f404039283"},"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":"694ad8dfc5871d1662a25a09a338049a4061b06601968c85cf5d588a2407ab3c"},"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":"68903797aea6e463369540391648d2ff91c1e3044dd1c8a0b980977fe1bc4cf2"},"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":"a0bab6ce54afd9d93b286901514ebf931f427070d3dc185164788b132d5dcf35"},"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":"6c4e6b6d70dd8e4b092a050d1a4894dd548e7bad3242f5e81d620ebe3ef58c92"},"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":"46ae5588f395e23a0d30d061a665245acddfd0a18cb74430eb89acc25be44f08"},"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":"3af01784db21720b28ca31d087aa4609ca107fbdf1bf3957274b264bc6f939f9"},"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":"91f2516b33339f802c44d8af58a71ac80d0ee20eb379888e9f3c138c49fc1321"},"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":"cf2f8bd5f38b2c5ea36a8fd6e9fba8a7040c03866bb9626206708d004f83fce2"},"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":"1ae1b9d6640d3680b62044e80913049ac95fe4812fca727d39be6bd60f32e95b"},"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":"c5f067e943989fd039ad70411013bf082a8588b9f38464ef16f66d6f48246c7e"},"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":"de24fb5b2f9808dee7349e0f8b4bf4e8fc0b77a05b8578184e5f23b813b48863"},"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":"270db641e9fceafea09e18419fc9685c2c679a8e165bbff2e97b6a6ea0a6c76d"},"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":"4ffcc1b724469248fcd864b1901b4fb0cedf5b911fb5d6075b57cf61232c29e8"},"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":"85bd1bf30983bf65609417b13af989a2863e6231c1be9efaa43e3417fd80011c"},"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":"56d9371fb2efaf7518ba7ca36b309fcf19a4dd77b8fedb20a641b6ff91c06d3c"},"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":"3ef1d3d3ebd6d91dfe1f0dcb23bc71cfee891c3f0178b4f341b180919508d9d6"},"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":"8848ecb9b4899118cc8b8341841112d876be29e865cc3e14990aec7e928c6bbf"},"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":"9d4930353ba14e38ca861aeb61c731835e10641cc14f753d3ad5fb4fdb51c4e2"},"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":"3ee1818d8255f485c4fe9f8eec7ec14865c030222317516add1ea3f2587ac448"},"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":"cde651630fe7bac80779eb1db327e13e20420c624b0c25f531899727978eea48"},"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":"fc16fdf0e4ca3c006dcf9b77d9a081a8b34a38c11900be60f6df82ee11d0b584"},"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":"35c7f7d3d28e5ee0dabc58cd7a27927f3392f017b3898f6d6b1751c441e8abe1"},"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":"b962eafd3faf0df14ab8267775f92fa432b2670c858a297fbb3786009e64bc8b"},"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":"aa877fd9025d342851ad8ff117768feb6751f6bc8ea3c0a8db0728acaa943f7b"},"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":"d75904c8723a31ba01c02a467ad73fa22eed54ca13ff19ae4442cb79f4d82afd"},"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":"d89ff8be40979a750f71a1b1785d33a78ab956aa773c1a40e692751cfa2edca2"},"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":"bfa10bc28b7b064ba1942bac92bc929be6a677f03988c538fabc1e838a5426af"},"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":"3347fd26606dd35fdb8f2863b9f59d5953d51d33ee084f960c3b46ccce8cd5ce"},"taxa":[{"id":"CWE-807","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":"6a4a0616d727f0c02fd26d07b0676213a9f210258e266e795ca5c6a44d68dcff"},"taxa":[{"id":"CWE-214","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"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":"12189b45acd14ecfdd3f370bbd7d1279fb553823d86dc1cb40f0b856eaa2fd52"},"taxa":[{"id":"CWE-457","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":"56d7c0542bcbbd8d8c61f07327aa2080292f8d213e8f982f1a0933ffecde0a9c"},"properties":{"dependency":{"package":"brace-expansion","version":"5.0.6","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"9d861d97c9e6c69cb47d2f5bc645ecdddee4776c7500c34080ca158cbba2b714"},"properties":{"dependency":{"package":"fast-uri","version":"3.1.3","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"7b4165296a6a2af77b2ad7d2a897abf1699e27c5f768affe0ab67a471085e505"},"properties":{"dependency":{"package":"brace-expansion","version":"1.1.16","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a319f7d74e5a6f19752aee62d9f2c0d425a20aac4d22fee341b7c39113831b77"},"properties":{"dependency":{"package":"brace-expansion","version":"5.0.7","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"05593e074b8f008b7f3f0d2685956d71ea9a8ebc48c5697c59636620d100e463"},"properties":{"dependency":{"package":"brace-expansion","version":"5.0.9","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3d0e141ebd1f7bd8fa7d08c14f77e8e935a68c7abd9786f914fb47db04bfda99"},"properties":{"dependency":{"package":"markdown-it","version":"14.3.0","advisory":"[GHSA redacted]","reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"aa571a47ecd9af55f36a3364edd0ddcf29c643ee1a3b19589e5f86cf9b2dd947"},"properties":{"dependency":{"package":"@humanfs/node","version":"0.16.7","advisory":"[GHSA redacted]","reachability":{"kind":"not-imported"}}}},{"ruleId":"D30","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"364e8e23fea87bc0a355388c4fa37f8c1d07a6e22a9b8b353f6887b7a4829074"},"properties":{"dependency":{"package":"serialize-javascript","version":"7.1.1","advisory":"[GHSA redacted]","aliases":["[CVE redacted]"],"reachability":{"kind":"not-imported"}}}},{"ruleId":"D34","level":"note","message":{"text":"Orphaned files with no living knowledge: 5 of 609 analysed file(s) have no living knowledge left \u2014 their last meaningful change has decayed away, so if one breaks, no one currently understands it (counted over production source files of roughly 2,400 bytes or more, excluding vendored, generated and example/demo trees and test files identified by path convention, largest first; 609 of the 1258 production source files in this repository met that bar). None is large enough to earn a read-through of its own, so this row stands in for the per-file rows rather than raising one each \u2014 most significant first: src/framework/xr/xr-mesh-detection.js, src/framework/anim/evaluator/anim-target-value.js, src/framework/i18n/utils.js, src/scene/shader-lib/glsl/chunks/lit/frag/iridescenceDiffraction.js, src/scene/shader-lib/glsl/chunks/particle/frag/particleUpdaterStart.js. Attach the read to the next change that touches one of them: have a second person review that change, and leave behind a short comment or test recording what the file is for, so the knowledge comes back at the cost of a change you were making anyway."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"ce861fd78f6935114d3a342cb90ad25870f984e1042954fcbbe27c0e23be3658"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: webgl-graphics-device.js \u2194 quad-render-utils.js: \u0060src/platform/graphics/webgl/webgl-graphics-device.js\u0060 (context platform) and \u0060src/scene/graphics/quad-render-utils.js\u0060 (context scene) sit in DIFFERENT parts of the tree yet change together 50% of the time (8 of the 16 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 8 shared commits counted here, the most recent 3 are \u00601e0b1976\u0060 [BREAKING] Remove no longer needed drawTexture (#6886); \u0060325ece1a\u0060 Updated the way WebGPU submits command buffers for rendering (#5423); \u006088d2f92d\u0060 StencilParameters support on WebGPU (#5243) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"85f6174b71ca647e65cfb78e376c77d7ac20f07644a8939b6332f6d44740a244"}},{"ruleId":"D35","level":"error","message":{"text":"Boundary-crossing change coupling: deprecated.js \u2194 blend-state.js: \u0060src/deprecated/deprecated.js\u0060 (context deprecated) and \u0060src/platform/graphics/blend-state.js\u0060 (context platform) sit in DIFFERENT parts of the tree yet change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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 5 shared commits counted here, the most recent 3 are \u0060fdd4bc72\u0060 refactor: Move deprecated math and graphics shims (#9083); \u0060583b8fe5\u0060 Remove final WebGL1 extensions and simplify code that used them (#6336); \u0060e63821d5\u0060 Change to static members of BlendState (#5303) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/deprecated/deprecated.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e397de5a64e8b63be09f250ec0f1abf0e49dd08b3bf51e52aab21c44baa304cf"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: stdDeclaration.js \u2194 stdDeclaration.js: \u0060src/scene/shader-lib/glsl/chunks/standard/frag/stdDeclaration.js\u0060 and \u0060src/scene/shader-lib/wgsl/chunks/standard/frag/stdDeclaration.js\u0060 change together 90% of the time (9 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00607cacabe3\u0060 perf: Pass the model scale to dynamic refraction from the vertex shad\u2026; \u006061d79c09\u0060 fix: Tint the ambient lighting by a lit argument set by the front end\u2026; \u00600cd26847\u0060 Give a mesh instance lightmap its own texture slot (#9415) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/standard/frag/stdDeclaration.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ed75269fc3b9a362c06518ec7dc7f8f5f9eaf98723253d2ecb2b7168568d2c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling clique: vec2.js, vec3.js, vec4.js: 3 files \u2014 \u0060src/core/math/vec2.js\u0060, \u0060src/core/math/vec3.js\u0060, \u0060src/core/math/vec4.js\u0060 \u2014 all change together with no explicit dependency: a fully-connected co-change clique, not 3 separate couplings. They share one concern (thin parallel siblings over a common abstraction), so extract the shared part into ONE unit and the whole clique\u0027s coupling clears at once \u2014 you do not need to break each pair individually."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/math/vec2.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f075fb18d1ed15201cd2edb825ab0636d198836f438d0e6aed82b7bf1101ac6"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: gsplat-manager.js \u2192 compute-radix-sort-multipass.js, gsplat-info.js, gsplat-interval-compaction.js, gsplat-octree-instance.js, gsplat-projector.js, gsplat-unified-sort-worker.js, gsplat-work-buffer.js: \u0060src/scene/gsplat-unified/gsplat-manager.js\u0060 changes together with 7 other files \u2014 \u0060src/scene/graphics/radix-sort/compute-radix-sort-multipass.js\u0060, \u0060src/scene/gsplat-unified/gsplat-info.js\u0060, \u0060src/scene/gsplat-unified/gsplat-interval-compaction.js\u0060, \u0060src/scene/gsplat-unified/gsplat-octree-instance.js\u0060, \u0060src/scene/gsplat-unified/gsplat-projector.js\u0060, \u0060src/scene/gsplat-unified/gsplat-unified-sort-worker.js\u0060, \u0060src/scene/gsplat-unified/gsplat-work-buffer.js\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 7 separate couplings, not 7 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 7."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-manager.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8527519d9d2b008fb99bce06a82846d85d4e60967c4021803840bf41a1ead312"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: gsplatCommon.js \u2192 gsplat.js, gsplatCommon.js, gsplat.js: \u0060src/scene/shader-lib/wgsl/chunks/gsplat/vert/gsplatCommon.js\u0060 changes together with 3 other files \u2014 \u0060src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplat.js\u0060, \u0060src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplatCommon.js\u0060, \u0060src/scene/shader-lib/wgsl/chunks/gsplat/vert/gsplat.js\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/vert/gsplatCommon.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a911955d3443906094e1b24af1eb0fc7ac652b123c304acaf51efa13bbca1a07"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: constants.js \u2194 tracing.js: \u0060src/core/constants.js\u0060 and \u0060src/core/tracing.js\u0060 change together 79% of the time (11 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 11 shared commits counted here, the most recent 3 are \u0060bd285924\u0060 feat: TRACEID_BUFFERS trace, example control, and storage buffer debu\u2026; \u006051a90307\u0060 Added tracing support to log all assets in the registry (#8209); \u00609fa2a8b0\u0060 Assign categories to constants (#6012) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/constants.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dee236eb53afe1189887656f84071a9c376a14d5c8f2bd41515f32a7f62580f3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: index-buffer.js \u2194 vertex-buffer.js: \u0060src/platform/graphics/index-buffer.js\u0060 and \u0060src/platform/graphics/vertex-buffer.js\u0060 change together 78% of the time (18 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 18 shared commits counted here, the most recent 3 are \u0060f8c6b8cd\u0060 Add partial vertex and index buffer uploads (#9401); \u00602b743a65\u0060 fix: Register StorageBuffer for WebGPU device lose/restore (#8692); \u0060470e3280\u0060 Use Set instead of array for buffer tracking (#8283) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/index-buffer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a7b01ac3ab7e8c0f46267e67d0e16511e3fbc5fbefa9af4729794ad0f469a88"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: particle_cpu.js \u2194 particle_init.js: \u0060src/scene/shader-lib/glsl/chunks/particle/vert/particle_cpu.js\u0060 and \u0060src/scene/shader-lib/glsl/chunks/particle/vert/particle_init.js\u0060 change together 70% of the time (7 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060b8f6e42d\u0060 [Fix] Small changes to avoid unset uniform warnings when particle sys\u2026; \u006053ecda04\u0060 Small changes to get CPU particles to work on WebGPU (#6277) (at that commit the files were still \u0060src/scene/shader-lib/chunks/particle/vert/particle_cpu.js\u0060 and \u0060src/scene/shader-lib/chunks/particle/vert/particle_init.js\u0060); \u0060453eea9d\u0060 fx texture sampling precision to highp (#2198) (at that commit the files were still \u0060src/graphics/program-lib/chunks/particle_cpu.vert\u0060 and \u0060src/graphics/program-lib/chunks/particle_init.vert\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/particle/vert/particle_cpu.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4fe132c17c150c7a11ce4add579d5067a1e1a7f602882bdbc33b6f8ecb8b09c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: skybox.js \u2194 sky-mesh.js: \u0060src/scene/shader-lib/glsl/chunks/skybox/frag/skybox.js\u0060 and \u0060src/scene/skybox/sky-mesh.js\u0060 change together 70% of the time (7 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060c4e2dba6\u0060 fix: Restore skydome depth of field with scene-pass depth (#9391); \u006005e59b4c\u0060 Mesh-based Skydome can write depth during prepass, to be comparible w\u2026; \u006008eeea61\u0060 Adjusted syntax of variables the preprocessor uses for injection (#7386) (at that commit the file was still \u0060src/scene/shader-lib/chunks/skybox/frag/skybox.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/skybox/frag/skybox.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8dde3e387a7c5b520c01d05d56910bec594d8df4fd027719f56fced464c399e5"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: webgpu-bind-group-format.js \u2194 webgpu-bind-group.js: \u0060src/platform/graphics/webgpu/webgpu-bind-group-format.js\u0060 and \u0060src/platform/graphics/webgpu/webgpu-bind-group.js\u0060 change together 69% of the time (9 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u0060c197fafd\u0060 Restore WebGPU rendering resources after device loss (#9355); \u006076a7820e\u0060 Renamed internal \u2018descr\u2019 symbols to \u2018desc\u2019 for consistency (#6833); \u0060e97f3ff3\u0060 Renamed BindBufferFormat to BindUniformBufferFormat (#6222) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgpu/webgpu-bind-group-format.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5527f0bd8883ba81ef4df70c5faa1973125c8e33fa9b39d684c3a6c755d7c4af"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: standard-material-options-builder.js \u2192 standard-material-options.js, standard-material-parameters.js, lit-shader-options.js: \u0060src/scene/materials/standard-material-options-builder.js\u0060 changes together with 3 other files \u2014 \u0060src/scene/materials/standard-material-options.js\u0060, \u0060src/scene/materials/standard-material-parameters.js\u0060, \u0060src/scene/shader-lib/programs/lit-shader-options.js\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 3 separate couplings, not 3 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 3."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material-options-builder.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"df62f844963a43d8ac98e38342a519271015cb76e1f18f96920c2d6ba97c6598"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat-work-buffer-render-pass.js \u2194 gsplatCopyToWorkbuffer.js: \u0060src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js\u0060 and \u0060src/scene/shader-lib/glsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js\u0060 change together 62% of the time (13 of the 21 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 13 shared commits counted here, the most recent 3 are \u00602bd53d84\u0060 fix: Correct gsplat spherical harmonics with orthographic cameras (#9\u2026; \u006044cfb26a\u0060 Source geometry from work buffer for SOG spherical harmonics updates \u2026; \u00603ae33b7a\u0060 Make frustum culling always-on and remove dead pcNodeIndex pipeline (\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c673d8df4f2ef9a6bf9444a64c19e508d8007d97f0848276269fada8345720"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: shadow-renderer-directional.js \u2194 shadow-renderer-local.js: \u0060src/scene/renderer/shadow-renderer-directional.js\u0060 and \u0060src/scene/renderer/shadow-renderer-local.js\u0060 change together 62% of the time (8 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u00609cdb31ca\u0060 Move frustum compute into Camera.updateFrustum (#8981); \u0060a5b00dd5\u0060 Address PCSS softness (#5483); \u0060dcb5a012\u0060 Small internal refator to RenderPass to allow simpler override implem\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/shadow-renderer-directional.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"170f1e54b0f93d8ec8e46fb89be8fb5e960f2d42a3b7c670879734c3064d830a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: blend-state.js \u2194 webgpu-graphics-device.js: \u0060src/platform/graphics/blend-state.js\u0060 and \u0060src/platform/graphics/webgpu/webgpu-graphics-device.js\u0060 change together 60% of the time (6 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00604d15fc1c\u0060 Add independent blending for multiple render targets (#9140); \u0060bcb15734\u0060 Add dual-source blending support (#9096); \u0060583b8fe5\u0060 Remove final WebGL1 extensions and simplify code that used them (#6336) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/blend-state.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ad6391944c93928ab7d88120220f102fad6096d568176c798cb4613615d69b0"}},{"ruleId":"D35","level":"warning","message":{"text":"Change-coupling hub: forward-renderer.js \u2192 gpu-updater.js, shadow-renderer-directional.js, shadow-renderer-local.js, shadow-renderer.js, screenDepth.js: \u0060src/scene/renderer/forward-renderer.js\u0060 changes together with 5 other files \u2014 \u0060src/scene/particle-system/gpu-updater.js\u0060, \u0060src/scene/renderer/shadow-renderer-directional.js\u0060, \u0060src/scene/renderer/shadow-renderer-local.js\u0060, \u0060src/scene/renderer/shadow-renderer.js\u0060, \u0060src/scene/shader-lib/glsl/chunks/common/frag/screenDepth.js\u0060 \u2014 none of which declares a dependency on it: one file is the hub of 5 separate couplings, not 5 unrelated pairs. Read the hub first: if the others each duplicate a part of what it does, the shared concern belongs in ONE unit and extracting it clears every edge at once; if the hub is a registry, dispatcher or barrel that must name each of them, the coupling is structural and the question is whether that list can be discovered instead of enumerated. Fixing the hub is one change; breaking the couplings one pair at a time is 5."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/forward-renderer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"558c247658347a4ef311862d5b47a60b1462789eb7b11b94043c4f681743ca7c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat-work-buffer-render-pass.js \u2194 gsplatCopyToWorkbuffer.js: \u0060src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js\u0060 and \u0060src/scene/shader-lib/wgsl/chunks/gsplat/frag/gsplatCopyToWorkbuffer.js\u0060 change together 59% of the time (13 of the 22 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 13 shared commits counted here, the most recent 3 are \u00602bd53d84\u0060 fix: Correct gsplat spherical harmonics with orthographic cameras (#9\u2026; \u006044cfb26a\u0060 Source geometry from work buffer for SOG spherical harmonics updates \u2026; \u00603ae33b7a\u0060 Make frustum culling always-on and remove dead pcNodeIndex pipeline (\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2e480f383d055a424194627a6cfa5d8d5dc07b0f480a1d0f127ba6a6eee4a6a"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat-info.js \u2194 gsplat-unified-sort-worker.js: \u0060src/scene/gsplat-unified/gsplat-info.js\u0060 and \u0060src/scene/gsplat-unified/gsplat-unified-sort-worker.js\u0060 change together 58% of the time (7 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u006078d557c1\u0060 Per-node block allocation and partial work buffer updates for GSplats\u2026; \u006054218043\u0060 refactor: Switch gsplat work buffer from row-aligned to pixel-offset \u2026; \u00603314f93a\u0060 Skip padding pixels during GSplat sorting and rendering (#8471) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-info.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cf7970b4a569a2b3ecb3fbde40035390357f2a7edc71f312e6ccc80b57eb5c4"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: anim-state.js \u2194 component.js: \u0060src/framework/anim/controller/anim-state.js\u0060 and \u0060src/framework/components/anim/component.js\u0060 change together 55% of the time (6 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u0060cfbeda96\u0060 Tweaks to Anim API docs (#7520); \u0060d2418b92\u0060 [Anim Component] Fix for resetting parameters (#5392); \u0060a82e7f1f\u0060 [Anim Component] Support empty AnimTracks (#5112) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/anim/controller/anim-state.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc5bd809a8336b837fc16d9256eacaa5d61835de4311f3246a4338db0a216d3"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat.js \u2194 gsplatCommon.js: \u0060src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplat.js\u0060 and \u0060src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplatCommon.js\u0060 change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060e232ddf2\u0060 feat: Respect gsplat alphaCull on CPU raster and compute paths (#8687); \u0060d5963f25\u0060 Remove deprecated gsplatCustomizeVS shader chunk (#8422); \u0060fd561dd4\u0060 Add gsplatModifyVS shader customization chunk for gaussian splats (#8\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplat.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea47f2902ec127109630ec22e7481c704a59e2a9784bea101a7c8643e34efd7e"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat-params.js \u2194 gsplat-placement.js: \u0060src/scene/gsplat-unified/gsplat-params.js\u0060 and \u0060src/scene/gsplat-unified/gsplat-placement.js\u0060 change together 54% of the time (7 of the 13 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u006072626a18\u0060 Make gsplat LOD distance-only, with target or limit splat budgets (#9\u2026; \u0060a939ca99\u0060 Add a LOD mode and a per-splat detail falloff for streamed GSplats (#\u2026; \u0060c67179f0\u0060 refactor(gsplat)!: move lodRangeMin/lodRangeMax to GSplatComponent (#\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-params.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a508088eb9e3c14f7a1caa66904c9a263026f75aa66cd7d05d1daea031a864"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: sog-bundle.js \u2194 sog.js: \u0060src/framework/parsers/sog-bundle.js\u0060 and \u0060src/framework/parsers/sog.js\u0060 change together 53% of the time (9 of the 17 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 9 shared commits counted here, the most recent 3 are \u00602ffa84bf\u0060 Recover SOG streaming across WebGL context loss (#9350); \u0060ddfd9bbd\u0060 Fix SOG parsers throwing when a load completes after app teardown (#9\u2026; \u00606e221b3d\u0060 Fix sog streaming re-load returning destroyed textures from loader ca\u2026 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d478c3c6e42bd9cc900885cfd0cc658fa4f873d165633f6e6800294093390b1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gles3.js \u2194 webgpu.js: \u0060src/platform/graphics/shader-chunks/frag/gles3.js\u0060 and \u0060src/platform/graphics/shader-chunks/frag/webgpu.js\u0060 change together 53% of the time (10 of the 19 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060bcb15734\u0060 Add dual-source blending support (#9096); \u0060819803bb\u0060 Update to the way we strip unused MRT outputs (#7395); \u0060f8468672\u0060 Deprecate WebGL1 based texture sampling names with _EXT (#7221) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/shader-chunks/frag/gles3.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9e93180b1d3567389b46b7ca97fed9b0dcd33897e6277a5fa60402c7c35204"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: standard-material.js \u2194 lit-shader-options.js: \u0060src/scene/materials/standard-material.js\u0060 and \u0060src/scene/shader-lib/programs/lit-shader-options.js\u0060 change together 50% of the time (10 of the 20 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u0060b902fb9d\u0060 docs: Rewrite the material class overviews (#9424); \u0060c43c09ff\u0060 Publish the scene environment textures under their own uniforms (#9364); \u00607ca74274\u0060 [BREAKING] Use linear space for vertex colors in gLTF (#8122) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"508b8ef2318fa17f22d5827be07095c2402d6a07e86a61fe80eb9847fbafcae0"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: lights-buffer.js \u2194 clusteredLight.js: \u0060src/scene/lighting/lights-buffer.js\u0060 and \u0060src/scene/shader-lib/glsl/chunks/lit/frag/clusteredLight.js\u0060 change together 50% of the time (10 of the 20 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u00600f4c6037\u0060 Fix spotlight rendering issues with small cone angles in clustered li\u2026; \u00601a58b59d\u0060 [Fix] Fixed issue where clustered light color is over half-float rang\u2026 (at that commit the file was still \u0060src/scene/shader-lib/chunks/lit/frag/clusteredLight.js\u0060); \u0060575f3348\u0060 Clustered lighting optimisations - removed WebGL1 compatibility solut\u2026 (at that commit the file was still \u0060src/scene/shader-lib/chunks/lit/frag/clusteredLight.js\u0060) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/lighting/lights-buffer.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea9be3656b715fefd03e133577ee2dbd47d98bf58259891259fbdd899b31b9a7"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: compute.js \u2194 webgpu-graphics-device.js: \u0060src/platform/graphics/compute.js\u0060 and \u0060src/platform/graphics/webgpu/webgpu-graphics-device.js\u0060 change together 50% of the time (6 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency \u2014 the edge is real but nothing declares it. Read the pair before acting: if one registers itself into the other through a hook or an initialiser, the missing dependency is DELIBERATE \u2014 the registration is the link, and it is meant not to be an import \u2014 and the thing to add is a comment on each side naming the other, not a merge; if they simply belong together, co-locate them; if neither holds, the coupling is hidden and worth breaking. You can check this without leaving the row: of the 6 shared commits counted here, the most recent 3 are \u00606d3f7fc7\u0060 Fix WebGPU recovery for compute, readback and generated data (#9358); \u00602afdf36f\u0060 Add indirect compute dispatch support for WebGPU (#8332); \u0060464ffdbf\u0060 Compute shader JSDocs \u002B small API changes (#6258) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/compute.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b9fbed1c7643c7759a1d4f45b8274350679c86f8ab3e0258f8860e98e5c4f9c"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: gsplat-params.js \u2194 gsplat-quad-renderer.js: \u0060src/scene/gsplat-unified/gsplat-params.js\u0060 and \u0060src/scene/gsplat-unified/gsplat-quad-renderer.js\u0060 change together 50% of the time (5 of the 10 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well, and counted over this repository\u0027s 10,000 most recent commits rather than its whole history \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) with no explicit dependency between them. They sit in the same directory, but in this ecosystem each file is its own module \u2014 a sibling reference still needs an import \u2014 so the missing import edge is real: the coupling runs through shared behaviour, not a declared dependency. If they duplicate structure, extract the common part into one unit; otherwise the coupling is hidden and worth breaking. You can check this without leaving the row: of the 5 shared commits counted here, the most recent 3 are \u0060512c92cf\u0060 Add scene.gsplat.useTonemap to opt splats out of tonemapping and expo\u2026; \u0060c50c292d\u0060 refactor: move material preparation behind update version (#9102); \u00601a1b2c49\u0060 Add fog support for Gaussian splat rendering (#8583) \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-params.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"242eb556e6f5491061c827512a982737be7d906a6bb4cfd619bc2815c718c50e"}},{"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":"0e17f71490e4d120a48b2b2881ab866c93b272bef2febb673a3e8e42b2c288ab"}},{"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":"329f0ef4132322722fbf83ac33f5bb7ad638ed99d037a66c3aa244b1e2ee654e"}},{"ruleId":"D44","level":"warning","message":{"text":"End-of-life runtime: Node.js 18: .nvmrc declares Node.js 18 as this project\u0027s version file, and Node.js 18, support ended 2025-04-30. An unsupported runtime receives no security patches, so every vulnerability disclosed in it since 2025-04-30 is present and unfixable without moving off it. This is a migration rather than an upgrade: there is no newer release of a runtime that has ended."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"f6648803ca1184d1b831cc0935c1131320f0ac2f71c390fad75199d5bf2e7db6"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add CodeQL\u0027s javascript-typescript pack, \u0060semgrep --config=p/javascript\u0060, or eslint-plugin-security as a CI step. What was searched, so you can tell an absence from a miss: the 23202 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P4","level":"note","message":{"text":"No release approval gate: The release is automated and no gate that pauses it for a human is DECLARED IN THIS REPOSITORY\u0027S PIPELINE FILES. What was read: every file under \u0060.github/workflows/\u0060, \u0060.forgejo/workflows/\u0060, \u0060.gitea/workflows/\u0060, \u0060.azuredevops/\u0060 and \u0060.azure-pipelines/\u0060, plus \u0060.gitlab-ci*\u0060 and \u0060azure-pipelines*\u0060 \u2014 with comment text stripped, so documenting a gate is not declaring one. What would have counted: GitLab\u0027s \u0060when: manual\u0060, CircleCI\u0027s \u0060type: approval\u0060, an Azure \u0060ManualValidation@\u0060 task or an \u0060approvals:\u0060 block, a Jenkins \u0060input\u0060 step, a \u0060uses:\u0060 step naming an approval action, an \u0060environment:\u0060 paired with \u0060reviewers\u0060 / \u0060required_reviewers\u0060 / \u0060protection\u0060 / \u0060wait-timer\u0060 / \u0060deployment_branch_policy\u0060, a draft-release step, a \u0060workflow_dispatch\u0060 promotion, or a release-event gate. \u2605 What this cannot see, because none of it is a file: a GitHub environment whose required reviewers are configured in repo SETTINGS, a branch protection rule, or an organisation deployment policy \u2014 all of them real, enforced gates that live outside the repository. If yours is one of those, this row is wrong and nothing in the tree could have told us. Otherwise: whatever the release trigger points at is published to users unreviewed, so a mistagged or unverified commit ships and the only remedy is a follow-up release."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6c11e2dbd483b4b423b95ac61bfcc7af1d55351b28a20d2b1105b31cfe38cc60"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060takeThumbnails\u0060 is async and calls readFileSync, unlinkSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/utils/thumbnails.mjs"},"region":{"startLine":144}}}],"partialFingerprints":{"codehealthFindingId/v1":"e456111fca98f20895d4024dda3d9caae659302d724a4ccfd48af29fc51f2f1d"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060takeScreenshots\u0060 is async and calls rmSync, existsSync, mkdirSync \u2014 a blocking call inside async code stalls the event loop \u2014 every other request waits for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/utils/thumbnails.mjs"},"region":{"startLine":201}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f581f3e033c65671dd296baab76a5a17fe206e24229f407c20b2c65fc588fcc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 6 sibling directories (67 clone groups): 67 duplicated blocks under src/ have copies in at least two of the sibling directories core, deprecated, extras, framework, platform, scene \u2014 22 of them are reported below, and 45 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 67 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 67 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 67 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/gsplat/component.js"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7619708069058bd97ec178cca024a1926a5077347c87844688f9a62749ba868"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 23 sibling directories (64 clone groups): 64 duplicated blocks under src/framework/components/ have copies in at least two of the sibling directories anim, animation, audio-listener, button, camera, collision (\u002B17 more sibling(s) not listed) \u2014 49 of them are reported below, and 15 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 64 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 64 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 64 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/model/component.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"de06b4851fdb9de8bc2cfe165bb69fcf9c5cf3233560893cf23c9c89d78c2801"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 2 sibling directories (34 clone groups): 34 duplicated blocks under the repository root have copies in at least two of the sibling directories scripts, src \u2014 14 of them are reported below, and 20 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 34 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 34 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 34 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/parsers/obj-model.mjs"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d6bcb6ada48bc3a0620f39624c9ac57f6c94d92dcdd5885c7e038d207c1cd3f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 11 sibling directories (18 clone groups): 18 duplicated blocks under src/scene/ have copies in at least two of the sibling directories composition, geometry, graphics, gsplat, gsplat-unified, lighting (\u002B5 more sibling(s) not listed) \u2014 9 of them are reported below, and 9 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 18 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 18 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 18 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-params.js"},"region":{"startLine":936}}}],"partialFingerprints":{"codehealthFindingId/v1":"2218524fb77973b2c6fc81e3acc78a7a94e5b81f28af871e45f2268e51a8dc98"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 9 sibling directories (10 clone groups): 10 duplicated blocks under src/framework/ have copies in at least two of the sibling directories anim, asset, components, gsplat, handlers, i18n (\u002B3 more sibling(s) not listed) \u2014 6 of them are reported below, and 4 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 10 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 10 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 10 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/anim/evaluator/anim-target.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"12da2cd5b0a5e156c1c1fbf3e35b221ab780e3d62a0e548125108293f21775c4"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplication concentrated across 3 sibling directories (6 clone groups): 6 duplicated blocks under src/platform/graphics/ have copies in at least two of the sibling directories null, webgl, webgpu \u2014 4 of them are reported below, and 2 are counted here but not reported individually: those copies match on shape but no longer clear R10\u0027s bar for an individually reported row \u2014 either they kept neither their own names nor their values, or what was copied is too small to stand on its own (it reports near-exact duplication only, and only of substantial extent). What this row states is the concentration, which the detector measured over all 6 and which does not depend on how exactly each block\u0027s copies still match. That concentration is one structural fact, not 6 local ones: the siblings replicate behaviour none of them owns, which is the shape of a missing shared module \u2014 a common library every sibling imports \u2014 rather than 6 separate extractions. Check first whether the siblings are deliberately standalone deliverables (scaffold templates, demo apps that must stay copy-pasteable); where they are, the duplication is the design and the per-block rows are the ones to act on."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-xr-bridge.js"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"73019119fb11862d1d3f6718418fd0be7fe15485665df22e0aaad8c32bc8c153"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (270 matched lines \u00D7 2 locations): src/extras/gizmo/scale-gizmo.js:17 \u00B7 src/extras/gizmo/translate-gizmo.js:17 \u2014 the two spans are one implementation copied and then locally edited \u2014 2012 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/scale-gizmo.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"eda8c32d2793b9fba830ec17a3c25f9bb5c57dea56c2c93951bf310e503f1cf3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (243 matched lines \u00D7 2 locations): src/framework/components/model/component.js:158 \u00B7 src/framework/components/render/component.js:196 \u2014 the two spans are one implementation copied and then locally edited \u2014 1528 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/model/component.js"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b923ffc2b44916d0f3306029acc649cb11e0b0b476684d883efb8d40cea32e9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (216 matched lines \u00D7 2 locations): scripts/esm/first-person-controller.mjs:24 \u00B7 scripts/esm/third-person-controller.mjs:24 \u2014 the two spans are one implementation copied and then locally edited \u2014 1839 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/first-person-controller.mjs"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e8723f072677c5c85b9c6863f09f258fd21136835487a08e2ddbf67cfa1619c"}},{"ruleId":"R10","level":"warning","message":{"text":"Wholesale file copy (164 identical lines \u00D7 2 files): src/scene/shader-lib/glsl/collections/shader-chunks-glsl.js:1 \u00B7 src/scene/shader-lib/wgsl/collections/shader-chunks-wgsl.js:1 \u2014 these 2 files are line-for-line copies of one another \u2014 164 lines are identical, in the same order, in every one of them \u2014 so this is one fact about the file set, not a block to extract. An edit made to one file and not the others changes behaviour silently, which is the failure a wholesale copy guarantees. Pick one file as the single source and derive the others from it (re-export it, spread it into the local overrides each variant genuinely needs, or generate the copies at build time) \u2014 the few lines that differ between the files are exactly the part each variant should still own. Check first whether the copies are deliberately standalone deliverables (a translation file seeded from its sibling and waiting to be translated); where they are, the duplication is the design, and the honest move is to mark the seeded file as untranslated rather than to let it pass as done."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/collections/shader-chunks-glsl.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e07759167de54e049933d1df439a3da49e8be68bcedc341294d4eff60ac6ee36"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (136 matched lines \u00D7 2 locations): src/core/math/vec3.js:108 \u00B7 src/core/math/vec4.js:111 \u2014 the two spans are one implementation copied and then locally edited \u2014 1178 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/math/vec3.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca9564c08de3cf9e9ab266b0322d679dc5f507fc8dc80b8bd210c225d4e4261d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (108 matched lines \u00D7 2 locations): scripts/esm/gsplat/gsplat-image.mjs:32 \u00B7 scripts/esm/gsplat/gsplat-text.mjs:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 779 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/gsplat/gsplat-image.mjs"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f725b76733defc0f692392597a4acefa8d40ae99a42e489bcbf803d3a9b6f8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (88 matched lines \u00D7 2 locations): src/extras/gizmo/shape/arrow-shape.js:13 \u00B7 src/extras/gizmo/shape/boxline-shape.js:13 \u2014 the two spans are one implementation copied and then locally edited \u2014 662 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/shape/arrow-shape.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"65486832fbf6be014df4d45884e183ac350cc85fc03cc0629180c11a9ea9feab"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (85 matched lines \u00D7 2 locations): src/platform/graphics/webgl/webgl-texture.js:535 \u00B7 src/platform/graphics/webgl/webgl-texture.js:724 \u2014 the two spans are one implementation copied and then locally edited \u2014 412 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":535}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba99363484f90dedfd67a72c9417452b00e88769ee483891284a8cfc4e2d28e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (83 matched lines \u00D7 2 locations): src/framework/parsers/sog-bundle.js:141 \u00B7 src/framework/parsers/sog.js:81 \u2014 the two spans are one implementation copied and then locally edited \u2014 531 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/sog-bundle.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ddd488e03a16ce6e2edc1b291d4d31065d14301329af91661d95af26882b510"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (67 matched lines \u00D7 2 locations): src/scene/gsplat-unified/gsplat-hybrid-renderer.js:118 \u00B7 src/scene/gsplat-unified/gsplat-quad-renderer.js:32 \u2014 the two spans are one implementation copied and then locally edited \u2014 383 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-hybrid-renderer.js"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"93e2fbe292c0597afc067482ff5a346eab866796d9839b535888b14d4786d634"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (66 matched lines \u00D7 2 locations): src/scene/light.js:492 \u00B7 src/scene/light.js:711 \u2014 the two spans are one implementation copied and then locally edited \u2014 280 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/light.js"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4aff37154bf555bb3ff1db4cd79a99d337bd63730172bb57837b07af0a6858"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (61 lines \u00D7 2 locations): src/framework/components/button/system.js:23 \u00B7 src/framework/components/scroll-view/system.js:27 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/button/system.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfeb79a922e2dea0c7e51d34bf3023252af6b764a823140e54feebe38fe19229"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (60 matched lines \u00D7 2 locations): src/extras/input/sources/dual-gesture-source.js:165 \u00B7 src/extras/input/sources/single-gesture-source.js:126 \u2014 the two spans are one implementation copied and then locally edited \u2014 395 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/dual-gesture-source.js"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"f86b2574dab33adc7d247c621363c69312bb248e12043571ac4b04eeffaad27d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (57 matched lines \u00D7 2 locations): src/framework/components/rigid-body/component.js:205 \u00B7 src/framework/components/rigid-body/component.js:403 \u2014 the two spans are one implementation copied and then locally edited \u2014 283 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/rigid-body/component.js"},"region":{"startLine":205}}}],"partialFingerprints":{"codehealthFindingId/v1":"047a90861aa4e375d0e02cb017459dc5182d9fb60ec1e082760d0cb6f8c3603e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (54 matched lines \u00D7 2 locations): src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js:453 \u00B7 src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js:576 \u2014 the two spans are one implementation copied and then locally edited \u2014 480 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3275137802fdccabe2c79fd256ff0ef1cef91f6b93a6bbc2b310cd1c61afb38"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (53 matched lines \u00D7 2 locations): src/framework/components/element/image-element.js:1042 \u00B7 src/framework/components/element/image-element.js:1204 \u2014 the two spans are one implementation copied and then locally edited \u2014 324 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/image-element.js"},"region":{"startLine":1042}}}],"partialFingerprints":{"codehealthFindingId/v1":"1bf92650283e58f9577567f569a4e0271c0c618746aac9a94614b38e0ad27963"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (52 lines \u00D7 2 locations): scripts/posteffects/posteffect-brightnesscontrast.js:37 \u00B7 scripts/posteffects/posteffect-huesaturation.js:49 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/posteffects/posteffect-brightnesscontrast.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"bb7d13fb37d2da2d2a01995ae3062337f572f58e74100ed22eb32ea465afaa33"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (49 matched lines \u00D7 2 locations): src/core/math/quat.js:36 \u00B7 src/core/math/vec4.js:25 \u2014 the two spans are one implementation copied and then locally edited \u2014 347 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/math/quat.js"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"0754b0a1dc791ba84c05ae8ad1397c2da1e1d4c7bd82812e94333a8456f72323"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (48 lines \u00D7 2 locations): src/platform/graphics/index-buffer.js:98 \u00B7 src/platform/graphics/vertex-buffer.js:102 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/index-buffer.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2645bc8f391d62f4e1c7840473ed6f79d2c71aa4517f51541b41c476bc152fb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (47 matched lines \u00D7 2 locations): scripts/spine/playcanvas-spine.3.8.js:523 \u00B7 scripts/spine/playcanvas-spine.3.8.js:1106 \u2014 the two spans are one implementation copied and then locally edited \u2014 423 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":523}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ccecc63e233a71849a06527f766177b2cbfdb448f18a30ef9c06a468048498f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (45 matched lines \u00D7 2 locations): src/scene/gsplat-unified/gsplat-interval-compaction.js:150 \u00B7 src/scene/gsplat-unified/gsplat-projector.js:237 \u2014 the two spans are one implementation copied and then locally edited \u2014 267 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/gsplat-unified/gsplat-interval-compaction.js"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ecde8ec764e626aa9ba09062642fe459b5d9556b15045887edc9ba1df5f81c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (44 matched lines \u00D7 2 locations): src/scene/graphics/radix-sort/compute-radix-sort-multipass.js:20 \u00B7 src/scene/graphics/radix-sort/compute-radix-sort-onesweep.js:20 \u2014 the two spans are one implementation copied and then locally edited \u2014 298 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/graphics/radix-sort/compute-radix-sort-multipass.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"09cd5894b2150d0d4604327d6b80d7d968ffa740366b16c122d50f3cc89dc2ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2 locations): scripts/posteffects/posteffect-horizontaltiltshift.js:42 \u00B7 scripts/posteffects/posteffect-verticaltiltshift.js:42 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/posteffects/posteffect-horizontaltiltshift.js"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbdbd37a0939cd0c4d29ba177b0d5a3844e19037c6e323536ab6328903090ddd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (43 lines \u00D7 2 locations): src/scene/shader-lib/glsl/collections/particle-chunks-glsl.js:43 \u00B7 src/scene/shader-lib/wgsl/collections/particle-chunks-wgsl.js:43 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is a run of DECLARATIONS inside a construct \u2014 the members of a type, or the entries of an object or array literal \u2014 with no statement anywhere in it. Do not read this as an extract-a-helper row: nothing here executes, so there is no call site, and a call expression cannot stand where a member declaration or a literal\u0027s entry was. What repeats is a SHAPE, and which shape decides the move. Where the copies declare the same members, the repetition is a missing common ancestor: give it a base type, an interface both extend, a generic instantiated twice, or \u2014 where the copies are a literal\u0027s entries rather than a type\u0027s members \u2014 one shared constant each site spreads or refers to, so the set is written once. Where they declare DIFFERENT members and only the form is shared \u2014 a decorator and its options, an annotation, a registration table\u0027s keys \u2014 the form is prescribed by a framework or a schema rather than copied, and the only collapse available is to generate the declarations from that schema; where you do not own the generator, this is the cost of the framework and there is nothing to extract. Check which of the two it is before acting: these copies still drift apart the first time only one of them is edited, which is why the repetition is reported, but the sentence to act on is not the same in both cases."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/collections/particle-chunks-glsl.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3094532021bc7bbfb830e26561fba362bb80104e4dd9c8889bf9f5e9a9aebf5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (42 matched lines \u00D7 2 locations): scripts/posteffects/posteffect-blend.js:46 \u00B7 scripts/posteffects/posteffect-outline.js:74 \u2014 the two spans are one implementation copied and then locally edited \u2014 298 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/posteffects/posteffect-blend.js"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5ef3802e371e3ada6dafa35ca477a37deca9930a9c5f2a1585911e5258f88af"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (42 lines \u00D7 2 locations): src/framework/components/model/system.js:32 \u00B7 src/framework/components/render/system.js:33 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/model/system.js"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"c743eba0a490865ba487e4f7f4e2ad769e09391f342d1b3a4bb7e7c510f2c61b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (40 lines \u00D7 2 locations): scripts/spine/playcanvas-spine.3.8.js:6444 \u00B7 scripts/spine/playcanvas-spine.3.8.js:6512 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":6444}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0e55ebeea6e7f8d0341a493e004b1b158833c6820f60a47caff4f3ba8726e4e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): src/extras/render-passes/frame-pass-volumetric-fog.js:199 \u00B7 src/extras/render-passes/frame-pass-volumetric-fog.js:495 \u2014 the two spans are one implementation copied and then locally edited \u2014 355 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/frame-pass-volumetric-fog.js"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff4d7c0518761a00c5400e9ac574a45ef200da7d2c1eae1fd2dd40ff419eb547"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): src/framework/handlers/basis-worker.js:218 \u00B7 src/framework/handlers/basis-worker.js:316 \u2014 the two spans are one implementation copied and then locally edited \u2014 252 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/handlers/basis-worker.js"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"0871a1888724fc4f9fa501cc28104142febf649150d11d1167a5948cd26ea18f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (39 matched lines \u00D7 2 locations): src/framework/xr/xr-mesh-detection.js:28 \u00B7 src/framework/xr/xr-plane-detection.js:28 \u2014 the two spans are one implementation copied and then locally edited \u2014 239 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/xr/xr-mesh-detection.js"},"region":{"startLine":28}}}],"partialFingerprints":{"codehealthFindingId/v1":"f640bd711e00daba5948da2bc4d8b93a0cf6f13c6acb37c6a3db5e7693ffb3dd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (38 matched lines \u00D7 2 locations): src/extras/input/sources/dual-gesture-source.js:88 \u00B7 src/extras/input/sources/single-gesture-source.js:54 \u2014 the two spans are one implementation copied and then locally edited \u2014 239 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/input/sources/dual-gesture-source.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc3f57e4d27979ecd1a1e87fa52165615bf7f87ff255dd630e3001627b7b7815"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (37 lines \u00D7 2 locations): scripts/esm/gsplat/reveal-grid-eruption.mjs:339 \u00B7 scripts/esm/gsplat/reveal-rain.mjs:385 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/esm/gsplat/reveal-grid-eruption.mjs"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb50629acfc61899a2eee60ed8c0b93821a107a81d797320a5baf9025ed9b40b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (37 matched lines \u00D7 2 locations): src/framework/anim/controller/anim-blend-tree-2d-cartesian.js:17 \u00B7 src/framework/anim/controller/anim-blend-tree-2d-directional.js:16 \u2014 the two spans are one implementation copied and then locally edited \u2014 331 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/anim/controller/anim-blend-tree-2d-cartesian.js"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4bec0a0e782885c1b5c7f3b0540b982af551bf469229e976a7d7c59cfda1602"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2 locations): src/platform/graphics/webgl/webgl-graphics-device.js:501 \u00B7 src/platform/graphics/webgl/webgl-graphics-device.js:610 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-graphics-device.js"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5ec20ba5a10d6f9d545e86210ad7a8969c1f17744734856258209332c2ce4ef"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function initializeComponentData (cyclomatic 84, cognitive 128): initializeComponentData has cyclomatic complexity 84 and cognitive complexity 128; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/system.js"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad8a1e7fc15e18bdabbd4ab466be901c006e0cb9a80aca7162432c63ce2d75c1"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _updateMeshes (cyclomatic 79, cognitive 212): _updateMeshes has cyclomatic complexity 79 and cognitive complexity 212; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/text-element.js"},"region":{"startLine":863}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c6c4bf34ae8f1250cac69f55b4ae0a4b35f50c9d9fc5a1c0c6553f28f88898"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function initialize (cyclomatic 76, cognitive 4): initialize has cyclomatic complexity 76 and cognitive complexity 4; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3aa3a1f79a34e2cff4b66e7a0084dc8e561326f087f6e97682e3871b1ee7878"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function upload (cyclomatic 74, cognitive 197): upload has cyclomatic complexity 74 and cognitive complexity 197; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/webgl/webgl-texture.js"},"region":{"startLine":476}}}],"partialFingerprints":{"codehealthFindingId/v1":"72411d8c364563e6bd98b644993912b162c32aabcbf7f2f051533581d0d087af"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function readAnimation (cyclomatic 73, cognitive 244): readAnimation has cyclomatic complexity 73 and cognitive complexity 244; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":5628}}}],"partialFingerprints":{"codehealthFindingId/v1":"45356ea83b3f211bf769591768a150e31e8fc5b35c23d9e15048c956b1b99ff9"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function constructor (cyclomatic 69, cognitive 80): constructor has cyclomatic complexity 69 and cognitive complexity 80; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/render-target.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ff3b130ea1a33a745ee1a187f168abb66ada7c88a5718b86c69111d49dc39fc"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function readAnimation (cyclomatic 67, cognitive 207): readAnimation has cyclomatic complexity 67 and cognitive complexity 207; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":4306}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f39ffea57c1d2a348822044c51d4bcec981cb0097b3390d4a20f15571836f4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function readSkeletonData (cyclomatic 61, cognitive 163): readSkeletonData has cyclomatic complexity 61 and cognitive complexity 163; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":5279}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f276a917d57d5530bb724629ee8bd6535488d8ac68129cc07105500825fef53"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _updateText (cyclomatic 58, cognitive 123): _updateText has cyclomatic complexity 58 and cognitive complexity 123; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/components/element/text-element.js"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d12914f52c2825f185c056e819d6ebf0a71ad6583d6314eb78fbd7de04676f4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function writeStandardMaterial (cyclomatic 57, cognitive 79): writeStandardMaterial has cyclomatic complexity 57 and cognitive complexity 79; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/exporters/gltf-exporter.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb2c5156d7674c0e8f4927e2bbd45252ec902676c47e298374abe1988aead62b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function rawToValue (cyclomatic 56, cognitive 106): rawToValue has cyclomatic complexity 56 and cognitive complexity 106; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/script/script-attributes.js"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e9ddff6e3213cd49fb58ddb245d5ada8c86ddee6772adadbabe623a74aeaec7"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function cullShadowCastersOmni (cyclomatic 55, cognitive 54): cullShadowCastersOmni has cyclomatic complexity 55 and cognitive complexity 54; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/renderer/shadow-renderer.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"844861652022440c44822511e08b47d470de461886969657d290196ff52b46b0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 50, cognitive 47): (anonymous) has cyclomatic complexity 50 and cognitive complexity 47; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d621320f306764dcbb221bd26c6ebdbbd22dd558682a50063dfd2f5dd7bc0b"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function apply (cyclomatic 46, cognitive 131): apply has cyclomatic complexity 46 and cognitive complexity 131; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":733}}}],"partialFingerprints":{"codehealthFindingId/v1":"066a771918d1fa3bec5d78cb1088016d96a223234ceae4fb6084c8b425548bf0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _preprocess (cyclomatic 45, cognitive 113): _preprocess has cyclomatic complexity 45 and cognitive complexity 113; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/core/preprocessor.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a35cd85cda8c013839fefab63cc443c0da27f3dc0a778584756433bcb6dce44"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function update (cyclomatic 45, cognitive 105): update has cyclomatic complexity 45 and cognitive complexity 105; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/particle-system/cpu-updater.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd9b23d58603daa33181abd16ad106facbebeba22e4fdb0afe8e7f57f818951"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function _validateCopy (cyclomatic 45, cognitive 30): _validateCopy has cyclomatic complexity 45 and cognitive complexity 30; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/texture.js"},"region":{"startLine":1482}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d285cf4fe43120534bb4018e67df3350c3378541e6767ec5bf71224cb8a1ef3"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function validate (cyclomatic 43, cognitive 94): validate has cyclomatic complexity 43 and cognitive complexity 94; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/materials/standard-material-validator.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2ed4752a56a512d0f0aef6b22d116b3892dd089580fcfd9e0045555f3326787"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function constructor (cyclomatic 43, cognitive 44): constructor has cyclomatic complexity 43 and cognitive complexity 44; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/platform/graphics/texture.js"},"region":{"startLine":294}}}],"partialFingerprints":{"codehealthFindingId/v1":"a00655c7abd92b31862ccc43565eb15322a2e2aba1f1c782a9c865b118e99c3d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function frameUpdate (cyclomatic 42, cognitive 86): frameUpdate has cyclomatic complexity 42 and cognitive complexity 86; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/render-passes/render-pass-compose.js"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"c985b09416247bab0586044c3c72d682bcca719e76a5a70951393dcce3c20240"}},{"ruleId":"R3","level":"warning","message":{"text":"Large Files: 131 file(s) over 400 lines (counted as significant lines \u2014 blank lines excluded \u2014 over production source only, tests excluded), largest first: src/platform/graphics/webgl/webgl-graphics-device.js (2795), src/framework/components/element/component.js (2584), src/scene/materials/standard-material.js (2204), src/platform/graphics/constants.js (2165), src/framework/components/particle-system/component.js (2096), src/framework/components/element/text-element.js (1986) (\u002B125 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"cecee31b569df4f07e06db732f1ca037af27b5afef9023da51f9673d931a142f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/esbuild-build-target.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"33386b26d5f4b2d3e23c810cfb37294d2bca0bca4fb61e6bc7d7d4ba96a091fb"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"build.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"859803e126b2f4f905df76819111834aae9dd1fa677e13543446e45a7909e67c"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/plugins/rollup-types-fixup.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20e4b97815251a06342ee92134741fecac5669715a9d9584655dcd52fe6614d1"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/types-build-target.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"86cc4ed4aa8ab44b84cb99a92352641c933b8aab2b2ca4074d3220541dffa472"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/plugins/esbuild-transform-pipeline.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c47e3ac86c3c99151ca520bf6d2373db3a75590e25cfa631b89c8f83ab49b5f"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/api-surface.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9aaf64e6528c6d0bba1a5626d689247b400e4c5e03a33ebc0804f8ac0dd92d22"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/plugins/esbuild-import-validation.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6a3011571b511fbc7e499a72855701ee6db339014e2cea70d4bba537454848d"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/rollup-version-revision.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c5540e9b1ed9b7b86de8e3173f119352fce1baf8b2af3f56082f3997293a5fb"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/plugins/esbuild-strip.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0ec6f741b8fd0b1135e5dd304707ebd2b1de1c1f48867ba892435a7c0cead28"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/build-size.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"57bee62bdffa7b7adc32873424f3d0c6d4ea2942d9c60a8aaca681e211e340b1"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/rollup-get-banner.mjs"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0083afc5a3800e9602d40ece73733bfb5d81b62bd017a0d3d62c680cfa6d3afa"}},{"ruleId":"R4","level":"warning","message":{"text":"No test reaches this file: No test imports this module directly or transitively. Import reachability cannot see a test that executes a file by path instead of importing it, nor one that drives it through a running browser by navigating to a URL \u2014 if neither does, no test reaches this one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/lit/vert/viewNormal.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d1f056efab3682ce77bb853f4f95e25d734dec6250b4ce4d60563d31b7d15e0"}},{"ruleId":"R7","level":"warning","message":{"text":"Dead file (~10 LoC): no import path from any entry point (117 application, 7 tooling, 296 test roots considered), and no other file in the scanned tree imports it \u2014 nothing in-repo names this module at all, which is the strongest form of this claim the import graph can make"},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/glsl/chunks/lit/vert/viewNormal.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbcc9cf03b2d52dba80d955b2e04875a987bbaa881c4c8e8546bf1b3742adf8f"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027COLOR_YELLOW\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/extras/gizmo/color.js"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f77526eb1b30b98004c86c6a0dbe35b634d42fbc67e6470892456136c6c864"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-interval-cull.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4eade258ed8b9ecb6f69b422e8d5a11d5097d613cf8e35b87bf87fc801c7d50"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-interval-scatter.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"2bdbb7e627f02023e11f30b7e8937061a895292dd1428231baa09f4875b28aad"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-project-common.js"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0149510ec6db3ae70132ed01be06402ed1e3dcd5c6eedac4194486e6555c0bb"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-projector-write-indirect-args.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"9b9865be66bc586223019522a8c2ef3353f1b48728b62608a624912bbce769f0"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-projector.js"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9d6b337750aad1ca84ded134f8253e7035c5cae1a17aff4a5095f3c09e430a4"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-shadow-cull.js"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5c8fde33cbdbb5443d7586cdf725030389b94892a6fd33510baad0d9623f272"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-shadow-indirect-args.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d39f3dbb9eae42bb12468c0f962f4db3ed2c3eb244721fe787e883226208ad7"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/gsplat/compute-gsplat-write-indirect-args.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"60c0f0179441191b186cad021be682f5d18cc156e9c069eae0f7cbbb0bdbddef"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/compute-prefix-sum.js"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcec5faf070d2b808e45e7266f5cb18e6a288003ffea92a8dead12ab4b6dac9a"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/compute-radix-sort-4bit.js"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"99d0f441c75d93063cb86f03597b82dc2a5f69058fdc98dc6cbccb3d5ee20093"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/compute-radix-sort-reorder.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"792ebd770367bda11e305442584533c423de849fe8f727e701c62911805c90fd"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/onesweep-binning.js"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"edaaf253c1578587fa8eabfbd4bdf6990ba2882d8f9a054cdaa23663037bb8a3"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/onesweep-global-hist.js"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"26cdc4405d92b79e4ddc89f76583eb9a205b4e3677f77bfeada075b9285867a6"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027default\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/scene/shader-lib/wgsl/chunks/radix-sort/onesweep-scan.js"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d25d10f7b3bf053a482b398010216fb2dbe8c3183bfc1b02d842f6691bc9ce0"}},{"ruleId":"R7","level":"note","message":{"text":"Unused export \u0027typesFixup\u0027: Nothing imports this binding \u2014 it is safe to review for removal."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"utils/plugins/rollup-types-fixup.mjs"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"263f1852b42d4e821c9619c022676db9a59fe367827012bd2f3ff0864763e484"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(typeof self !== \u0027undefined\u0027 \u0026\u0026 self) || (require(\u0027node:worker_threads\u0027).parentPort)\u0060 appears character-identically in 3 files \u2014 src/framework/parsers/draco-worker.js, src/scene/gsplat-unified/gsplat-unified-sort-worker.js, src/scene/gsplat/gsplat-sort-worker.js. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/framework/parsers/draco-worker.js"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"c46f58847b5817616360e2a99332373971ad640d70a12eedbff2aa23d331c740"}},{"ruleId":"X29","level":"warning","message":{"text":"Per-element action decided by a fixed element: This loop runs once per element of \u0060timelineMode\u0060, and the statement it guards acts on the element it is on \u2014 \u0060timelineMode[i]\u0060. The test deciding whether that statement runs does not: \u0060to == null || timeline instanceof spine.AttachmentTimeline || timeline instan...\u0060 reads \u0060timelineMode[ii]\u0060, a subscript that does not move, so whatever it answers for that one element it answers for ALL of them. One \u0060if\u0060 names the same collection at two different subscripts \u2014 the fixed one at line 1418, which is the contradiction: either the test was meant to be per-element, in which case every element that differs from the fixed one is handled wrongly and all in the same direction, or it really is one answer for the whole collection, in which case it is being re-asked on every pass and belongs above the loop. The \u0060if\u0060 is in the wrong place under both readings. Give the test the loop variable, or hoist it out."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"scripts/spine/playcanvas-spine.3.8.js"},"region":{"startLine":1808}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cc45f5d5fb9cf61085f90238daa353a54261fd4accd8238234910a6f8d14632"}},{"ruleId":"X7","level":"note","message":{"text":"Silent fallback default in catch: \u0060fontPages\u0060 swallows every exception into \u0060return []\u0060 \u2014 a data error becomes a silent behavior change with no trail. Log the failure or let it raise. If that constant is the correct answer rather than a stand-in for a value that could not be read, say so in a comment on the handler or in the docstring, and the row stops firing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"examples/src/app/download-project.mjs"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb9917b32974c0eff59beaa1ffda2d432b182ab788f4af345dd8a2583b467564"}}],"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-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-214","guid":"b10ad120-fb22-1351-9348-aa23b453e815","name":"CWE-214","shortDescription":{"text":"CWE-214"},"helpUri":"https://cwe.mitre.org/data/definitions/214.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-457","guid":"b62874fe-6222-8b5b-8ade-9527ad1cbb4a","name":"CWE-457","shortDescription":{"text":"CWE-457"},"helpUri":"https://cwe.mitre.org/data/definitions/457.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-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-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-807","guid":"7b9d7bab-2171-935b-9279-889089164770","name":"CWE-807","shortDescription":{"text":"CWE-807"},"helpUri":"https://cwe.mitre.org/data/definitions/807.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":54,"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."]}]}